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
偶尔会更改为“从中继日志中读取事件”。所以看起来复制太慢了。
我早在 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 是如何做到的。
Jan 22, 2012
: MySql shell 命令未复制到从属服务器Apr 18, 2013
:使用LOAD DATA INFILE在mysql中加载数据,复制安全吗?May 04, 2014
:MySQL 5.6 显示错误的“second_behind_master”Sep 04, 2014
:MySQL 从服务器在“将主事件排队到中继日志”上花费的时间太长由于 aLOAD DATA INFILE
即将到来,我可以想象一个锁定表的请求,从中继日志中具体化 CSV 文件,并执行LOAD DATA INFILE
. 在整个周期中,没有任何东西试图访问目标表。因此,System Lock
必然会发生。
鉴于此,日志中没有错误,从服务器正在从主服务器读取二进制日志,在从服务器上不执行任何操作,并且该值只是不断Seconds_Behind_Master
增加,这是完全合理的。
您提到了分区表。您需要检查打开的文件句柄的数量。检查全局状态变量open_files和Innodb_num_open_files。如果这些值在系统锁定期间上升,则表必须正在经历锁定。可能需要打开、锁定并可能缓存跨所有分区的文件句柄。
归档时间: |
|
查看次数: |
31417 次 |
最近记录: |