MySQL 传统复制中常见故障处理和结构优化案例分析

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介:

虽然MySQL5.7 的主从复制已经很稳定了,但在备库可读写的情况下,总是会出现部分数据不一致的情况,例如常见的1062、1032和1050错误。下面就介绍下这类报错的常见处理方法和常见主从复制结构的调整。

环境描述
  • 1、mysql 5.7 以上,
  • 2、binlog format 是row格式(5.7默认)
  • 3、传统复制(生产强烈推荐使用gtid)
  • 4、log-bin , log_slave_updates 开启
  • 5、复制结构:101:3306> 103:3306 > 104:3306

常见主从复制报错

1、表重复错误: 1050

从库已经有T2表,再在主库上创建T2. 处理原则:以主库为准,在从库上drop t2。 然后重启slave。

注意: 在db里的操作都会记录到binlog中,如果不想被记录到binlog中,可以先set sql_log_bin=0.drop完成后,再 set sql_log_bin=1即可。

从5.7 开始,有super read only。

0316498d4896d9f0dd6ab48a1597e40853d45aae

处理方法:

从库操作:

set sql_log_bin=0;
drop table t2;
set sql_log_bin=1;
start slave;
show slave status;

2、主键冲突: 1062

20bf9e5c3ed9cff5445d2929e179085b374c88b1

处理方法:

从库操作:

set sql_log_bin=0;
delete from t2 where id =2;
set sql_log_bin=1;
start slave;
show slave status;

3、主库上更新后,从库找不到记录 :1032

c2a78cb48a675e6a964956ef0888e6b7918d7026

这时需要解析主库的binlog,把从库的数据补回来。

7e56d3be67b6edef3bf2a43bfb5853911831afad

这里就能看到从库丢失的那条记录。然后在从库补充这条记录即可。

处理方法:

从库操作:

set sql_log_bin=0;
insert into t2 (id) values (2);
set sql_log_bin=1;
start slave;
show slave status;

4、主库上delete后,从库找不到记录: 1032

906f38ee86bccf1d553b775757c32fef28a97569

想看某段pos内执行过的sql: 主库执行:

mysqlbinlog --base64-output=decode-rows -v --start-position=2465 
--stop-position=2748 mysql-bin.000050 > 50.sql

输出如下:

### DELETE FROM `wubx`.`wubx`
### WHERE
### @1=2### @2='wubx'
ROLLBACK /* added by mysqlbinlog */ /*!*/; 

注意这里的rollback。如果以后基于binlog和时间点的恢复。这条数据会被rollback掉,造成一条数据的丢失。所以如果想保留这条数据,需要找到commit的位置,或者下个pos的位置。

处理方法:

从库操作:

slave stop;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
slave start
常见复制结构调整

1、一主一从,添加从库

st=>operation: M 101:3306
e=>end
op=>operation: S1 103:3306
 
st->op->op1

调整为,级联或星型结构

st=>operation: M 101:3306
e=>end
op=>operation: S1 103:3306
op1=>operation: S11 104:3306

st->op->op1

2、级联复制调整

从103.3306 dump数据

mysqldump --single-transaction --master-data=2 -uroot -p123456 -A -S 
/tmp/mysql3306.sock

104 导入数据

mysql -S /tmp/mysql3306.sock -uroot -p123456 < /tmp/1203.sql

change 104 到103

change master to master_host='192.168.56.103', master_user='repl', 
master_password='repl4slave', master_port=3306, 
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4138, 
master_connect_retry=10;

101 插入测试数据

insert into t2 values (200);

101 持续insert

for ((i=1;i<=1000000;i++))
do
mysql -S /tmp/mysql3306.sock -uroot -p123456 -e 
"insert into enmo.t2 values($i)"done

关闭103 主机,并检查104 slave 状态

5eb94e0ebb865afb1b7446863704950a867a3478

主从的binlog 都会记录主库的server id 和timestamp信息。可以根据这2个信息去定位相应的pos信息。

101:3306

a88f13149cd9749d0dd90e141488131f3c6e49ee

104:3306

2ceac41fab21a2c8c1b840af265eeff33e13a307

这里可以看到101 结束 insert 1419后,并commit的 pos 是387204,所以104 change 的pos 可以选择到387204这里。但是如果104没有把1419 这条记录commit的话,就要选择101 开始 insert 1419 这个事务之间的pos:387020.

104 change 到101

change master to master_host='192.168.56.103', 
master_user='repl', master_password='repl4slave', 
master_port=3306, MASTER_LOG_FILE='mysql-bin.000093', 
MASTER_LOG_POS=387204, master_connect_retry=10;


原文发布时间为:2017-12-14

本文作者:张灿

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
9月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
548 158
|
8月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
9月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
595 156
|
9月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
707 161
|
8月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
865 6
|
9月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
10月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
280 12
|
10月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
386 6
|
11月前
|
存储 SQL 关系型数据库
MySQL的Redo Log与Binlog机制对照分析
通过合理的配置和细致的管理,这两种日志机制相互配合,能够有效地提升MySQL数据库的可靠性和稳定性。
347 10
|
11月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
286 2

推荐镜像

更多