在管理复制过程时,最常见的任务是确保复制正在进行,并且在副本和源之间没有错误。
在每个副本上执行的 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)