Mysql slave 同步错误解决
涉及知识点
mysql 主从同步 ,参考: MySQL数据库设置主从同步
mysqlbin log查看, 参考:MySQL的binlog日志
解决slave报错, 参考:
Backup stopped working !! Slave_SQL_Running: No
mysql数据库binlog日志截断报错,导致mysql主从同步失败故障排查
slave库失败原因分析、解决,及根据binlog 修改position 手动同步
问题
客户反映报表缺少近期的数据。
分析解决
master 数据库提供服务,slave数据库作报表服务器,通过mysqlbin log做主从同步。
从报表数据来看,缺少了从10/28到现在(11/18)之前的数据,比对master、slave数据库主要表数据,发现:
10/28之后的slave库数据缺失,一致未同步。
- 查看slave mysql同步状态:
关注图中黄色字段:
Slave_IO_Running: Yes
Slave_SQL_Running: No --- 表示sql进程未工作,问题就处在这。
图中粉色背景,Last_Error: ....
'Duplicate entry '1169595' for key 'PRIMARY'' on query. Default database: ''. Query: 'insert into user。。。
这个错误很简单,违反主键唯一约束。
2. mysql 错误日志 通过my.conf 确定出错误日志文件,vi 查看,根据日志151028搜索到以下:
从日志中,看到10/28 1:28:55 mysql 非正常关闭; 1:29 重启后,开始recovery。 1:29:16s 后I/O errror; 1:30:19s SQL error, slave SQL thread aborted(停止工作)。
mysql也给出了解决办法:
Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000274' position 504869752
重启,并告诉sql 执行的binlog 文件设置position, 重启slave. 错误仍存在,如下
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000274',MASTER_LOG_POS=504873114;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec) mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000274',MASTER_LOG_POS=504873114;
Query OK, 0 rows affected (1.98 sec) mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.128.15
Master_User: cns
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000281
Read_Master_Log_Pos: 361947072
Relay_Log_File: app3-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000274
Slave_IO_Running: Yes
Slave_SQL_Running: No
错误原因仍是
Last_SQL_Error: Error 'Duplicate entry '1169595' for key 'PRIMARY'' on query. Default database: ''. Query: 'insert into user (type,lang,ipAddr,activityStatus,extUserId,endpoint,createTime, email, userName, mobile, storageSize, tuner
)values ('normal','zh-xx','xxxx','active','913151000777430','xxx',now(),null,null,null,0,0)'
至此看来,虽然找到问题原因必须解决以上这个问题。 进一步了解mysql 同步机制及bin log, 原理:slave 获取master的binlog, 并执行,执行报错说明数据库已有这条记录,可能原因是日志中的position不准确,只能从binlog入手分析,
binlog查看参考: MySQL的binlog日志
这里通过第二种方式查看:
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]; 选项解析:
IN 'log_name' 指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos 指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查询总条数(不指定就是所有行)
log_name, pos 错误日志已知道,查询如下:
binlog 包括所有数据库操作的sql,每条记录包含1个数据库操作。
在bin log 中,很容易找到出错的语句,现在问题是:找到slave SQL线程执行到哪个position. 这里只能采用最笨的办法,根据sql 语句,查看slave库中的数据,如:
Query | 1 | 504873619 | replace into content_preference(userId,contentId,playRecordId,status,createTime)
values (587658,15308,1544691,0,now())
此sql语句为向content_preference 插入一条记录,那么在salve库中content_preference 表中确定是否有id=587658,contentId=15308的记录,如果有,表示此语句已执行。
一直向下查找,最终找到没有执行的sql 的记录, 找到position。
至此,可以判断出slave库中执行binlog 的position, 重新设定slave库的binlog position ,启动slave, 查看执行状态,running, 见下:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec) mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000274',MASTER_LOG_POS=504873114;
Query OK, 0 rows affected (1.98 sec) mysql> start slave;
Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: 172.17.128.15
Master_User: xxx
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000274
Read_Master_Log_Pos: 693913486
Relay_Log_File: app3-relay-bin.000002
Relay_Log_Pos: 1819098
Relay_Master_Log_File: mysql-bin.000274
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在备份执行完毕后,报表导出数据正常,问题解决。
反思
mysql在11/28日重启,原因是当天线上服务出现异常,无法解决,重启了机器,当时没考虑到报表数据库也在此机器上,重启后也未检查数据库备份情况,直到用户使用才发现问题。
mysql意外重启,虽然在下次重启启动后,记录了异常信息,和备份的binlog 日志文件及位置。如果是正在执行binlog SQL,但此时mysql意外关闭,记录的position 较旧,导致下次启动时,
会有部分binlog 日志重复执行导致。 此问题,不能说是mysql bug,这种机制,可以保证slave数据不至于丢失,但需要人工找到posion,即可。
后续:
1. 对于机器重启情况, 可手动执行stop slave. 在正常关闭mysql, 重启后,手动start slave, 应该就可以正常同步。
2. 线上系统,重启一定要小心, 重启后监控相关模块是否启动,可以增加mysql slave工作监控。
Mysql slave 同步错误解决的更多相关文章
- (转)使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论
使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论 本文链接地址:http://blog.chinaunix.net/uid-31396856-id-57532 ...
- mysql主从同步错误解决和Slave_IO_Running: NO
1.出现错误提示. Slave I/O: error connecting to master 'backup@192.168.1.x:3306' - retry-time: 60 retries: ...
- mysql slave 错误解决
执行CHANGE MASTER TO master_host............后报错 ERROR 1201 (HY000): Could not initialize master info s ...
- 解决MySQL Slave 触发 oom-killer
最近经常有收到MySQL实例类似内存不足的报警信息,登陆到服务器上一看发现MySQL 吃掉了99%的内存,God ! 有时候没有及时处理,内核就会自己帮我们重启下MySQL,然后我们就可以看到 dme ...
- Slave_SQL_Running: No mysql同步故障解决方法
Slave_SQL_Running: No mysql同步故障解决 今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:mysql> show slave s ...
- 处理一则MySQL Slave环境出现ERROR 1201 (HY000): Could not initialize master info structure的案例
mysql> start slave; ERROR (HY000): Slave failed to initialize relay log info structure from the r ...
- mysql同步故障解决
故障现象:Slave_SQL_Running: No Slave状态:mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Runni ...
- 普通用户Mysql 5.6.13 主从,主主及nagios的mysql slave监控
Master:192.168.209.19 Slave:192.168.209.20 mysql版本:mysql5.6.13 1. 以root身份创建普通用户,如mysql,并创建mysql安装目录: ...
- 架构师必备:MySQL主从延迟解决办法
上一篇文章介绍了MySQL主从同步的原理和应用,本文总结了MySQL主从延迟的原因和解决办法.如果主从延迟过大,会影响到业务,应当采用合适的解决方案. MySQL主从延迟的表现 先insert或upd ...
随机推荐
- Ununtu 12.04 gedit安装插件Source Code Browser
1. 安装ctags: sudo apt-get install exuberant-ctags 2. 打开https://github.com/Quixotix/gedit-source-code- ...
- Activity生命周期解说
前言: 一直想着写一些Android基础知识分享给大家.可是有时候又认为怕写不好误导了大家学习Android.思前想后认为还是去Android官网看看,发如今Android官网上事实上就能学习到非常多 ...
- 解析“extern”
解析“extern” 1. 声明外部变量 现代编译器一般採用按文件编译的方式,因此在编译时,各个文件里定义的全局变量是 互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部.以下举一个简单的 ...
- as 中的反射 describeType
describeType函数在adobe官方在线文档上的定义如下:生成描述ActionScript对象(命令为方法的参数)的XML对象,此方法实现ActionScript语言的反射编程概念. 这个方法 ...
- 项目源码--Android基于LBS地理位置信息应用的客户端
下载源码 技术要点: 1. LBS应用框架客户端实现 2. 登录与注册系统 3. TAB类型UI实现 4. HTTP通信模块 5. 源码带详细的中文注释 ...... 详细介绍: 1. LBS应用框架 ...
- c#_表单处理方式
阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Aj ...
- c语言中的unsigned 和 signed
我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...
- How to Check if an Array Contains a Value in Java Efficiently?---reference
How to check if an array (unsorted) contains a certain value? This is a very useful and frequently u ...
- 让 BAT 的 Offer 不再难拿
随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得.由于我面试的都是比较大的公司,所以自然也是做了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学.另 ...
- SqlServer2008 之 应用积累
1.断开数据库连接,在原有查询窗口(断开数据库连接的未关闭查询窗口),对现在所连数据库进行操作,结果是对已断开数据库的误操作. 正确操作:重新连接数据库后,应关闭原有查询窗口,新建查询窗口后再执行操作 ...