使用mysqldump/mysql同步生产库到测试库如何避免覆盖开发改动
解决方案
首先修正你现有命令的两处错误:
- mysqldump参数中
-p和-h之间缺少空格,会导致参数解析失败,需改为-p -hHost.com - 备份文件路径中文件名和后缀之间多了空格,需删除避免生成异常文件名
方案一:结构差异校验,存在自定义改动时跳过同步
该方案完全符合你最初的要求,检测到测试库结构和生产不一致时直接终止同步操作:
- 先分别导出两个库的纯结构文件(不含数据,包含存储过程、触发器)
# 导出生产库纯结构 bin/mysqldump.exe -uUsername -p -hHost.com --no-data --routines --triggers --skip-comments production_database > backups/prod_schema.sql # 导出测试库纯结构 bin/mysqldump.exe -uUsername -p -hHost.com --no-data --routines --triggers --skip-comments testers_database > backups/test_schema.sql
- 过滤自动生成的注释行和空行后比对两个结构文件,根据比对结果判断是否执行同步
# 比对结构差异 diff -q <(grep -vE '^--|^$' backups/prod_schema.sql) <(grep -vE '^--|^$' backups/test_schema.sql) if [ $? -eq 0 ];then # 结构无差异,执行全量导入 bin/mysql.exe -uUsername -p -hHost.com testers_database < backups/dump_production_database.sql else echo "测试库存在自定义结构改动,自动同步终止,请手动处理" exit 1 fi
方案二:仅同步生产数据不改动测试库结构(推荐)
该方案可以在完全不破坏测试库自定义字段、函数、触发器的前提下,自动同步生产库的最新数据,不需要做结构校验也不会覆盖开发改动,是更优的解决方案:
- 导出生产库时添加参数只导出数据,不导出表结构、存储过程、触发器相关语句
bin/mysqldump.exe -uUsername -p -hHost.com --lock-tables=false --single-transaction --no-create-info --skip-routines --skip-triggers production_database > backups/prod_data_only.sql
- 直接导入纯数据文件即可,该操作只会插入/更新表内数据,不会修改任何表结构、函数、触发器配置
bin/mysql.exe -uUsername -p -hHost.com testers_database < backups/prod_data_only.sql
注意:如果测试库新增的字段为非空且无默认值,导入时可能会报错,只需提前约定开发新增字段时设置允许为空或添加默认值即可避免该问题
是否需要放弃自动更新
完全不需要,上述两个方案都可以满足你的需求,优先选择方案二即可完全免去开发手动更新的成本,同时不会破坏测试库的自定义改动。
内容的提问来源于stack exchange,提问作者Mads Sander Høgstrup
相关产品推荐
相关产品推荐

