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

处理方法:

从库操作:

set sql_log_bin=0;

drop table t2;

set sql_log_bin=1;

start slave;

show slave status;

2、主键冲突: 1062

处理方法:

从库操作:

set sql_log_bin=0;

delete from t2 where id =2;

set sql_log_bin=1;

start slave;

show slave status;

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

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

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

处理方法:

从库操作:

set sql_log_bin=0;

insert into t2 (id) values (2);

set sql_log_bin=1;

start slave;

show slave status;

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

想看某段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:3306st->op->op1

调整为,级联或星型结构

st=>operation: M 101:3306
e=>end
op=>operation: S1 103:3306
op1=>operation: S11 104:3306st->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 状态

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

101:3306

104:3306

这里可以看到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;

作者介绍

张灿   云和恩墨技术顾问

2015年12月加入云和恩墨,擅长oracle、mysql数据库,shell、python脚本。

关注本公众号,回复:prelection,你可以找到本文的相关视频文档。

相关阅读:

MySQL连接错误的十二“坑”

MySQL - 8种常见的SQL错误用法

如何将MySQL GR 设置为多主模式

数据库高可用和分区解决方案-MySQL 篇

揭秘:Instapaper基于AWS上MySQL历时一周的恢复

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

‘2017DTC’,2017DTC大会PPT

‘DBALIFE’,“DBA的一天”海报

‘DBA04’,DBA手记4经典篇章电子书

‘RACV1’, RAC系列课程视频及ppt

‘122ARCH’,Oracle 12.2体系结构图

‘2017OOW’,Oracle OpenWorld资料

‘PRELECTION’,大讲堂讲师课程资料

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

  1. mysql 组复制和传统复制_2017年12月聚合文章--MySQL 传统复制中常见故障处理和结构优化案例分析 | 码友网...

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

  2. [机缘参悟-76]:沟通技巧-职场中常见不合适语言的案例分析(尽量避免使用反问式语言)

    目录 第一部分:针对他人的用词 避免使用"怎么?" 这样的责难的词. 避免使用"老实说"这样过虚假的词. 避免说"xxx几点左右" 这种的不 ...

  3. 与MySQL传统复制相比,GTID有哪些独特的复制姿势?

    与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...

  4. mysql未指定错误_使用mysql的系统中常见sql错误

    使用mysql的系统中常见的sql错误: 1.事务中某些表是非innodb类型. SQLWarning ignored: SQL state 'HY000', error code '1592', m ...

  5. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  6. 计算机有效教学案例分析,中职计算机应用基础有效教学案例分析.doc

    中职计算机应用基础有效教学案例分析.doc (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 俩瘫直词琼下矫焉原温沽己动府罚斗寒详沛凡 ...

  7. linux 进入gedit命令,linux中gedit命令报错的案例分析

    linxu下的gedit命令相信大家都很熟悉,但是这么简单的命令也经常会报错.下面由学习啦小编为大家整理了linux的gedit命令的报错案例分析相关知识,希望对大家有帮助! linux中的gedit ...

  8. mysql执行计划中 性能最好_MySQL性能优化-explain执行计划

    explain用于获取查询执行计划信息, 一.语法 只需要在select前加上explain即可,如: mysql> explain select 1; +----+-------------+ ...

  9. mysql 钩子_php中的钩子理解及应用实例分析

    本文实例讲述了php中的钩子理解及应用.分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要.它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以 ...

最新文章

  1. NGINX中的proxy_pass和rewrite
  2. [RGEOS]空间拓扑关系
  3. 前端学习 -- Css -- 字体分类
  4. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
  5. 判断input框是否为空
  6. java编程中的断言工具类(org.springframework.util.Assert)
  7. java的流套接_java-使用流关闭套接字
  8. 排序算法之--桶排序(桶,像桶一样的排序,听起来很有趣哦0。0)
  9. 从Iris数据集开始---机器学习入门
  10. GridSearchCV( )参数详情
  11. 字体靠右代码_html中怎么把文字往右移
  12. 机器学习项目失败最大的原因的有这7种,你认同吗?
  13. access百科 pc_PC Access SMART
  14. 快让你的App分20亿吧!
  15. 使用labelme标记图片、json批量转dataset的解决方案以及一些问题解决方案
  16. 数据结构(54) B树、B+树
  17. IDEA--工欲善其事必先利其器
  18. void __declspec(naked)解释
  19. 多彩微立体述职报告PPT模板
  20. Java 最著名的开源框架(第一部分)

热门文章

  1. 打开Morrowind版本,Vector 36在Linux上的本机版本以及Hyper Light Drifter
  2. 最佳 开源 人脸识别算法_开源项目的最佳社会结构是什么?
  3. CSS 背景尺寸 background-size属性
  4. android h5选择图片上传,js-微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)...
  5. Git笔记(17) 协议
  6. 调用高德逆地理接口_地理编码与逆地理编码
  7. android新闻客户端发展趋势,基于Android平台的新闻客户端设计与实现
  8. auto.js停止所有线程_多线程快速入门(二)及面试题
  9. python乘积函数_龙贝格求积公式(Python实现)
  10. element筛选 ajax,vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询