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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

虽然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

本文作者:张灿

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
21天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
21天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
21天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
|
22天前
|
存储 SQL 关系型数据库
mysql优化一
mysql优化一
16 0
|
15天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
80 1
|
21天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
21天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
21天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
1天前
|
SQL Oracle 关系型数据库
下次老板问你MySQL如何优化时,你可以这样说,老板默默给你加工资
现在进入国企或者事业单位做技术的网友越来越多了,随着去O的力度越来越大,很多国企单位都开始从Oracle向MySQL转移,相对于Oracle而言,MySQL最大的问题就是性能,所以,这个时候,在公司如果能够处理好MySQL的性能瓶颈,那么你也就很容易从人群中脱颖而出,受到老板的青睐。
11 1