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.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版本升级到支持它们的版本时出现。

Important
  1. 不要尝试更新或插入mysql.slave_master_infomysql.slave_relay_log_info表中的行。这样可以导致未定义的行为,并且不受支持。执行任何需要在slave_master_infoslave_relay_log_info表中的写锁定的语句都被禁止,而只读语句则可以在任何时间执行。

  2. 连接元数据存储表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_infomysql.slave_relay_log_info表。对应的元数据存储库表的更新将与事务一起提交,这意味着复制服务器的进度信息记录在该存储库中总是与对数据库的应用情况一致,即使在服务器意外中断的情况下。关于复制服务器最不容易中断的设置组合,请参见第19.4.2节,“处理复制服务器意外中断”

当您备份复制服务器的数据或将其数据快照转移到创建新复制服务器时,请确保包括mysql.slave_master_infomysql.slave_relay_log_info表,其中包含复制元数据存储库。对于克隆操作,注意在克隆操作中,元数据存储库表被复制,但文件类型的元数据存储库不被复制。使用基于二进制日志文件位置的复制时,需要元数据存储库以便在恢复、复制或克隆复制服务器后恢复复制。即使没有relay log文件,但仍有applier元数据存储库,您可以检查它以确定源的二进制日志文件执行的进度,然后使用CHANGE REPLICATION SOURCE TO语句,使用SOURCE_LOG_FILESOURCE_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