报错是这么冒出来的。备份任务一跑,业务写入就开始超时,备份窗口从十分钟拉长到一小时,白天只能暂停。

原因不止一个,得分开看。备份默认加了全局读锁,期间禁止写入。也可能是单线程导出大表,耗时被拉得很长。

还有一种情况,没有加一致性快照参数,只能锁表保证一致。

动手时先确认备份命令参数

grep -n mysqldump /opt/backup.sh

接着改成单事务一致性快照

mysqldump --single-transaction --quick 库名 > /data/bak.sql

再往下开启压缩减少写入量

mysqldump --single-transaction 库名 | gzip > /data/bak.sql.gz

剩下的就是把备份挪到从库执行

mysql -h 从库地址 -e 'select 1'

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。备份期间业务写入不再超时,备份耗时明显缩短,数据可正常恢复。

这里还有个坑。单事务只对事务型引擎有效,混合引擎的表还是会锁;备份完成后一定要做一次恢复演练才算真正可用。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189