19.2.4.2 复制元数据存储库
复制服务器创建两个复制元数据存储库:连接元数据存储库和应用程序元数据存储库。复制元数据存储库在复制服务器关闭时生存。如果使用基于二进制日志文件位置的复制,复制服务器重启时,它将读取这两个存储库,以确定它之前在读取源服务器的二进制日志和处理自己的中继日志的位置。如果使用GTID-基于的复制,复制服务器不使用复制元数据存储库来确定这些信息,但需要它们来包含其他元数据。
-
复制服务器的连接元数据存储库包含 replication I/O(接收器)线程需要连接到复制源服务器并从源服务器的二进制日志中检索事务的信息。该存储库中的元数据包括连接配置、复制用户帐户详细信息、SSL连接设置和从源服务器的二进制日志中读取的当前位置。
-
复制服务器的应用程序元数据存储库包含 replication SQL(应用程序)线程需要从中继日志中读取和应用事务的信息。该存储库中的元数据包括中继日志中事务的执行位置和源服务器的二进制日志中的等效位置。它还包括应用事务的元数据,例如工作线程的数量和channel的
PRIVILEGE_CHECKS_USER
帐户。
连接元数据存储库写入到mysql.slave_master_info
表中,而应用程序元数据存储库写入到mysql.slave_relay_log_info
表中。如果mysqld无法初始化复制元数据存储库的表,会出现警告消息,但复制服务器仍然可以继续启动。这可能会在从不支持使用表的MySQL版本升级到支持它们的版本时出现。
-
不要尝试更新或插入
mysql.slave_master_info
或mysql.slave_relay_log_info
表中的行。这样可以导致未定义的行为,并且不受支持。执行任何需要在slave_master_info
和slave_relay_log_info
表中的写锁定的语句都被禁止,而只读语句则可以在任何时间执行。 -
连接元数据存储表
mysql.slave_master_info
的访问权限应该限制于数据库管理员,因为它包含连接到源的复制用户帐户名称和密码。使用受限的访问模式来保护包含该表的数据库备份。您可以清除复制用户帐户凭证,从连接元数据存储中删除它们,而是始终使用START REPLICA
语句来启动复制通道。这意味着复制通道总是需要操作员干预以重新启动,但帐户名称和密码不会记录在复制元数据存储中。
RESET REPLICA
语句将清除复制元数据存储中的数据,除了复制连接参数(取决于MySQL Server版本)。详细信息,请参阅RESET REPLICA
的描述。
您可以将CHANGE REPLICATION SOURCE TO
语句的GTID_ONLY
选项设置为停止复制通道不将文件名和文件位置记录在复制元数据存储中。这避免了在GTID-基于复制中不需要的写入和读取操作。在GTID_ONLY
设置下,连接元数据存储和应用程序元数据存储在复制队列和事件队列中不会被更新,文件位置将在内存中跟踪,可以使用SHOW REPLICA STATUS
查看它们。复制元数据存储只有在以下情况下同步:
-
当
CHANGE REPLICATION SOURCE TO
语句被执行时。 -
当
RESET REPLICA
语句被执行时。RESET REPLICA ALL
语句将删除而不是更新存储,因此它们将隐式同步。 -
当复制通道被初始化时。
-
如果复制元数据存储从文件移到表中。
创建复制元数据存储作为表是默认行为;使用文件是弃用的。
使用InnoDB
事务存储引擎创建了mysql.slave_master_info
和mysql.slave_relay_log_info
表。对应的元数据存储库表的更新将与事务一起提交,这意味着复制服务器的进度信息记录在该存储库中总是与对数据库的应用情况一致,即使在服务器意外中断的情况下。关于复制服务器最不容易中断的设置组合,请参见第19.4.2节,“处理复制服务器意外中断”。
当您备份复制服务器的数据或将其数据快照转移到创建新复制服务器时,请确保包括mysql.slave_master_info
和mysql.slave_relay_log_info
表,其中包含复制元数据存储库。对于克隆操作,注意在克隆操作中,元数据存储库表被复制,但文件类型的元数据存储库不被复制。使用基于二进制日志文件位置的复制时,需要元数据存储库以便在恢复、复制或克隆复制服务器后恢复复制。即使没有relay log文件,但仍有applier元数据存储库,您可以检查它以确定源的二进制日志文件执行的进度,然后使用CHANGE REPLICATION SOURCE TO
语句,使用SOURCE_LOG_FILE
和SOURCE_LOG_POS
选项,告诉复制服务器从源点重新读取二进制日志文件(假设源点上的二进制日志文件仍然存在)。
另一个存储库是applier worker元数据存储库,主要用于内部使用,用于记录多线程复制服务器上的worker线程状态信息。applier worker元数据存储库包括每个worker线程的relay log文件和源的二进制日志文件名称和位置。如果applier元数据存储库创建为表,default情况下,applier worker元数据存储库将写入到mysql.slave_worker_info
表。如果applier元数据存储库写入到文件中,applier worker元数据存储库将写入到worker-relay-log.info
文件中。对于外部使用,worker线程状态信息将在性能Schemareplication_applier_status_by_worker
表中呈现。
存储复制元数据仓库原本包含了与SHOW REPLICA STATUS
语句的输出类似的信息,这些信息在第15.4.2节,“控制副本服务器的SQL语句”中有讨论。自此以来,已经添加了更多的复制元数据仓库信息,这些信息不被SHOW REPLICA STATUS
语句显示。
对于连接元数据仓库,以下表格显示了mysql.slave_master_info
表中的列、SHOW REPLICA STATUS
语句中的列和已弃用的master.info
文件中的行。
slave_master_info Table Column |
SHOW REPLICA STATUS Column |
master.info File Line |
Description |
---|---|---|---|
Number_of_lines |
[None] | 1 | 表中的列数(或文件中的行数) |
Master_log_name |
Source_Log_File |
2 | 当前读取的源日志文件名 |
Master_log_pos |
Read_Source_Log_Pos |
3 | 当前读取的源日志文件中的当前位置 |
Host |
Source_Host |
4 | 复制源服务器的主机名 |
User_name |
Source_User |
5 | 连接到源服务器的复制用户帐户名称 |
User_password |
密码(不被SHOW REPLICA STATUS 语句显示) |
6 | 连接到源服务器的复制用户帐户密码 |
Port |
Source_Port |
7 | 连接到复制源服务器的网络端口 |
Connect_retry |
Connect_Retry |
8 | 副本等待重新连接到源服务器的时间(以秒为单位) |
Enabled_ssl |
Source_SSL_Allowed |
9 | 副本是否支持SSL连接 |
Ssl_ca |
Source_SSL_CA_File |
10 | 证书授权机构(CA)证书文件名 |
Ssl_capath |
Source_SSL_CA_Path |
11 | 证书授权机构(CA)证书文件路径 |
Ssl_cert |
Source_SSL_Cert |
12 | SSL证书文件名 |
Ssl_cipher |
Source_SSL_Cipher |
13 | SSL握手中使用的加密算法列表 |
Ssl_key |
Source_SSL_Key |
14 | SSL密钥文件名 |
Ssl_verify_server_cert |
Source_SSL_Verify_Server_Cert |
15 | 是否验证服务器证书 |
Heartbeat |
[None] | 16 | 复制心跳间隔,单位为秒 |
Bind |
Source_Bind |
17 | 选择replica的网络接口用于连接到源 |
Ignored_server_ids |
Replicate_Ignore_Server_Ids |
18 | 要忽略的服务器ID列表。注意,对于Ignored_server_ids ,服务器ID列表前面是要忽略的服务器ID总数。 |
Uuid |
Source_UUID |
19 | 源的唯一ID |
Retry_count |
Source_Retry_Count |
20 | 允许的重新连接尝试次数 |
Ssl_crl |
[None] | 21 | SSL证书撤销列表文件路径 |
Ssl_crlpath |
[None] | 22 | SSL证书撤销列表文件路径目录 |
Enabled_auto_position |
Auto_position |
23 | 是否启用GTID自动定位 |
Channel_name |
Channel_name |
24 | 复制通道名称 |
Tls_version |
Source_TLS_Version |
25 | 源的TLS版本 |
Public_key_path |
Source_public_key_path |
26 | RSA公钥文件名称 |
Get_public_key |
Get_source_public_key |
27 | 是否从源请求RSA公钥 |
Network_namespace |
Network_namespace |
28 | 网络命名空间 |
Master_compression_algorithm |
[None] | 29 | 连接到源的允许压缩算法 |
Master_zstd_compression_level |
[None] | 30 | zstd 压缩级别 |
Tls_ciphersuites |
[None] | 31 | TLSv1.3的加密套件 |
Source_connection_auto_failover |
[None] | 32 | 是否激活异步连接故障转移机制 |
Gtid_only |
[None] | 33 | 是否使用GTID并且不持久化位置 |
对于applier元数据存储库,该表显示了mysql.slave_relay_log_info
表中的列、SHOW REPLICA STATUS
显示的列和弃用的relay-log.info
文件中的行之间的对应关系。
slave_relay_log_info Table Column |
SHOW REPLICA STATUS Column |
Line in relay-log.info File |
Description |
---|---|---|---|
Number_of_lines |
[None] | 1 | 表或文件中的列数 |
Relay_log_name |
Relay_Log_File |
2 | 当前relay log文件的名称 |
Relay_log_pos |
Relay_Log_Pos |
3 | relay log文件中的当前位置;relay log文件中的事件在这个位置之前已经在复制数据库中执行 |
Master_log_name |
Relay_Source_Log_File |
4 | 源的二进制日志文件名称,其中包含了relay log文件中的事件 |
Master_log_pos |
Exec_Source_Log_Pos |
5 | 源的二进制日志文件中的事件在relay log文件中的等效位置 |
Sql_delay |
SQL_Delay |
6 | 复制数据库与源之间的延迟秒数 |
Number_of_workers |
[None] | 7 | 并行应用事务的工作线程数量 |
Id |
[None] | 8 | 用于内部目的的ID,当前总是为1 |
Channel_name |
Channel_name |
9 | 复制通道的名称 |
Privilege_checks_username |
[None] | 10 | 通道的PRIVILEGE_CHECKS_USER帐户的用户名 |
Privilege_checks_hostname |
[None] | 11 | 通道的PRIVILEGE_CHECKS_USER帐户的主机名 |
Require_row_format |
[None] | 12 | 通道是否只接受行级别事件 |
Require_table_primary_key_check |
[None] | 13 | 通道对CREATE TABLE和ALTER TABLE操作的表必须具有主键的策略 |
Assign_gtids_to_anonymous_transactions_type |
[None] | 14 | 如果通道为未具有GTID的事务分配GTID,使用replica的本地UUID,这个值为LOCAL ;如果通道使用手动设置的UUID,这个值为UUID 。如果通道不分配GTID,值为OFF 。 |
Assign_gtids_to_anonymous_transactions_value |
[None] | 15 | 用于匿名事务的GTID中的UUID |