副本服务器创建两个复制元数据存储库,连接元数据存储库和应用元数据存储库。这些复制元数据存储库可以在副本服务器关闭后继续存在。如果使用基于二进制日志文件位置的复制,在副本服务器重新启动时,它将读取这两个存储库,以确定它之前在从源服务器的二进制日志中读取了多少,并在其自己的中继日志中处理了多少。如果使用基于GTID的复制,副本服务器不使用这些复制元数据存储库来确定进度,但需要它们来包含其他元数据。
-
副本的 连接元数据存储库 包含复制I/O(receiver)线程连接到复制源服务器并从源服务器的二进制日志中检索事务所需的信息。该存储库中的元数据包括连接配置、复制用户账户详细信息、连接的SSL设置和副本receiver线程当前从源服务器的二进制日志中读取的文件名和位置。
-
副本的 应用元数据存储库 包含复制SQL(applier)线程从副本的中继日志中读取和应用事务所需的信息。该存储库中的元数据包括副本applier线程在中继日志中执行事务的文件名和位置,以及在源服务器的二进制日志中的等效位置。它还包括应用事务的元数据,例如worker线程的数量和
PRIVILEGE_CHECKS_USER
账户用于通道。
连接元数据存储库写入 mysql
系统模式中的 slave_master_info
表,而应用元数据存储库写入 mysql
系统模式中的 slave_relay_log_info
表。如果 mysqld 无法初始化复制元数据存储库的表,副本服务器将继续启动,但会发出警告信息。
-
不要尝试手动更新或插入
mysql.slave_master_info
或mysql.slave_relay_log_info
表中的行。这可能会导致未定义的行为,并且不受支持。在复制进行时,不允许执行需要写锁定的语句,但读取语句可以在任何时候执行。 -
连接元数据存储库表
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_info
和 mysql.slave_relay_log_info
表是使用 InnoDB
事务存储引擎创建的。对 applier 元数据存储库表的更新与事务一起提交,这意味着复制进度信息记录在该存储库中总是与数据库中应用的内容一致,即使在意外服务器停止的情况下。有关在意外停止的情况下复制服务器的组合设置的信息,请参阅 第 19.4.2 节,“处理意外停止的复制服务器”。
当您备份复制服务器的数据或将其快照传输以创建新复制服务器时,请确保包括 mysql.slave_master_info
和 mysql.slave_relay_log_info
表中的复制元数据存储库。在克隆操作中,请注意,当复制元数据存储库创建为表时,它们将在克隆操作期间被复制,但当它们创建为文件时,它们不会被复制。当使用二进制日志文件位置基于复制时,复制元数据存储库是必要的,以便在恢复复制服务器后重新启动复制。如果您没有中继日志文件,但仍然有 applier 元数据存储库,您可以检查它,以确定复制 SQL 线程在源的二进制日志中的执行位置。然后,您可以使用 更改复制源到
语句,带有 SOURCE_LOG_FILE
和 SOURCE_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 TABLE 和 ALTER 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 |