夜里跑恢复演练,脚本里的目标库变量为空,导入直接落到生产库,生产数据被昨天的测试快照覆盖,订单表退回 24 小时前。日志里能对上时间点,这种反而好排。
恢复脚本把库名写成变量,没有默认值也没有校验,变量为空时命令等价于导入当前默认库。执行前没有二次确认,也没在测试库先跑一遍。这一点先确认清楚,后面就不用反复试。
set -e
DB=${1:?target db required}
[ "$DB" = "site_prod" ] && { echo refuse; exit 1; }
mysql "$DB" < dump.sql
「备份覆盖生产」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:恢复脚本里库名写死或者强制校验非空,为空直接退出;导入前先打印目标库并要求输入库名确认;生产库账号不给删除权限,恢复走专门的运维账号;演练先在隔离实例上跑,确认脚本行为再上真实环境。
结果对不对很好判断,脚本不带库名参数直接报错退出,演练时生产表行数保持不变,测试库正常导入。
