15.7.7.34 显示副本状态语句
SHOW REPLICA STATUS [FOR CHANNEL channel]
该语句提供副本线程的关键参数状态信息。该语句需要REPLICATION CLIENT
特权(或弃用的SUPER
特权).
SHOW REPLICA STATUS
语句是非阻塞的。当与STOP REPLICA
语句并发执行时,SHOW REPLICA STATUS
语句将不等待STOP REPLICA
语句完成关闭复制SQL(applier)线程或复制I/O(receiver)线程(或两者)。这允许在监控和其他应用程序中使用SHOW REPLICA STATUS
语句,以获取即时响应,而不需要确保它返回最新数据。
如果使用mysql客户端,使用\G
语句终止符可以获得更可读的垂直布局:
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:
性能Schema提供了表格,用于暴露复制信息。这与SHOW REPLICA STATUS
语句类似,但以表格形式表示。详细信息,请见Section 29.12.11,“Performance Schema Replication Tables”.
可以将CHANGE REPLICATION SOURCE TO
语句的GTID_ONLY
选项设置为停止复制通道,避免在复制元数据存储库中存储文件名和文件位置。使用该设置时,源二进制日志文件和中继日志文件的文件位置将在内存中跟踪。然而,因为文件位置不再在连接元数据存储库和applier元数据存储库中定期更新,可能会在服务器重新启动后变得过时。
在服务器启动后,复制通道设置了GTID_ONLY
选项,读取和应用文件位置(Read_Source_Log_Pos
和Exec_Source_Log_Pos
)将设置为零,文件名(Source_Log_File
和Relay_Source_Log_File
)将设置为INVALID
。中继日志文件名(Relay_Log_File
)将根据relay_log_recovery设置确定,可能是新创建的文件或第一个中继日志文件。文件位置(Relay_Log_Pos
)将设置为4,GTID自动跳过将用于跳过已应用的事务。
当接收线程与源建立连接,并获取有效的位置信息时,读取位置(Read_Source_Log_Pos
)和文件名(Source_Log_File
)将被更新为正确的数据,并变得有效。当应用线程从源应用事务,或者跳过已经执行的事务时,执行位置(Exec_Source_Log_Pos
)和文件名(Relay_Source_Log_File
)将被更新为正确的数据,并变得有效。同时,relay日志文件位置(Relay_Log_Pos
)也将被更新。
以下列表描述了SHOW REPLICA STATUS
返回的字段。有关解释这些字段的含义的更多信息,请见第19.1.7.1节,“检查复制状态”。
-
Replica_IO_State
复制I/O(接收)线程的
SHOW PROCESSLIST
输出的State
字段的副本。这将告诉你线程正在做什么:尝试连接到源,等待来自源的事件,重新连接到源等。有关可能的状态的列表,请见第10.14.5节,“复制I/O(接收)线程状态”。 -
Source_Host
复制连接到的源主机。
-
Source_User
连接到源的用户名。
-
Source_Port
连接到源的端口号。
-
Connect_Retry
连接重试的秒数(默认60)。可以使用
CHANGE REPLICATION SOURCE TO
语句设置。 -
Source_Log_File
当前读取的源二进制日志文件的名称。对于使用
CHANGE REPLICATION SOURCE TO
语句设置的复制通道,Source_Log_File
将被设置为INVALID
。当复制线程联系到源时将被更新。 -
Read_Source_Log_Pos
当前读取的源二进制日志文件的位置。这将被设置为零对于使用
CHANGE REPLICATION SOURCE TO
语句设置的复制通道。将被更新当复制线程联系到源时。 -
Relay_Log_File
当前读取的relay日志文件的名称。
-
Relay_Log_Pos
当前读取的relay日志文件的位置。
-
Relay_Source_Log_File
源二进制日志文件名,包含最新执行的事件。该值在服务器启动后设置为
INVALID
,如果使用了GTID_ONLY
设置。该值将在事务执行或跳过时更新。 -
Replica_IO_Running
是否启动了复制I/O(接收)线程,并且已经成功连接到源服务器。该线程的状态由以下三个值之一表示:
-
MYSQL_REPLICA_NOT_RUN. 复制I/O(接收)线程未启动。对于该状态,
Replica_IO_Running
为No
。 -
MYSQL_REPLICA_RUN_NOT_CONNECT. 复制I/O(接收)线程正在运行,但未连接到源服务器。对于该状态,
Replica_IO_Running
为Connecting
。 -
MYSQL_REPLICA_RUN_CONNECT. 复制I/O(接收)线程正在运行,并且已经连接到源服务器。对于该状态,
Replica_IO_Running
为Yes
。
-
-
Replica_SQL_Running
是否启动了复制SQL(应用)线程。
-
Replicate_Do_DB
,Replicate_Ignore_DB
使用了
--replicate-do-db
和--replicate-ignore-db
选项指定的数据库名称,或者使用CHANGE REPLICATION FILTER
语句指定的数据库名称。如果使用了FOR CHANNEL
子句,显示的是通道特定的复制过滤器。否则,显示的是每个复制通道的复制过滤器。 -
Replicate_Do_Table
,Replicate_Ignore_Table
,Replicate_Wild_Do_Table
,Replicate_Wild_Ignore_Table
使用了
--replicate-do-table
,--replicate-ignore-table
,--replicate-wild-do-table
, 和--replicate-wild-ignore-table
选项指定的表名称,或者使用CHANGE REPLICATION FILTER
语句指定的表名称。如果使用了FOR CHANNEL
子句,显示的是通道特定的复制过滤器。否则,显示的是每个复制通道的复制过滤器。 -
Last_Errno
,Last_Error
这些列是
Last_SQL_Errno
和Last_SQL_Error
的别名。发出
RESET BINARY LOGS AND GTIDS
或RESET REPLICA
将重置这些列中的值。Note当复制 SQL 线程接收到错误时,它首先报告错误,然后停止 SQL 线程。这意味着,在
SHOW REPLICA STATUS
显示的窗口中,Last_SQL_Errno
将显示非零值,而Replica_SQL_Running
仍然显示Yes
。 -
Skip_Counter
系统变量
sql_replica_skip_counter
的当前值。 -
Exec_Source_Log_Pos
复制 SQL 线程已经读取和执行的当前源二进制日志文件的位置,这标识了下一个事务或事件的开始。这在服务器启动时将被设置为零,并且在事务执行或跳过时将被更新。
您可以使用
CHANGE REPLICATION SOURCE TO
语句的SOURCE_LOG_POS
选项来启动新的复制源,从现有复制源开始读取,从这个位置开始读取。源二进制日志文件中的(Relay_Source_Log_File
,Exec_Source_Log_Pos
)坐标对应于relay日志文件中的(Relay_Log_File
,Relay_Log_Pos
)坐标。relay日志文件中的事务顺序不一致可能会导致这个值变为“低水位标记”。换言之,事务前面的坐标保证已经提交,但是事务后的坐标可能已经提交或未提交。如果需要纠正这些差异,请使用
START REPLICA UNTIL SQL_AFTER_MTS_GAPS
。请参阅第19.5.1.34节,“Replication and Transaction Inconsistencies”获取更多信息。 -
Relay_Log_Space
所有现有relay日志文件的总大小。
-
Until_Condition
,Until_Log_File
,Until_Log_Pos
START REPLICA 语句中的UNTIL子句的值。
Until_Condition
的值:-
None
如果没有指定UNTIL子句。 -
Source
如果复制源读取到源二进制日志的某个位置。 -
Relay
如果复制源读取到relay日志的某个位置。 -
SQL_BEFORE_GTIDS
如果复制 SQL 线程正在处理事务,直到它达到第一个在gtid_set
中列出的事务的 GTID。 -
SQL_AFTER_GTIDS
如果复制线程正在处理所有事务,直到gtid_set
中的最后一个事务被两个线程处理。 -
SQL_AFTER_MTS_GAPS
如果多线程副本的 SQL 线程正在运行,直到在中继日志中找到最后一个空隙。
Until_Log_File
和Until_Log_Pos
表示定义复制 SQL 线程停止执行的日志文件名和位置。有关
UNTIL
take a look at Section 15.4.2.4, “START REPLICA Statement”. -
-
Source_SSL_Allowed
,Source_SSL_CA_File
,Source_SSL_CA_Path
,Source_SSL_Cert
,Source_SSL_Cipher
,Source_SSL_CRL_File
,Source_SSL_CRL_Path
,Source_SSL_Key
,Source_SSL_Verify_Server_Cert
这些字段显示副本连接到源的 SSL 参数,如果有。
Source_SSL_Allowed
的值是:-
Yes
如果允许从源建立 SSL 连接。 -
No
如果不允许从源建立 SSL 连接。 -
Ignored
如果允许从源建立 SSL 连接,但副本服务器不支持 SSL。
其他 SSL 相关字段的值对应于
CHANGE REPLICATION SOURCE TO
语句中的SOURCE_SSL_*
选项的值。 -
-
Seconds_Behind_Source
这个字段表示副本的““late”程度:
-
当副本正在处理更新时,这个字段显示副本当前时间戳和源上事件当前时间戳的差异。
-
当副本没有正在处理事件时,这个值为 0。
本质上,这个字段测量的是复制 SQL(applier)线程和复制 I/O(receiver)线程之间的时间差。如果网络连接速度快,复制 receiver 线程与源非常接近,这个字段是一个很好的近似值。如果网络速度慢,这个字段可能不是一个好的近似值;复制 applier 线程可能会经常落后于慢读复制 receiver 线程,所以
Seconds_Behind_Source
通常显示一个值为 0,即使复制 receiver 线程落后于源。换言之,这个字段只在快速网络下有用。本计算时间差异的方法,即使源和副本的时间不同,但只要差异在副本接收线程启动时保持不变,就可以工作。任何变化,包括NTP更新,可以导致时钟偏移,使
Seconds_Behind_Source
的计算结果不那么可靠。在 MySQL 8.4 中,这个字段是
NULL
(未定义或未知)如果复制应用线程未运行或已消费了所有中继日志且复制接收线程未运行。在更早的 MySQL 版本中,这个字段是NULL
如果复制应用线程或复制接收线程未运行或未连接到源。如果复制接收线程运行但中继日志已耗尽,Seconds_Behind_Source
将设置为 0。Seconds_Behind_Source
的值基于事件中的时间戳,这些时间戳通过复制保留。这样,如果源 M1 是 M0 的副本,那么 M1 的二进制日志中的任何事件都来自 M0 的二进制日志,并且该事件具有 M0 的时间戳。这使得 MySQL 能够成功复制TIMESTAMP
。然而,对于Seconds_Behind_Source
来说,问题在于如果 M1 也从客户端直接更新,那么Seconds_Behind_Source
的值会随机浮动,因为有时 M1 的最后一个事件来自 M0,有时是 M1 的直接更新结果。在使用多线程副本时,需要注意的是,这个值基于
Exec_Source_Log_Pos
,因此可能不反映最近提交的事务的位置。 -
-
Last_IO_Errno
,Last_IO_Error
最近一次复制 I/O (接收)线程错误的错误号和错误信息。如果错误号为 0,错误信息为空字符串,则表示“没有错误”。如果
Last_IO_Error
值不为空,错误值也将出现在副本的错误日志中。I/O 错误信息包括显示最近一次 I/O (接收)线程错误发生的时间戳,这个时间戳使用格式
YYMMDD hh:mm:ss
,并出现在Last_IO_Error_Timestamp
列中。执行
RESET BINARY LOGS AND GTIDS
或RESET REPLICA
将重置这些列的值。 -
Last_SQL_Errno
,Last_SQL_Error
最近一次复制 SQL (应用)线程错误的错误号和错误信息。如果错误号为 0,错误信息为空字符串,则表示“没有错误”。如果
Last_SQL_Error
值不为空,错误值也将出现在副本的错误日志中。如果复制服务器是多线程的,那么复制 SQL 线程将是工作线程的协调器。在这种情况下,
Last_SQL_Error
字段显示了Last_Error_Message
列在性能.schemareplication_applier_status_by_coordinator
表中的内容。该字段值将暗示可能还有其他工作线程的失败,这些失败可以在replication_applier_status_by_worker
表中看到。如果该表不可用,可以使用复制服务器的错误日志。日志或replication_applier_status_by_worker
表也可以用来了解由SHOW REPLICA STATUS
或协调器表显示的失败。SQL 错误信息包括一个时间戳,显示最近一次 SQL (applier) 线程错误发生的时间。这一个时间戳使用格式
YYMMDD hh:mm:ss
,并出现在Last_SQL_Error_Timestamp
列中。执行
RESET BINARY LOGS AND GTIDS
或RESET REPLICA
将重置这些列中的值。在 MySQL 8.4 中,
Last_SQL_Errno
和Last_SQL_Error
列中的错误代码和消息对应于 Server Error Message Reference 中列出的错误值。这在之前的版本中不总是如此。 (Bug #11760365, Bug #52768) -
Replicate_Ignore_Server_Ids
使用
CHANGE REPLICATION SOURCE TO
语句的IGNORE_SERVER_IDS
选项指定的服务器 ID,这样复制服务器可以忽略来自这些服务器的事件。在环形或多源复制设置中,当一个服务器被删除时使用该选项。如果已经设置了服务器 ID,这个字段将显示一个逗号分隔的列表,其中包含一个或多个数字。如果没有设置服务器 ID,这个字段将为空。Note在
slave_master_info
表中的Ignored_server_ids
值也显示要忽略的服务器ID,但作为一个空格分隔的列表,前面还包括要忽略的服务器ID总数。例如,如果已经对一个副本发出CHANGE REPLICATION SOURCE TO
语句,该语句包含IGNORE_SERVER_IDS = (2,6,9)
选项,告诉副本忽略ID为2、6或9的源,这些信息将以以下方式显示:Replicate_Ignore_Server_Ids: 2, 6, 9
Ignored_server_ids: 3, 2, 6, 9
Replicate_Ignore_Server_Ids
过滤是由I/O(接收)线程执行的,而不是SQL(应用)线程,这意味着被过滤的事件不会被写入到relay日志中。这与服务器选项,如--replicate-do-table
,不同,该选项将应用于应用线程。如果在任何通道上已经设置了
IGNORE_SERVER_IDS
,并且执行了SET gtid_mode=ON
语句,语句将被拒绝,并出现错误。在开始基于GTID的复制之前,使用SHOW REPLICA STATUS
语句来检查和清除所有忽略的服务器ID列表在涉及的服务器上。您可以通过CHANGE REPLICATION SOURCE TO
语句使用IGNORE_SERVER_IDS=()
—即空列表—to清除列表。 -
Source_Server_Id
来自源的
server_id
值。 -
Source_UUID
来自源的
server_uuid
值。 -
Source_Info_File
来自源的
master.info
文件的位置,当前已弃用。默认情况下,副本的连接元数据存储库使用表代替。 -
SQL_Delay
副本必须与源落后多少秒。
-
SQL_Remaining_Delay
当
Replica_SQL_Running_State
为Waiting until SOURCE_DELAY seconds after source executed event
时,这个字段包含剩余延迟秒数。在其他情况下,这个字段为NULL
。 -
Replica_SQL_Running_State
SQL线程的状态(与
Replica_IO_State
相似)。该值与SHOW PROCESSLIST
语句中显示的SQL线程的State
值相同。Section 10.14.6, “Replication SQL Thread States”,提供了可能的状态列表。 -
Source_Retry_Count
复制源断开连接时, replica 可以尝试重新连接的次数。这可以使用
SOURCE_RETRY_COUNT
选项来设置,例如在CHANGE REPLICATION SOURCE TO
语句中。 -
Source_Bind
复制源绑定的网络接口,如果有。使用
SOURCE_BIND
选项来设置,例如在CHANGE REPLICATION SOURCE TO
语句中。 -
Last_IO_Error_Timestamp
显示最近一次 I/O 错误发生的时间戳,以
YYMMDD hh:mm:ss
格式。 -
Last_SQL_Error_Timestamp
显示最近一次 SQL 错误发生的时间戳,以
YYMMDD hh:mm:ss
格式。 -
Retrieved_Gtid_Set
复制源接收到的所有事务的全局事务 ID 集合。如果 GTIDs 不在使用中,为空。详见 GTID 集合。
这是relay日志中存在或曾经存在的所有 GTID 的集合。每个 GTID 都在收到
Gtid_log_event
时添加。这样可以导致部分传输事务的 GTID 包含在集合中。当所有relay日志由于执行
RESET REPLICA
或CHANGE REPLICATION SOURCE TO
语句时清除集合。或者由于--relay-log-recovery
选项的影响时清除集合。然而,如果relay_log_purge = 1
,最新的relay日志总是保留,集合不被清除。 -
Executed_Gtid_Set
写入到二进制日志中的全局事务 ID 集合。这与在本服务器上的全局
gtid_executed
系统变量的值相同,以及在本服务器上的SHOW BINARY LOG STATUS
语句的Executed_Gtid_Set
值为空。如果 GTIDs 不在使用中,详见 GTID 集合。 -
Auto_Position
如果 GTID 自动定位在使用中,为 1,否则为 0。
-
Replicate_Rewrite_DB
显示复制过滤规则。例如,如果设置了以下复制过滤规则:
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=((db1,db2), (db3,db4));
那么
Replicate_Rewrite_DB
值显示:Replicate_Rewrite_DB: (db1,db2),(db3,db4)
-
Channel_name
当前显示的复制通道。总是存在一个默认的复制通道,可以添加更多的复制通道。有关复制通道的更多信息,请见第19.2.2节,“复制通道”。
-
Master_TLS_Version
源端使用的TLS版本。有关TLS版本的信息,请见第8.3.2节,“加密连接TLS协议和密钥”。
-
Source_public_key_path
源端复制副本的公钥文件路径,该文件用于RSA密钥对密码交换。该文件必须是PEM格式的。该列适用于使用
sha256_password
或caching_sha2_password
身份验证插件的副本。如果指定了
Source_public_key_path
并指定了有效的公钥文件,该文件将优先于Get_source_public_key
。 -
Get_source_public_key
是否从源端请求用于RSA密钥对密码交换的公钥,该列适用于使用
caching_sha2_password
身份验证插件的副本。在该插件中,源端不会发送公钥除非被请求。如果指定了
Source_public_key_path
并指定了有效的公钥文件,该文件将优先于Get_source_public_key
。 -
Network_Namespace
网络命名空间名称;如果连接使用默认(全局)命名空间,则为空。有关网络命名空间的信息,请见第7.1.14节,“网络命名空间支持”。