# db-script-templates **Repository Path**: gitsvn8/db-script-templates ## Basic Information - **Project Name**: db-script-templates - **Description**: 数据库脚本变更管理模板 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-03-08 - **Last Updated**: 2024-03-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据库脚本变更方案 ## 引言 数据库变更应该有据可循,应该在代码仓库体现所有的变更,同时也应该可以使用变更脚本快速还原与生产一致的数据库,本着如上描述的原则,参照平时的工作经验,设计出此数据库变更方案,供大家参考。 ## 目录结构 数据库脚本目录结构如下: - `incremental_scripts`,文件夹,存储增量的`ddl`及`dml`变更脚本。 - `ddl`,文件夹,存储增量的`ddl`变更脚本。 - 该文件夹下面以日期为子文件夹存储当日所有的变更脚本。 - `dml`,文件夹,存储增量的`dml`变更脚本。 - 该文件夹下面以日期为子文件夹存储当日所有的变更脚本。 - `entry_scripts`,文件夹,存储增量的引导变更脚本。 - 该文件夹下面以日期为子文件夹存储当日的增量变更脚本、增量备份脚本以及增量回退脚本。 - `initial_scripts`,文件夹,存储初始化数据库的`ddl`及`dml`变更脚本。 - `ddl`,文件夹,存储初始化数据库的`ddl`变更脚本。 - `functions`,文件夹,存储初始化数据库的创建函数变更脚本。 - `stored_procedures`,文件夹,存储初始化数据库的创建存储过程变更脚本。 - `tables`,文件夹,存储初始化数据库的创建表变更脚本。 - `triggers`,文件夹,存储初始化数据库的创建触发器变更脚本。 - `views`,文件夹,存储初始化数据库的创建视图变更脚本。 - `dml`,文件夹,存储初始化数据库的`dml`变更脚本。 - `db_setup_all.sql`,全量建库脚本。 - `db_setup_inc.sql`,增量变更脚本。 - `db_backup_inc.sh`,增量备份脚本。 - `db_rollback_inc.sh`,增量回退脚本。 ## 变更规范 - 所有的数据库脚本上线后不允许变更,以保证可以通过脚本快速搭建一套与生产一致的数据库。 - 增量变更脚本应保证可以多次重复执行,得到的数据库状态是一样的,即幂等性。 - 如:建表前应该先将此表drop,新增记录前应该先将此条记录删除等等。 - 每次增量变更应该新增一个文件夹,在文件夹下面建立入口脚本,此入口脚本调用实际进行变更的脚本。 - 每次增量变更新增的`ddl`文件夹应与`dml`新增的文件夹名称保持一致,方便后续追溯。 - 每次增量变更应同时在`db_setup_all.sql`及`db_setup_inc.sql`脚本中加入本次增量变更的引导脚本。 - 每次修改增量变更的脚本时,应该之前所有的增量执行内容注释掉(或者删除)。 - 每次增量变更应先执行`db_backup_inc.sh`脚本,做本次变更前的备份,然后再执行`db_setup_inc.sql`,进行数据库脚本的增量变更。 - 如果是第二次或者后续多次执行同一变更,则无需备份。 - 如果本次增量变更存在问题,需要进行回退,应执行`db_rollback_inc.sh`脚本,将本次的增量变更回退到数据库之前的状态。 - 如果在回退前,需要保存数据库的某些数据,可参照`db_backup_inc.sh`脚本,对数据库进行备份。 ## 如何快速搭建一套与生产一致的数据库 使用以上推荐的数据库变更记录方案后,可以按如下方法快速搭建起一套与生产数据库对象、基础数据一致的数据库环境。 * 切换到数据库脚本根目录,如db ``` cd db ``` * 打开MySQL命令行工具,登录到root用户 ``` mysql -uroot -p ``` * 设置编码,可根据项目实际情况设置相应的编码 ``` mysql> set names utf8mb4; ``` * 执行db_setup_all.sql即可。 ``` mysql> source db_setup_all.sql; ```