Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

19.1.7.1 复制状态检查

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

在每个副本上执行的 SHOW REPLICA STATUS 语句提供了副本服务器和源服务器之间连接的配置和状态信息。 MySQL Performance Schema 中的复制表提供了这些信息的更易访问形式。请参阅 第 29.12.11 节,“性能模式复制表”

性能模式复制表中的复制心跳信息让您可以检查复制连接是否活动,即使源最近没有发送事件到副本。源将在没有更新 binary log 或未发送事件时发送心跳信号到副本,时间间隔由 SOURCE_HEARTBEAT_PERIOD 设置指定,默认为副本连接超时间隔的一半(由系统变量 replica_net_timeout 指定)。性能模式 replication_connection_status 表显示了副本最近收到的心跳信号时间和收到的心跳信号数量。

您可以使用 SHOW REPLICA STATUS 检查单个副本的状态;该语句提供了以下信息:

mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 127.0.0.1
                  Source_User: root
                  Source_Port: 13000
                Connect_Retry: 1
              Source_Log_File: master-bin.000001
          Read_Source_Log_Pos: 927
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 1145
        Relay_Source_Log_File: master-bin.000001
           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: 927
              Relay_Log_Space: 1355
              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:
             Source_Server_Id: 1
                  Source_UUID: 73f86016-978b-11ee-ade5-8d2a2a562feb
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 10
                  Source_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Source_SSL_Crl:
           Source_SSL_Crlpath:
           Retrieved_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
            Executed_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Source_TLS_Version:
       Source_public_key_path:
        Get_Source_public_key: 0
            Network_Namespace:

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

  • Replica_IO_State:副本的当前状态。请参阅 第 10.14.5 节,“复制 I/O (接收器) 线程状态”第 10.14.6 节,“复制 SQL 线程状态”,以获取更多信息。

  • Replica_IO_Running:I/O (接收器) 线程是否正在运行,用于从源读取二进制日志。通常,您希望这项是 Yes,除非您尚未启动复制或使用 STOP REPLICA 明确停止了复制。

  • Replica_SQL_Running:SQL 线程是否正在运行,用于执行中继日志中的事件。与 I/O 线程一样,这项通常应该是 Yes

  • Last_IO_Error, Last_SQL_Error:I/O (接收器) 和 SQL (应用程序) 线程在处理中继日志时的最后一个错误。理想情况下,这些应该为空,表示没有错误。

  • Seconds_Behind_Source:复制 SQL (应用程序) 线程落后于源二进制日志的秒数。高值(或增加的值)可能表明副本无法及时处理来自源的事件。

    如果 Seconds_Behind_Source 的值为 0,这通常意味着副本已经赶上了源,但有一些情况下这并不完全正确。例如,如果源和副本之间的网络连接断开,但复制 I/O (接收器) 线程尚未注意到这点;也就是说,副本的网络超时间隔(由 replica_net_timeout 指定)尚未到期。

    此外,Seconds_Behind_Source 的瞬时值可能不反映实际情况。例如,当复制 SQL (应用程序) 线程赶上了 I/O 时,Seconds_Behind_Source 将显示 0;但当复制 I/O (接收器) 线程仍在排队新的事件时,Seconds_Behind_Source 可能显示一个大值,直到复制应用程序线程完成执行新的事件。这尤其可能发生在事件具有旧时间戳的情况下;在这种情况下,如果您在短时间内多次执行 SHOW REPLICA STATUS,您可能会看到这个值反复变化 zwischen 0 和一个相对较大的值。

多对字段提供了关于副本从源二进制日志中读取事件和在中继日志中处理它们的进度信息:

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

  • (Relay_Master_Log_File, Exec_Master_Log_Pos): 源二进制日志中的坐标,指示复制SQL(applier)线程从该日志中执行事件的进度。

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

在源上,您可以使用 SHOW PROCESSLIST 语句来检查连接的副本的状态。副本连接在 Command 字段中具有 Binlog Dump

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

因为副本驱动复制过程,因此在此报告中提供的信息非常少。

对于使用 --report-host 选项启动的副本,并且连接到源的副本,源上的 SHOW REPLICAS 语句显示了副本的基本信息。输出包括副本服务器的 ID、--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)