MySQL slave 大部分时间卡在“系统锁”,CPU 使用率高

Cit*_*ght 7 mysql replication linux

让我描述一下我们现在面临的情况:

我们有一个 MySQL Master-Slave,基于行的复制设置,目前,slave 被一个永久的System Lock. Master 是一个活跃的服务器,有很多updates并且deletes正在运行,但是 Slave 不会复制任何东西。日志中没有错误,从站正在从主站读取二进制日志,但它对从站没有任何作用。该Seconds_Behind_Master值不断增加。这是show processlist奴隶显示的内容:

mysql> show processlist ;
+----+-------------+-----------+------+---------+-------+----------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time  | State                            | Info             |
+----+-------------+-----------+------+---------+-------+----------------------------------+------------------+
| 10 | system user |           | NULL | Connect |  4985 | Waiting for master to send event | NULL             |
| 11 | system user |           | NULL | Connect | 53715 | System lock                      | NULL             |
| 14 | root        | localhost | NULL | Sleep   |  2958 |                                  | NULL             |
| 16 | root        | localhost | NULL | Query   |     0 | init                             | show processlist |
+----+-------------+-----------+------+---------+-------+----------------------------------+------------------+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

show slave status显示:

SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: System lock
Run Code Online (Sandbox Code Playgroud)

唯一的生命迹象是,Relay_Log_Pos从奴隶身份开始,价值观正在改变,但非常缓慢。这是否意味着它正在运行来自二进制日志的查询,但只是它太慢了?

粘贴一些信息来自show engine innodb status

LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 14, OS thread handle 0x7f7824698700, query id 216193 localhost root init
show engine innodb status
---TRANSACTION 230426904, not started
mysql tables in use 1638, locked 1638
MySQL thread id 11, OS thread handle 0x7f7824920700, query id 216192 System lock
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
Run Code Online (Sandbox Code Playgroud)

还注意到这个特定 mysql 实例的 mysqld 进程具有很高的 CPU 使用率。什么可能导致Slave_SQL_Running_State: System lock并阻止从站运行查询?机器没有磁盘问题,并且有另一个 MySQL 实例正在运行,它是同一主服务器上另一个 MySQL 实例 (myisam) 的从属,并且运行良好。

MySQL 版本:5.6.20。操作系统:RHEL 6.5 我们有一些已分区的表(如果这很重要)。

编辑:刚刚注意到Slave_SQL_Running_State偶尔会更改为“从中继日志中读取事件”。所以看起来复制太慢了。

Rol*_*DBA 1

我早在 2013 年 1 月就回答了一个关于线程状态“系统锁”的问题:What does 'system lock'means in mysql profiling a LOAD DATA INFILE statements?

以下是可能发生的情况,请跟随

我的旧帖子中,我提出了以下内容

该线程将请求或正在等待表的内部或外部系统锁。如果这种状态是由外部锁请求引起的,并且您没有使用多个访问相同 MyISAM 表的 mysqld 服务器,则可以使用 --skip-external-locking 选项禁用外部系统锁。但是,默认情况下外部锁定处于禁用状态,因此此选项很可能不起作用。对于 SHOW PROFILE,此状态意味着线程正在请求锁(而不是等待它)。

由于这是发生在 SQL 线程上,这意味着有一个查询需要锁定一个表或表中的一行。由于尚未获取锁,因此该查询在 中的 SQL 线程的 INFO 字段中不可见SHOW PROCESSLIST;。下一个逻辑问题是,“你如何才能看到查询或至少看到锁?”

当你跑的时候SHOW ENGINE INNODB STATUS\G,你看到了锁。但是,您没有看到它锁定的表。根据我以前的帖子,我怀疑LOAD DATA INFILE已经在主服务器上运行,然后复制到从服务器。为什么需要锁定 Slave 上的表?

这与 MySQL 复制LOAD DATA INFILE. 不仅通过二进制日志复制该命令,而且还通过整个数据文件复制该命令。我有一篇旧文章,其中详细描述了 MySQL 是如何做到的。

由于 aLOAD DATA INFILE即将到来,我可以想象一个锁定表的请求,从中继日志中具体化 CSV 文件,并执行LOAD DATA INFILE. 在整个周期中,没有任何东西试图访问目标表。因此,System Lock必然会发生。

鉴于此,日志中没有错误,从服务器正在从主服务器读取二进制日志,在从服务器上不执行任何操作,并且该值只是不断Seconds_Behind_Master增加,这是完全合理的。

更新时间 2014-10-24 12:55 美国东部时间

您提到了分区表。您需要检查打开的文件句柄的数量。检查全局状态变量open_filesInnodb_num_open_files。如果这些值在系统锁定期间上升,则表必须正在经历锁定。可能需要打开、锁定并可能缓存跨所有分区的文件句柄。