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 ...
随机推荐
- Laravel技巧之记录多日志
相信每个小伙伴在使用laravel的时候都会记录日志.查看日志.那么问题来了,比如我在对接zabbix接口的时候,使用 Log::info() 会让日志全部记录在 storage/logs/larav ...
- ASP.NET Core 使用 Alipay.AopSdk.Core 常见问题解答
1.Alipay.AopSdk.Core.AopException:"您使用的私钥格式错误,请检查RSA私钥配置,charset = UTF-8" 出现这个问题,就是配置不正确.首 ...
- idea的快捷键
idea的快捷键大全 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+ ...
- 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern
package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...
- Hibernate学习---单表查询
我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以 ...
- ecshop中的$user对象
ecshop的程序中,有个对象:$user,它是用来处理用户信息的.比如登录.注册,还有就是用来和第三方管理通讯和共享资源的.在user.php中,有一条$user->login($userna ...
- Qt之移动硬盘热插拔监控
最近在做一个通用对话框,类似于windows的资源管理器,当然了没有windwos资源管理器那么强大.用户报了一个bug,说通用对话框打开之后不能实时监控U盘插入,随手在百度上搜索了一圈,这个问题还是 ...
- Eclipse多行同时进行编辑,可编辑或修改相同内容
使用Shift+Alt+A可以进入Eclipse多行编辑的功能,选中的一部分区域从光标开始处同时进行修改或者插入功能. 再次按下Shift+Alt+A可已退出该编辑模式.
- Java I/O---类体系总结
1.Java I/O常用 (1)File 对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. (2)FileInputStream 从文件系统中的某个文件中获得输入字节: ...
- SSL/TLS通信
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/31 复习基本概念 对称密码:加密和解密使用同一密匙. 公钥密码: ...