SLAVE为什么一直不动了
导读
遇到SLAVE延迟很大,binlog apply position一直不动的情况如何排查?
问题描述
收到SLAVE延迟时间一直很大的报警,于是检查一下SLAVE状态(无关状态我给隐去了):
Slave_IO_State: Waiting for master to send event
Master_Log_File: mysql-bin.000605
Read_Master_Log_Pos: 1194
Relay_Log_File: mysql-relay-bin.003224
Relay_Log_Pos: 295105
Relay_Master_Log_File: mysql-bin.000604
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Exec_Master_Log_Pos: 294959
Relay_Log_Space: 4139172581
Seconds_Behind_Master: 10905
可以看到,延迟确实很大,而且从多次show slave status的结果来看,发现binlog的position一直不动。
Read_Master_Log_Pos: 1194
Relay_Log_File: mysql-relay-bin.003224
Relay_Log_Pos: 295105
Relay_Master_Log_File: mysql-bin.000604
Exec_Master_Log_Pos: 294959
Relay_Log_Space: 4139172581
从processlist的中也看不出来有什么不对劲的SQL在跑:
******************** 1. row ******************
Id: 16273070
User: system user
Host:
db: NULL
Command: Connect
Time: 4828912
State: Waiting for master to send event
Info: NULL
********************* 2. row *****************
Id: 16273071
User: system user
Host:
db: NULL
Command: Connect
Time: 9798
State: Reading event from the relay log
Info: NULL
在master上查看相应binlog,确认都在干神马事:
[yejr@imysql.com]# mysqlbinlog -vvv --base64-output=decode-rows -j 294959 mysql-bin.000604 | more /*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
**# at 294959**
#160204 6:16:30 server id 1 end_log_pos 295029 **Query thread_id=461151** **exec_time=2144** error_code=0
SET TIMESTAMP=1454537790/*!*/;
SET @@session.pseudo_thread_id=461151/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 295029
# at 295085
# at 296040
# at 297047
# at 298056
# at 299068
# at 300104
上面这段内容的几个关键信息:
# at 294959 — binlog起点
thread_id=461151 — master上执行的线程ID
exec_time=2144 — 该事务执行总耗时
再往下看都是一堆的binlog position信息,通过这种方式可读性不强,我们换一种姿势看看:
[yejr@imysql.com (test)]> show binlog events in 'mysql-bin.000604' from 294959 limit 10;
+------------------+--------+-------------+-----------+-------------+----------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+--------+-------------+-----------+-------------+----------------------------+
| mysql-bin.000604 | 294959 | Query | 1 | 295029 | BEGIN |
| mysql-bin.000604 | 295029 | Table_map | 1 | 295085 | table_id: 84 (bacula.File) |
| mysql-bin.000604 | 295085 | Delete_rows | 1 | 296040 | table_id: 84 |
| mysql-bin.000604 | 296040 | Delete_rows | 1 | 297047 | table_id: 84 |
| mysql-bin.000604 | 297047 | Delete_rows | 1 | 298056 | table_id: 84 |
| mysql-bin.000604 | 298056 | Delete_rows | 1 | 299068 | table_id: 84 |
| mysql-bin.000604 | 299068 | Delete_rows | 1 | 300104 | table_id: 84 |
| mysql-bin.000604 | 300104 | Delete_rows | 1 | 301116 | table_id: 84 |
| mysql-bin.000604 | 301116 | Delete_rows | 1 | 302147 | table_id: 84 |
| mysql-bin.000604 | 302147 | Delete_rows | 1 | 303138 | table_id: 84 |+—————————+————+——————-+—————-+——————-+——————————————+
可以看到,这个事务不干别的,一直在删除数据。
这是一个Bacula备份系统,会每天自动删除一个月前的过期数据。
事实上,这个事务确实非常大,从binlog的294959开始,一直到这个binlog结束4139169218,一直都是在干这事,总共大概有3.85G的binlog要等着apply。
-rw-rw---- 1 mysql mysql 1.1G Feb 3 03:07 mysql-bin.000597
-rw-rw---- 1 mysql mysql 1.1G Feb 3 03:19 mysql-bin.000598
-rw-rw---- 1 mysql mysql 2.1G Feb 3 03:33 mysql-bin.000599
-rw-rw---- 1 mysql mysql 1.4G Feb 3 03:45 mysql-bin.000600
-rw-rw---- 1 mysql mysql 1.8G Feb 3 04:15 mysql-bin.000601
-rw-rw---- 1 mysql mysql 1.3G Feb 3 04:53 mysql-bin.000602
-rw-rw---- 1 mysql mysql 4.5G Feb 4 06:16 mysql-bin.000603
-rw-rw---- 1 mysql mysql 3.9G Feb 4 06:52 mysql-bin.000604
-rw-rw---- 1 mysql mysql 1.2K Feb 4 06:52 mysql-bin.000605
可以看到上面的历史binlog,个别情况下,一个事务里一次性要删除数据量太大了,导致binlog文件远超预设的1G,最大的达到4.5G之多。
怎么解决
由于这是Bacula备份系统内置生成的大事务,除非去修改它的源码,否则没有太好的办法。
对于我们一般的应用而言,最好是攒够一定操作后,就先提交一下事务,比如删除几千条记录后提交一次,而不是像本例这样,一个删除事务消耗了将近3.9G的binlog日质量,这种就非常可怕了。
除了会导致SLAVE看起来一直不动以外,还可能会导致某些数据行(data rows)被长时间锁定不释放,而导致大量行锁等待发生。
SLAVE为什么一直不动了的更多相关文章
- hadoop/hbase/hive单机扩增slave
原来只有一台机器,hadoop,hbase,hive都安装在一台机器上,现在又申请到一台机器,领导说做成主备, 要重新配置吗?还是原来的不动,把新增的机器做成slave,原来的当作master?网上找 ...
- 修改nginx配置文件解决dx2.5下载附件停止不动的问题
在下载论坛附件的时候,总是停止在某个字数数不动 如下图 后来查看log发现 如下图 权限拒绝 发现后nginx的配置文件的启动者有关系 改了下 user 为 root 居然好了
- 安装.NET Framework进度条卡住不动的解决方案
VS在安装之前需要安装.NET Framework,我安装的是4.0版本.但是安装进度条到一半左右时就卡住不动了.前前后后重试多次,还有几次重新开机,但都没用. 开始还以为是安装的系统有问题.后来在网 ...
- Slave I/O: Got fatal error 1236
[起因] 一次zabbix报警,从库[Warning] MySQL-repl was down # 不知道主库/storage空间小于20%时为什么没有触发trigger [从库错误日志] 1611 ...
- jedis支持哨兵主从配置role为slave
jedis功能强大,但是不能像nodejs一样指定从slave中读数据,使数据量读写量较大时读写分离,减少redis压力. 我们可以利用jedis中的方法封装一个类似于此的方法. github地址: ...
- Jenkins的Windows Slave分布式构建和部署
1.新建的Slave:系统管理-->管理节点-->新建节点 远程工作目录 即是 节点服务器 站点文件存放目录 在配置节点时 启动方法 配置的选项中的 Launch agent via Ja ...
- slave IO流程之二:注册slave请求和dump请求
slave IO流程已经在http://www.cnblogs.com/onlyac/p/5815566.html中有介绍 这次我们要探索注册slave请求和dump请求的报文格式和主要流程. 一.注 ...
- slave IO流程之一:mysql登陆过程(mysql_real_connect)
最近看了slave IO的源码,发现slave IO的写relay log貌似是单线程单连接的,这让我有点小失望. slave IO的主函数是handle_slave_io,处理流程如下: 图1 ha ...
- show master/slave status求根溯源
show master/slave status分别是查看主数据库以及副数据库的状态,是一种能查看主从复制运行情况的方式. 这里仅仅讨论linux下的nysql5.7.13版本的执行情况 一.show ...
随机推荐
- ABP入门系列(9)——权限管理
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理.既然涉及到了权限,那我 ...
- SpringMVC实现JSON与前台交互
这几天忙着做学校的项目,感觉好久没有更新博客了,来整理一下. 由于要实现的功能是表单联动,只能自己去写ajax来实现提交给后台接口了,好久没有写前端,好多东西都忘记了,只能可怜巴巴的用原生的js去实现 ...
- Tomcat配置(二):tomcat配置文件server.xml详解和部署简介
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- eclipse 代码 editor 界面出现奇怪符号解决
Preferences->General->Editors->Text Editors->去掉 Show whitespace characters->apply
- SSH简单项目
这是我学习SSH整合时的一个测试项目,代码比较简单 整个项目实现从数据库中取数据,在页面上显示.项目的结构如下: (1)数据库设计 数据库使用的是student数据库中的一个数据库表grade,表的内 ...
- Spark配置参数优先级
1.Properties set directly on the SparkConf take highest precedence, 2.then flags passed to spark-sub ...
- 子查询。ANY三种用法。ALL两种用法。HAVING中使用子查询。SELECT中使用子查询。
子查询存在的意义是解决多表查询带来的性能问题. 子查询返回单行多列: ANY三种用法: ALL两种用法: HAVING中的子查询返回单行单列: SELECT中使用子查询:(了解就好,避免使用这种方法! ...
- (一)最小的Django
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 本文基本内容均出自<Lightweight Django>(中文为<轻量级D ...
- JAVA中的设计模式一(单例模式)
单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个 ...
- Mybatis篇总结
本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 JDBC写法 //sql: String sql = "s ...