/db-script-templates

Primary LanguageShellMIT LicenseMIT

数据库脚本变更方案

引言

数据库变更应该有据可循,应该在代码仓库体现所有的变更,同时也应该可以使用变更脚本快速还原与生产一致的数据库,本着如上描述的原则,参照平时的工作经验,设计出此数据库变更方案,供大家参考。

目录结构

数据库脚本目录结构如下:

  • incremental_scripts,文件夹,存储增量的ddldml变更脚本。
    • ddl,文件夹,存储增量的ddl变更脚本。
      • 该文件夹下面以日期为子文件夹存储当日所有的变更脚本。
    • dml,文件夹,存储增量的dml变更脚本。
      • 该文件夹下面以日期为子文件夹存储当日所有的变更脚本。
    • entry_scripts,文件夹,存储增量的引导变更脚本。
      • 该文件夹下面以日期为子文件夹存储当日的增量变更脚本、增量备份脚本以及增量回退脚本。
  • initial_scripts,文件夹,存储初始化数据库的ddldml变更脚本。
    • 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.sqldb_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;