Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


19.1.7.1 检查复制状态

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

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

性能Schema复制表中的心跳信息允许您检查复制连接是否活动,即使源服务器最近没有向复制服务器发送事件。源服务器在没有更新的事件和未发送的事件在二进制日志中超过心跳间隔后,向复制服务器发送心跳信号。心跳间隔由CHANGE REPLICATION SOURCE TO设置的SOURCE_HEARTBEAT_PERIOD变量指定,缺省为复制服务器的连接超时时间的一半(由系统变量replica_net_timeout指定)。性能Schema表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节,“Replication I/O (Receiver) Thread States”第10.14.6节,“Replication SQL Thread States”,了解更多信息。

  • Replica_IO_Running: 是否正在运行I/O(接收)线程,以读取源服务器的二进制日志。通常,您希望这为Yes,除非您还没有启动复制或使用STOP REPLICA停止复制。

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

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

  • 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,您可能会看到这个值在0和一个相对较大值之间切换。

以下是一些对复制服务器在读取源二进制日志和处理relay日志的进度的信息对照表:

  • (Master_Log_file, Read_Master_Log_Pos): 在源二进制日志中指定的坐标,表示复制I/O(接收)线程已经读取了事件的位置。

  • (Relay_Master_Log_File, Exec_Master_Log_Pos): 在源二进制日志中指定的坐标,表示复制SQL(应用)线程已经执行了从该日志中接收到的事件。

  • (Relay_Log_File, Relay_Log_Pos): 在relay日志中指定的坐标,表示复制SQL(应用)线程已经执行了relay日志。这些对应于前面的坐标,但是表达的是在relay日志坐标系中,而不是在源二进制日志坐标系中。

在源端,您可以使用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)