Documentation Home

17.1.5.1 检查复制状态

管理复制过程时最常见的任务是确保复制正在进行并且从属和源之间没有错误。这个的主要语句是SHOW SLAVE STATUS,你必须在每个从站上执行:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: source1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 931
               Relay_Log_File: slave1-relay-bin.000056
                Relay_Log_Pos: 950
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 931
              Relay_Log_Space: 1365
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids: 0

要检查的状态报告中的关键字段是:

  • Slave_IO_State:从站的当前状态。有关更多信息,请参阅第 8.14.7 节,“复制副本 I/O 线程状态”第 8.14.8 节,“复制副本 SQL 线程状态”

  • Slave_IO_Running: 读取源二进制日志的I/O线程是否正在运行。通常,您希望它是Yes,除非您尚未开始复制或已明确停止复制STOP SLAVE

  • Slave_SQL_Running:执行中继日志中事件的SQL线程是否正在运行。对于 I/O 线程,这通常应该是 Yes.

  • Last_IO_Error, Last_SQL_Error: 处理中继日志时 I/O 和 SQL 线程注册的最后一个错误。理想情况下,这些应该是空白的,表示没有错误。

  • Seconds_Behind_Master:从 SQL 线程落后于处理源的二进制日志的秒数。较高的数字(或不断增加的数字)表明从站无法及时处理来自源的事件。

    for 的值为 0Seconds_Behind_Master 通常可以解释为从设备已经赶上源设备,但在某些情况下,这并非严格如此。例如,如果源和从属之间的网络连接断开但从属 I/O 线程尚未注意到这一点,即slave_net_timeout尚未过去,就会发生这种情况。

    瞬态值 Seconds_Behind_Master也可能无法准确反映情况。当从 SQL 线程追上 I/O 时,Seconds_Behind_Master显示 0;但是当slave I/O线程还在排队新事件时,Seconds_Behind_Master可能会显示一个很大的值,直到SQL线程执行完新事件。当事件具有旧时间戳时,这种情况尤其可能发生;在这种情况下,如果你 SHOW SLAVE STATUS在较短的时间内执行多次,你可能会看到这个值在 0 和一个比较大的值之间反复来回变化。

几对字段提供有关从源的二进制日志中读取事件并在中继日志中处理它们的进度的信息:

  • ( Master_Log_file, Read_Master_Log_Pos):源二进制日志中的坐标,指示从属 I/O 线程从该日志中读取事件的距离。

  • ( Relay_Master_Log_File, Exec_Master_Log_Pos):源的二进制日志中的坐标,指示从属 SQL 线程执行从该日志接收的事件的距离。

  • ( Relay_Log_File, Relay_Log_Pos):从属中继日志中的坐标,指示从属 SQL 线程执行中继日志的距离。这些对应于前面的坐标,但以副本的中继日志坐标而不是源的二进制日志坐标表示。

SHOW STATUS声明还提供了一些专门与复制从站相关的信息。显示的复制心跳信息 SHOW STATUS让您检查复制连接是否处于活动状态,即使源最近没有向从属发送事件。如果二进制日志在比心跳间隔更长的时间内没有更新并且没有未发送的事件,则源向从属发送心跳信号。源上的MASTER_HEARTBEAT_PERIOD设置(由CHANGE MASTER TO语句设置)指定心跳频率,默认为从站连接超时间隔的一半 ( slave_net_timeout)。Slave_last_heartbeat变量为 SHOW STATUS显示复制从站最后一次收到心跳信号的时间。

在源上,您可以使用SHOW PROCESSLIST检查正在运行的进程列表来检查连接的从站的状态。从站连接 Binlog DumpCommand 现场:

mysql> SHOW PROCESSLIST \G;
*************************** 4. row ***************************
     Id: 10
   User: root
   Host: slave1:58371
     db: NULL
Command: Binlog Dump
   Time: 777
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL

因为驱动复制过程的是从属设备,所以此报告中提供的信息非常少。

对于以 --report-host选项启动并连接到源的从站,源SHOW SLAVE HOSTS上的语句显示有关从站的基本信息。输出包括从服务器的ID、 --report-host选项的值、连接端口和源ID:

mysql> SHOW SLAVE HOSTS;
+-----------+--------+------+-------------------+-----------+
| Server_id | Host   | Port | Rpl_recovery_rank | Master_id |
+-----------+--------+------+-------------------+-----------+
|        10 | slave1 | 3306 |                 0 |         1 |
+-----------+--------+------+-------------------+-----------+
1 row in set (0.00 sec)