1.mysql版本:5.6.36
2.问题描述
在主备架构模式下,收到同事说在备机上执行mysqldump后,程序监控报211错误码(对应的为备的gtid比主多)
3.问题分析
(1)获取到执行的mysqldump命令,为mysqldump -h 主机 -u用户名 -p -P端口 --no-create-info --lock-all-tables -c"xx执行语句" -r xx.sql
(2)登陆到备机上执行show slave status发现无任何报错信息,查看mysql.err日志,无任何异常报错
(3)使用mysqlbinlog解析执行后的binlog日志,发现对应时间点多了一条flush table的gtid
(4)怀疑是参数lock-all-tables导致,将改成single-transaction发现结果ok,无异常报错。
(5)重新使用mysqlbinlog解析执行后的binlog日志,对比发现使用single-transaction后无flush table的gtid,所以基本可以肯定是参数lock-all-tables导致的。
4.解决方案
1.跟同事确认,将--lock-all-tables改成--single-transaction,其备份结果一样可以满足需求
5.mysqldump参数扩展之lock-all-tables和single-transaction
--lock-all-tables
作用:从一开始就对整个mysql实例加global read lock锁,这整个全局读锁会一直持续到导出结束。所以在这个过程中,数据库实际严格处于read only状态。使用该参数的话,也会自动将 --single-transaction 及 --lock-tables 参数置于 off 状态。
默认值:off。
--single-transaction
作用:使用该参数在导出过程中只能保证每个表的数据一致性(利用多版本特性实现,目前只能针对InnoDB事务表)。比如有一个大表,mysqldump对该表的导出需要1分钟,那么在这1分钟的过程中,该表时可以被正常访问的(正常访问包括增删改查,但是alter table等对表结构发生更改的语句要被挂起。)
默认值:off。
本文暂时没有评论,来添加一个吧(●'◡'●)