文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制元数据存储库

19.2.4.2 复制元数据存储库

副本服务器创建两个复制元数据存储库,连接元数据存储库和应用程序元数据存储库。复制元数据存储库在副本服务器关闭后仍然存在。如果使用基于二进制日志文件位置的复制,则在副本重新启动时,它会读取这两个存储库以确定它之前在从源读取二进制日志和处理自身中继日志方面已经进行到哪里。如果使用基于 GTID 的复制,副本不会将复制元数据存储库用于该目的,但需要它们来获取它们包含的其他元数据。

  • 副本的 连接元数据存储库 包含复制 I/O(接收器)线程连接到复制源服务器并从源的二进制日志中检索事务所需的信息。此存储库中的元数据包括连接配置、复制用户帐户详细信息、连接的 SSL 设置,以及复制接收器线程当前从源的二进制日志中读取的文件名和位置。

  • 副本的 应用程序元数据存储库 包含复制 SQL(应用程序)线程需要从副本的中继日志中读取和应用事务所需的信息。此存储库中的元数据包括复制应用程序线程已执行中继日志中事务的文件名和位置,以及源的二进制日志中的等效位置。它还包括应用事务过程的元数据,例如工作线程的数量以及通道的 PRIVILEGE_CHECKS_USER 帐户。

连接元数据存储库写入 mysql 系统模式中的 slave_master_info 表,应用程序元数据存储库写入 mysql 系统模式中的 slave_relay_log_info 表。如果 mysqld 无法初始化复制元数据存储库的表,则会发出警告消息,但副本仍允许继续启动。这种情况最有可能发生在从不支持使用表作为存储库的 MySQL 版本升级到支持使用表的版本时。

重要提示
  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 删除而不是更新存储库,因此它们被隐式同步。

  • 当初始化复制通道时。

  • 如果复制元数据存储库从文件移动到表。

将复制元数据存储库创建为表是默认设置;使用文件已被弃用。

mysql.slave_master_infomysql.slave_relay_log_info 表使用 InnoDB 事务性存储引擎创建。对应用程序元数据存储库表的更新与事务一起提交,这意味着记录在该存储库中的副本的进度信息始终与已应用于数据库的内容一致,即使在意外服务器停止的情况下也是如此。有关副本上设置组合的信息,这些设置对于意外停止最具弹性,请参见 第 19.4.2 节,“处理副本的意外停止”

当您备份副本数据或传输其数据的快照以创建新的副本时,请确保您包含包含复制元数据存储库的 mysql.slave_master_infomysql.slave_relay_log_info 表。对于克隆操作,请注意,当复制元数据存储库被创建为表时,它们在克隆操作期间被复制到接收方,但是当它们被创建为文件时,它们不会被复制。当使用基于二进制日志文件位置的复制时,复制元数据存储库是必需的,以便在重新启动恢复的、复制的或克隆的副本后恢复复制。如果您没有中继日志文件,但仍然有应用程序元数据存储库,您可以检查它以确定复制 SQL 线程在源的二进制日志中执行了多远。然后,您可以使用带有 SOURCE_LOG_FILESOURCE_LOG_POS 选项的 CHANGE REPLICATION SOURCE TO 语句来告诉副本从该点重新读取源的二进制日志(前提是源上仍然存在所需的二进制日志)。

另一个存储库,应用程序工作程序元数据存储库,主要用于内部使用,并保存有关多线程副本上的工作程序线程的状态信息。应用程序工作程序元数据存储库包含每个工作程序线程的中继日志文件和源的二进制日志文件的名和位置。如果应用程序元数据存储库被创建为表,这是默认设置,应用程序工作程序元数据存储库将被写入 mysql.slave_worker_info 表。如果应用程序元数据存储库被写入文件,应用程序工作程序元数据存储库将被写入 worker-relay-log.info 文件。对于外部使用,工作程序线程的状态信息在 Performance Schema replication_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 表列 SHOW REPLICA STATUS master.info 文件行 描述
Number_of_lines [无] 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 [无] 16 复制心跳之间的间隔,以秒为单位
Bind Source_Bind 17 副本的哪个网络接口应用于连接到源
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 [无] 21 SSL 证书吊销列表文件的路径
Ssl_crlpath [无] 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 [无] 29 连接到源的允许压缩算法
Master_zstd_compression_level [无] 30 zstd 压缩级别
Tls_ciphersuites [无] 31 TLSv1.3 允许的密码套件
Source_connection_auto_failover [无] 32 异步连接故障转移机制是否被激活
Gtid_only [无] 33 该通道是否仅使用 GTID 并且不持久化位置

对于应用程序元数据存储库,下表显示了 mysql.slave_relay_log_info 表中的列、SHOW REPLICA STATUS 显示的列以及弃用的 relay-log.info 文件中的行之间的对应关系。

slave_relay_log_info 表列 SHOW REPLICA STATUS relay-log.info 文件中的行 描述
Number_of_lines [无] 1 表中的列数或文件中的行数
Relay_log_name Relay_Log_File 2 当前中继日志文件的名称
Relay_log_pos Relay_Log_Pos 3 中继日志文件中的当前位置;已在副本数据库上执行了此位置之前的事件
Master_log_name Relay_Source_Log_File 4 源的二进制日志文件的名称,从中读取了中继日志文件中的事件
Master_log_pos Exec_Source_Log_Pos 5 已在副本上执行的事件在源的二进制日志文件中的等效位置
Sql_delay SQL_Delay 6 副本必须落后于源的秒数
Number_of_workers [无] 7 用于并行应用复制事务的工作程序线程数
Id [无] 8 用于内部目的的 ID;当前,这始终为 1
Channel_name Channel_name 9 复制通道的名称
Privilege_checks_username [无] 10 通道的 PRIVILEGE_CHECKS_USER 帐户的用户名
Privilege_checks_hostname [无] 11 通道的 PRIVILEGE_CHECKS_USER 帐户的主机名
Require_row_format [无] 12 该通道是否只接受基于行的事件
Require_table_primary_key_check [无] 13 通道对表是否必须具有用于 CREATE TABLEALTER TABLE 操作的主键的策略
Assign_gtids_to_anonymous_transactions_type [无] 14 如果该通道将 GTID 分配给尚未拥有 GTID 的复制事务,使用副本的本地 UUID,则此值为 LOCAL;如果该通道使用手动设置的 UUID 代替,则此值为 UUID。如果该通道在这种情况下不分配 GTID,则此值为 OFF
Assign_gtids_to_anonymous_transactions_value [无] 15 分配给匿名事务的 GTID 中使用的 UUID