Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

19.2.4.2 复制元数据存储库

副本服务器创建两个复制元数据存储库,连接元数据存储库和应用元数据存储库。这些复制元数据存储库可以在副本服务器关闭后继续存在。如果使用基于二进制日志文件位置的复制,在副本服务器重新启动时,它将读取这两个存储库,以确定它之前在从源服务器的二进制日志中读取了多少,并在其自己的中继日志中处理了多少。如果使用基于GTID的复制,副本服务器不使用这些复制元数据存储库来确定进度,但需要它们来包含其他元数据。

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

  • 副本的 应用元数据存储库 包含复制SQL(applier)线程从副本的中继日志中读取和应用事务所需的信息。该存储库中的元数据包括副本applier线程在中继日志中执行事务的文件名和位置,以及在源服务器的二进制日志中的等效位置。它还包括应用事务的元数据,例如worker线程的数量和 PRIVILEGE_CHECKS_USER 账户用于通道。

连接元数据存储库写入 mysql 系统模式中的 slave_master_info 表,而应用元数据存储库写入 mysql 系统模式中的 slave_relay_log_info 表。如果 mysqld 无法初始化复制元数据存储库的表,副本服务器将继续启动,但会发出警告信息。

Important
  1. 不要尝试手动更新或插入 mysql.slave_master_infomysql.slave_relay_log_info 表中的行。这可能会导致未定义的行为,并且不受支持。在复制进行时,不允许执行需要写锁定的语句,但读取语句可以在任何时候执行。

  2. 连接元数据存储库表 mysql.slave_master_info 的访问权限应该限制在数据库管理员,因为它包含了复制用户账户名称和密码用于连接到源服务器。使用受限的访问模式来保护包含该表的数据库备份。你可以从连接元数据存储库中清除复制用户账户凭据,而是使用 START REPLICA 语句来启动复制通道。这意味着复制通道总是需要操作员干预来重新启动,但账户名称和密码不会被记录在复制元数据存储库中。

RESET REPLICA 清除复制元数据存储库中的数据,除非是复制连接参数(取决于 MySQL 服务器版本)。有关详细信息,请参阅 RESET REPLICA 的描述。

你可以设置 CHANGE REPLICATION SOURCE TO 语句的 GTID_ONLY 选项,以停止复制通道将文件名和文件位置写入复制元数据存储库。这避免了在 GTID 基础复制不需要时对表的写入和读取。使用 GTID_ONLY 设置时,连接元数据存储库和应用元数据存储库不会在副本队列和应用事务时更新,或者在复制线程停止和启动时。文件位置将在内存中跟踪,可以使用 SHOW REPLICA STATUS 查看。如果需要。复制元数据存储库仅在以下情况下同步:

  • 当发出 更改复制源到 语句时。

  • 当发出 RESET REPLICA 语句时。RESET REPLICA ALL 删除而不是更新存储库,因此它们隐式同步。

  • 当复制通道被初始化时。

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

创建复制元数据存储库作为表是默认的;使用文件是 deprecated。

mysql.slave_master_infomysql.slave_relay_log_info 表是使用 InnoDB 事务存储引擎创建的。对 applier 元数据存储库表的更新与事务一起提交,这意味着复制进度信息记录在该存储库中总是与数据库中应用的内容一致,即使在意外服务器停止的情况下。有关在意外停止的情况下复制服务器的组合设置的信息,请参阅 第 19.4.2 节,“处理意外停止的复制服务器”

当您备份复制服务器的数据或将其快照传输以创建新复制服务器时,请确保包括 mysql.slave_master_infomysql.slave_relay_log_info 表中的复制元数据存储库。在克隆操作中,请注意,当复制元数据存储库创建为表时,它们将在克隆操作期间被复制,但当它们创建为文件时,它们不会被复制。当使用二进制日志文件位置基于复制时,复制元数据存储库是必要的,以便在恢复复制服务器后重新启动复制。如果您没有中继日志文件,但仍然有 applier 元数据存储库,您可以检查它,以确定复制 SQL 线程在源的二进制日志中的执行位置。然后,您可以使用 更改复制源到 语句,带有 SOURCE_LOG_FILESOURCE_LOG_POS 选项,以告诉复制服务器从该点重新读取源的二进制日志(假设所需的二进制日志仍然存在于源上)。

还有一个额外的存储库,即 applier 工作线程元数据存储库,主要用于内部使用,持有多线程复制服务器上工作线程的状态信息。applier 工作线程元数据存储库包括每个工作线程的中继日志文件和源的二进制日志文件的名称和位置。如果 applier 元数据存储库创建为表,默认情况下,applier 工作线程元数据存储库将写入 mysql.slave_worker_info 表。如果 applier 元数据存储库写入文件,applier 工作线程元数据存储库将写入 worker-relay-log.info 文件。对于外部使用,工作线程的状态信息将在性能模式 replication_applier_status_by_worker 表中呈现。

复制元数据存储库最初包含类似于 SHOW REPLICA STATUS 语句输出的信息,该语句在 第 15.4.2 节,“SQL 语句控制复制服务器” 中讨论。自那以来,更多信息已添加到复制元数据存储库中,但不显示在 SHOW REPLICA STATUS 语句中。

对于连接元数据存储库,以下表显示了 mysql.slave_master_info 表的列、SHOW REPLICA STATUS 语句显示的列和 deprecated 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 复制使用的网络接口
Ignored_server_ids Replicate_Ignore_Server_Ids 18 要忽略的服务器 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 显示的列和 deprecated 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日志文件的名称
Relay_log_pos Relay_Log_Pos 3 relay日志文件中的当前位置;到该位置的事件已经在副本数据库上执行
Master_log_name Relay_Source_Log_File 4 源的二进制日志文件的名称,该文件中的事件被读取到relay日志文件中
Master_log_pos Exec_Source_Log_Pos 5 副本的二进制日志文件中执行的事件的等效位置
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 TABLEALTER TABLE 操作
Assign_gtids_to_anonymous_transactions_type [None] 14 如果通道将GTID分配给没有GTID的复制事务,使用副本的本地UUID,则该值为 LOCAL;如果通道使用手动设置的UUID,则该值为 UUID。如果通道不分配GTID,则该值为 OFF
Assign_gtids_to_anonymous_transactions_value [None] 15 分配给匿名事务的GTID使用的UUID