迪B课堂 | 鹅厂老司机MySQL复制避坑指南
本期主题是:MySQL中复制使用ROW格式需要避免的坑
视频核心信息:
在MySQL的一般场景中,通常数据库运维同学会推荐,将复制格式设置为ROW格式,也就是行格式,这样所有的变更数据都会被记录到binlog中,可对数据达到较好的保护,万一发生DML误操作,可以直接在binlog中恢复。在MySQL5.7之后,ROW格式已经作为复制的默认格式。本期视频就MySQL中复制使用ROW格式可能遇到的坑做了详细说明:
1. 使用ROW格式的复制模式时,如果存在无索引表,可能会导致主从延迟增大。
原因:
ROW模式之所以能保证复制可靠性,是其在BINLOG里记录每一行完整记录,包括所有列的值; 在备库应用日志时,MySQL会先尝试用行里的主键去匹配自身的记录,如果没有主键,则进行全表扫描所有的行,每一行都与日志进行匹配,直到发现完全匹配的行。
所以如果在没有主键的情况下,进行一些更新或者删除的操作,在备库回放时就会产生大量的记录,同样会使得主从延迟增大。
解决方法:
- 若表支持创建唯一/主键索引,则创建主键索引;若表不支持创建主键索引,创建部分列(区分度较大的几列)的联合索引。
- 创建自增主键
- 参数优化slave_rows_search_algorithms的hash_scan方式。
2. salve节点alter语句导致同步中断
原因:
若我们需要对一个表的表结构进行修改,可以使用在线的DDL操作,或者采用percona的开源工具pt-ost。
对一个大表修改字段类型DDL,为了不影响主库业务,会先在从库上执行DDL操作,然后通过主从切换,完成最终的大表DDL。在从库执行完DDL后,这时发现复制中断了,报错信息:1677。报错原因是主从库之间同一个表如果列的类型不匹配,MySQL会尝试转码,如果转码失败(类型不兼容)则复制中断。
解决方案:
- 有损转换。可在slave节点设置slave_type_conversions=ALL_LOSSY,系统默认无损转换,设置为有损转换时,表示列类型允许丢失一些信息。设置时需注意:一定要保证从库字段足够大,能存下主库字段值,否则会导致数据不一致。
- 从主库直接xtrabackup备份(或者冷备系统),之后恢复作为从库提供服务。
- 在从库上把对应表新增的字段去掉,重新启动同步。
作者简介:
刘迪,网名迪B哥,腾讯云数据库产品经理,中国计算机行业协会开源数据库专业委员会副会长,数据库领域技术专家。拥有视频、游戏、金融、服务中台等业务场景的数据库架构设计和优化分析经验,曾主要负责腾讯视频、腾讯网、腾讯新闻、腾讯体育等多款产品的MySQL、MongoDB、Redis数据库架构设计和运维工作,对外推出了《迪B课堂》系列数据库实战课程,关注腾讯云数据库官方微信即可免费获取。
文章转自公众号:腾讯云数据库