#### 17.1.7.1 检查复制状态

管理复制过程时最常见的任务是确保复制正在发生并且副本和源之间没有错误。

这[`显示副本状态`](show-replica-status.html)必须在每个副本上执行的语句提供有关副本服务器和源服务器之间连接的配置和状态的信息。从 MySQL 8.0.22 开始，[`显示奴隶状态`](show-slave-status.html)已弃用，并且[`显示副本状态`](show-replica-status.html)可以改为使用。性能模式具有复制表，以更易于访问的形式提供此信息。看[第 27.12.11 节，“性能模式复制表”](performance-schema-replication-tables.html).

Performance Schema 复制表中显示的复制心跳信息使您可以检查复制连接是否处于活动状态，即使源最近没有向副本发送事件也是如此。如果二进制日志在比心跳间隔更长的时间内没有更新，也没有未发送的事件，则源向副本发送心跳信号。这`MASTER_HEARTBEAT_PERIOD`源上的设置（由[`将主更改为`](change-master-to.html)语句）指定心跳的频率，默认为副本连接超时间隔的一半（由系统变量指定[`副本网络超时`](replication-options-replica.html#sysvar_replica_net_timeout)要么[`slave_net_timeout`](replication-options-replica.html#sysvar_slave_net_timeout)）。这[`复制连接状态`](performance-schema-replication-connection-status-table.html)Performance Schema 表显示了副本何时收到最新的心跳信号，以及它收到了多少心跳信号。

如果您正在使用[`显示副本状态`](show-replica-status.html)检查单个副本状态的语句，该语句提供以下信息：

```
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: source1
                  Source_User: root
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: mysql-bin.000004
          Read_Source_Log_Pos: 931
               Relay_Log_File: replica1-relay-bin.000056
                Relay_Log_Pos: 950
        Relay_Source_Log_File: mysql-bin.000004
           Replica_IO_Running: Yes
          Replica_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_Source_Log_Pos: 931
              Relay_Log_Space: 1365
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids: 0
```

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

-   `Replica_IO_State`：副本的当前状态。看[第 8.14.5 节，“复制 I/O（接收器）线程状态”](replica-io-thread-states.html)， 和[第 8.14.6 节，“复制 SQL 线程状态”](replica-sql-thread-states.html)， 了解更多信息。

-   `Replica_IO_Running`: 用于读取源二进制日志的 I/O（接收者）线程是否正在运行。通常，您希望这是`是的`除非您尚未开始复制或已明确停止复制[`停止复制`](stop-replica.html).

-   `Replica_SQL_Running`：用于执行中继日志中事件的SQL线程是否正在运行。与 I/O 线程一样，这通常应该是`是的`.

-   `Last_IO_Error`,`Last_SQL_Error`：处理中继日志时，I/O（接收者）和 SQL（应用程序）线程注册的最后一个错误。理想情况下，这些应该是空白的，表示没有错误。

-   `Seconds_Behind_Source`：复制 SQL（应用程序）线程在处理源二进制日志之后的秒数。较大的数字（或增加的数字）可能表明副本无法及时处理来自源的事件。

    值为 0`Seconds_Behind_Source`通常可以解释为副本已经赶上了源，但在某些情况下，这并不完全正确。例如，如果源和副本之间的网络连接中断但复制 I/O（接收器）线程尚未注意到这一点，则可能会发生这种情况；也就是设定的时间段[`副本网络超时`](replication-options-replica.html#sysvar_replica_net_timeout)要么[`slave_net_timeout`](replication-options-replica.html#sysvar_slave_net_timeout)还没有过去。

    也有可能的瞬态值`Seconds_Behind_Source`可能无法准确反映情况。当复制 SQL（应用程序）线程赶上 I/O 时，`Seconds_Behind_Source`显示 0；但是当复制 I/O（接收者）线程仍在排队一个新事件时，`Seconds_Behind_Source`在复制应用程序线程完成执行新事件之前，可能会显示一个较大的值。当事件具有旧的时间戳时，这种情况尤其可能发生；在这种情况下，如果您执行[`显示副本状态`](show-replica-status.html)在相对较短的时间内几次，您可能会看到该值在 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-processlist.html)检查正在运行的进程列表。副本连接有`二进制日志转储`在里面`命令`场地：


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

因为它是驱动复制过程的副本，所以此报告中提供的信息很少。

对于以[`--报告主机`](replication-options-replica.html#sysvar_report_host)选项并连接到源，[`显示复制品`](show-replicas.html)（或在 MySQL 8.0.22 之前，[`显示从主机`](show-slave-hosts.html)) 源上的语句显示有关副本的基本信息。输出包括副本服务器的 ID、[`--报告主机`](replication-options-replica.html#sysvar_report_host)选项、连接端口和源 ID：

```
mysql> SHOW REPLICAS;
+-----------+----------+------+-------------------+-----------+
| Server_id | Host     | Port | Rpl_recovery_rank | Source_id |
+-----------+----------+------+-------------------+-----------+
|        10 | replica1 | 3306 |                 0 |         1 |
+-----------+----------+------+-------------------+-----------+
1 row in set (0.00 sec)
```
