文档章节

Mysql的slave lags一例

kenyon_君羊
 kenyon_君羊
发布于 2016/11/24 14:49
字数 781
阅读 439
收藏 1

现网一个产品报警主从延时,到备机上检查,果然延时(Seconds_Behind_Master)越来越严重,但是Relay_Log_pos值也是慢慢变大的,说明备机在跟主机数据,但跟得比较慢,特别是有System Lock。分析一下。

一、检查

mysql> show processlist;
+-------+-------------+--------------------+------+-------------+--------+-----------------------------------------------------------------------------+------------------+
| Id    | User        | Host               | db   | Command     | Time   | State                                                                       | Info             |
+-------+-------------+--------------------+------+-------------+--------+-----------------------------------------------------------------------------+------------------+
|     1 | system user |                    | NULL | Connect     | 171318 | Waiting for master to send event                                            | NULL             |
|     2 | system user |                    | NULL | Connect     | 312206 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|     3 | system user |                    | NULL | Connect     |    306 | Waiting for an event from Coordinator                                       | NULL             |
|     4 | system user |                    | NULL | Connect     |  10587 | System Lock                                       | NULL             |
|     5 | system user |                    | NULL | Connect     |    126 | Waiting for an event from Coordinator                                       | NULL             |
|     6 | system user |                    | NULL | Connect     |      0 | Waiting for an event from Coordinator                                       | NULL             |
|    13 | repl        | 192.168.17.59:61674 | NULL | Binlog Dump | 171281 | Master has sent all binlog to slave; waiting for binlog to be updated       | NULL             |
| 74870 | root        | localhost          | NULL | Query       |      0 | init                                                                        | show processlist |
+-------+-------------+--------------------+------+-------------+--------+-----------------------------------------------------------------------------+------------------+
9 rows in set (0.00 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
              Master_Log_File: mysql-bin.000057
          Read_Master_Log_Pos: 792576413
               Relay_Log_File: relay-bin.000170
                Relay_Log_Pos: 381505193
        Relay_Master_Log_File: mysql-bin.000057
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 792576413
              Relay_Log_Space: 561858267
              Until_Condition: None
        Seconds_Behind_Master: 10627
                  Master_UUID: 41690a50-296b-11e6-a0f1-525400fd6bba
             Master_Info_File: /data/mysql/datanode1/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: System Lock
           Master_Retry_Count: 86400
1 row in set (0.00 sec)

二、定位

[root@db02 datanode1]# mysqlbinlog --no-defaults -v relay-bin.000170 --start-position=381505193  --base64-output=decode-rows |more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 381505193
#161124 14:29:29 server id 53  end_log_pos 796951500 CRC32 0x490aa291 	Query	thread_id=96281495	exec_time=0	error_code=0
SET TIMESTAMP=1479968969/*!*/;
SET @@session.pseudo_thread_id=96281495/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=3, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
# at 381507211
#161124 14:29:29 server id 53  end_log_pos 796953659 CRC32 0x9c5e6005 	Update_rows: table id 11108 flags: STMT_END_F
### UPDATE `db_test`.`tbl_user_log`
### WHERE
###   @1=228856
###   @2='test_mobi'
###   @3='2346150430'
###   @4='2016-06-02 14:34:25'
###   @5='2016-11-24 14:23:34'
###   @6=NULL
###   @7=0
###   @8=0
###   @9=2709
###   @10='1.1.1'
###   @11='client'
###   @12=NULL
###   @13='2016-06-24 21:45:22'
###   @14=282
###   @15='userinfo_sys'
### SET
###   @1=228856
###   @2='test_mobi'
###   @3='2346150430'
###   @4='2016-06-02 14:34:25'
###   @5='2016-11-24 14:29:29'
###   @6=NULL
###   @7=0
###   @8=0
###   @9=2710
###   @10='1.1.1'
###   @11='client'
###   @12=NULL
###   @13='2016-06-24 21:45:22'
###   @14=282
###   @15='userinfo_sys'
# at 381507429
#161124 14:29:29 server id 53  end_log_pos 796953690 CRC32 0x7eec6df7 	Xid = 2585781884
COMMIT/*!*/;

三、查看打开的表

mysql> show open tables;
Database	      Table	                          In_use  Name_locked
| db_test        | tbl_1                     |      0 |           0 |
| db_test        | tbl_user_log              |      1 |           0 |
| db_test        | tbl_2                     |      0 |           0 |
3 rows in set (0.00 sec)

四、分析排查

基本可以定位是这个大批量的update导致的备机延时。这个tbl_user_log表是建了Btree索引的,索引的数据也是比较均匀分散的,但是上面没有主键或者唯一索引。该表有300多万数据,通过观察,slave上的update在relay回放时是很慢的,索引并没起作用,类似全表扫描。遂在该表上建立主键,如果备机延时比较久了,可以通过忽略记录binglog的方式在主备上加个主键操作。

主机上:
set session sql_log_bin=0;
alter table tbl_user_log add primary key(id);
set session sql_log_bin=1;

备机上:
set session sql_log_bin=0;
alter table tbl_user_log add primary key(id);
set session sql_log_bin=1;

五、注意总结

通过对该表添加主键的方式后,备机过了几分钟就把落后几个小时的数据给追回来了。后续对上线的表要做好审计,mysql的innodb表一定得要有主键,设置sql_log_bin时不要加global参数。

© 著作权归作者所有

共有 人打赏支持
kenyon_君羊
粉丝 499
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
mysql如何实时热备份

要保证线上数据库的安全,备份是通常会想到的办法,常用的备份方案有,热copy,第3方工具,快照,镜像等,这些方法均对数据库或系统有一定的影响,还有个方案就是主从,而且从库不要实时同步...

swingcoder
2016/02/25
120
0
MYSQL主从同步故障一例及解决过程!

公司里有两个mysql服务器做主从同步,某天Nagios发来报警短信,mysqla is down...赶紧联系机房,机房的人反馈来的信息是 HARDWARE ERROR 后面信息省略,让机房记下错误信息后让他们帮忙重启下...

热带冠头鱼
2017/03/21
0
0
MySQL Slave数据重新复制一例

刚才收到某台slave同步出错的预警短信,是该slave的SQL THREAD停止了,状态如下: mysql> show slave status G ... ... ... 从以上信息得知,是我在Master上建立某临时数据处理表在Slave上已...

旺旺的钥匙
2012/07/17
0
2
mysql主从关系监控,故障报警和恢复

#!/bin/sh #checkmysqlslave status ip=eth1 #网卡名称 mysql_binfile=/usr/local/mysql/bin/mysql mysql_user=root #MySQL数据库账号 mysql_pass=123456 #密码 mysql_sockfile=/tmp/mysql.......

swzxgege
2018/07/02
0
0
MySQL主从同步故障-Slave_SQL_Running: No

故障现象: 进入slave服务器,运行: mysql> show slave statusG ....... RelayLogFile: localhost-relay-bin.000535 RelayLogPos: 21795072 RelayMasterLogFile: localhost-bin.000094 Slav......

文弱书生_罗剑
2015/09/29
443
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
35分钟前
0
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
37分钟前
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
43分钟前
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
5
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部