数据库脚本变更方案
引言
数据库变更应该有据可循,应该在代码仓库体现所有的变更,同时也应该可以使用变更脚本快速还原与生产一致的数据库,本着如上描述的原则,参照平时的工作经验,设计出此数据库变更方案,供大家参考。
目录结构
数据库脚本目录结构如下:
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;