管理复制过程时最常见的任务是确保复制正在进行并且副本和源之间没有错误。
您必须在每个副本上执行的SHOW SLAVE STATUS
语句提供有关副本服务器和源服务器之间连接的配置和状态的信息。从 MySQL 5.7 开始,性能模式具有复制表,以更易于访问的形式提供此信息。请参阅
第 25.12.11 节,“性能模式复制表”。
该SHOW STATUS
声明还提供了一些与复制品具体相关的信息。从 MySQL 版本 5.7.5 开始,以下以前使用监视的状态变量SHOW
STATUS
已被弃用并移至性能模式复制表:
Performance Schema 复制表中显示的复制心跳信息使您可以检查复制连接是否处于活动状态,即使源最近没有向副本发送事件也是如此。如果二进制日志在比心跳间隔更长的时间内没有更新并且没有未发送的事件,则源向副本发送心跳信号。源上的
MASTER_HEARTBEAT_PERIOD
设置(由CHANGE MASTER TO
语句设置)指定心跳频率,默认为副本 ( slave_net_timeout
) 连接超时间隔的一半。这replication_connection_status
Performance Schema 表显示副本接收到最近的心跳信号的时间,以及它接收到的心跳信号的数量。
如果您使用该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: replica1-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.6 节,“复制副本 I/O 线程状态”和 第 8.14.7 节,“复制副本 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 线程落后于处理源的二进制日志的秒数。高数字(或不断增加的数字)表明副本无法及时处理来自源的事件。值为 0
Seconds_Behind_Master
通常可以解释为副本已赶上源,但在某些情况下,这并非严格如此。例如,如果源和副本之间的网络连接断开但复制 I/O 线程尚未注意到这一点,即slave_net_timeout
尚未过去,则可能会发生这种情况。瞬态值
Seconds_Behind_Master
也可能无法准确反映情况。当复制 SQL 线程追上 I/O 时,Seconds_Behind_Master
显示 0;但是当复制 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 PROCESSLIST
检查正在运行的进程列表来检查连接的副本的状态。副本连接
Binlog Dump
在Command
现场有:
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 SLAVE
HOSTS
上的语句显示有关副本的基本信息。输出包括副本服务器的 ID、
--report-host
选项的值、连接端口和源 ID:
mysql> SHOW SLAVE HOSTS;
+-----------+----------+------+-------------------+-----------+
| Server_id | Host | Port | Rpl_recovery_rank | Master_id |
+-----------+----------+------+-------------------+-----------+
| 10 | replica1 | 3306 | 0 | 1 |
+-----------+----------+------+-------------------+-----------+
1 row in set (0.00 sec)