报错是这么冒出来的。备份任务一跑,业务写入就开始超时,备份窗口从十分钟拉长到一小时,白天只能暂停。
原因不止一个,得分开看。备份默认加了全局读锁,期间禁止写入。也可能是单线程导出大表,耗时被拉得很长。
还有一种情况,没有加一致性快照参数,只能锁表保证一致。
动手时先确认备份命令参数
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'
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
恢复的判定其实很直接。备份期间业务写入不再超时,备份耗时明显缩短,数据可正常恢复。
这里还有个坑。单事务只对事务型引擎有效,混合引擎的表还是会锁;备份完成后一定要做一次恢复演练才算真正可用。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。