副本服务器创建两个复制元数据存储库,连接元数据存储库和应用程序元数据存储库。复制元数据存储库在副本服务器关闭后仍然存在。如果正在使用基于二进制日志文件位置的复制,当副本重新启动时,它会读取两个存储库以确定它之前从源读取二进制日志和处理自己的中继日志的进度。如果正在使用基于 GTID 的复制,则副本不会为此目的使用复制元数据存储库,但确实需要它们用于它们包含的其他元数据。
副本的连接元数据存储库包含复制 I/O(接收方)线程连接到复制源服务器并从源的二进制日志检索事务所需的信息。此存储库中的元数据包括连接配置、复制用户帐户详细信息、连接的 SSL 设置以及复制接收器线程当前从源的二进制日志中读取的文件名和位置。
副本的应用程序元数据存储库包含复制 SQL(应用程序)线程从副本的中继日志读取和应用事务所需的信息。此存储库中的元数据包括文件名和复制应用程序线程在中继日志中执行事务的位置,以及源二进制日志中的等效位置。它还包括应用事务过程的元数据,例如工作线程的数量和
PRIVILEGE_CHECKS_USER
通道的帐户。
连接元数据存储库写入
系统模式
slave_master_info
中的表,
应用程序元数据存储库写入系统模式中的表
。如果mysqld无法初始化复制元数据存储库的表,则会发出警告消息,但允许副本继续启动。当从不支持对存储库使用表的 MySQL 版本升级到支持它们的版本时,最有可能发生这种情况。
mysql
slave_relay_log_info
mysql
不要尝试 手动更新或插入表
mysql.slave_master_info
中 的行。mysql.slave_relay_log_info
这样做会导致未定义的行为,并且不受支持。当复制正在进行时,不允许 执行任何需要对slave_master_info
和 表中的一个或两个写锁定的 语句(尽管在任何时候都允许只执行读取的语句)。slave_relay_log_info
连接元数据存储库表的访问权限
mysql.slave_master_info
应仅限于数据库管理员,因为它包含用于连接到源的复制用户帐户名和密码。使用受限访问模式来保护包含此表的数据库备份。从 MySQL 8.0.21 开始,您可以从连接元数据存储库中清除复制用户帐户凭据,而是始终使用START REPLICA
语句或START GROUP_REPLICATION
启动复制通道的语句。这种方法意味着复制通道总是需要操作员干预才能重新启动,但帐户名和密码不会记录在复制元数据存储库中。
RESET
REPLICA
清除复制元数据存储库中的数据,复制连接参数除外(取决于 MySQL 服务器版本)。有关详细信息,请参阅 的说明
RESET
REPLICA
。
从 MySQL 8.0.27 开始,您可以GTID_ONLY
在语句上设置选项CHANGE REPLICATION
SOURCE TO
以停止复制通道在复制元数据存储库中保留文件名和文件位置。这避免了在基于 GTID 的复制实际上不需要它们的情况下对表进行写入和读取。通过该GTID_ONLY
设置,当副本在事务中排队和应用事件时,或者当复制线程停止和启动时,连接元数据存储库和应用程序元数据存储库不会更新。文件位置在内存中跟踪,可以使用SHOW
REPLICA STATUS
声明是否需要。复制元数据存储库仅在以下情况下同步:
发表
RESET REPLICA
声明时。RESET REPLICA ALL
删除而不是更新存储库,因此它们是隐式同步的。初始化复制通道时。
如果复制元数据存储库从文件移动到表。
在 MySQL 8.0 之前,要将复制元数据存储库创建为表,必须
在服务器启动时指定master_info_repository=TABLE
和
。relay_log_info_repository=TABLE
否则,存储库将创建为名为
master.info
and
的数据目录中的文件,或者使用由选项和
系统变量relay-log.info
指定的替代名称和位置
。从 MySQL 8.0 开始,默认将复制元数据存储库创建为表,并且不推荐使用所有这些系统变量。
--master-info-file
relay_log_info_file
mysql.slave_master_info
和
mysql.slave_relay_log_info
表是使用InnoDB
事务存储引擎创建
的。应用程序元数据存储库表的更新与事务一起提交,这意味着记录在该存储库中的副本进度信息始终与已应用到数据库的内容一致,即使在服务器意外停机的情况下也是如此。有关对意外停止最具弹性的副本设置组合的信息,请参阅
第 17.4.2 节,“处理副本的意外停止”。
当您备份副本数据或传输其数据快照以创建新副本时,请确保包含
mysql.slave_master_info
和
mysql.slave_relay_log_info
包含复制元数据存储库的表。对于克隆操作,请注意当复制元数据存储库创建为表时,它们会在克隆操作期间复制到接收者,但当它们创建为文件时,它们不会被复制。当使用基于二进制日志文件位置的复制时,需要复制元数据存储库在重新启动还原、复制或克隆的副本后恢复复制。如果你没有中继日志文件,但仍然有应用程序元数据存储库,你可以检查它以确定复制 SQL 线程在源的二进制日志中执行了多远。然后你可以使用一个CHANGE
REPLICATION SOURCE TO
语句(来自 MySQL 8.0.23)或者
CHANGE MASTER TO
声明(在 MySQL 8.0.23 之前)与
SOURCE_LOG_FILE
|
MASTER_LOG_FILE
和
SOURCE_LOG_POS
|
MASTER_LOG_POS
告诉副本从那时起从源重新读取二进制日志的选项(前提是源上仍然存在所需的二进制日志)。
另一个存储库,即应用程序工作人员元数据存储库,主要供内部使用而创建,并保存有关多线程副本上工作线程的状态信息。applier worker 元数据存储库包括中继日志文件的名称和位置以及每个工作线程的源二进制日志文件。如果将应用程序元数据存储库创建为表(这是默认设置),则将应用程序工作人员元数据存储库写入该
mysql.slave_worker_info
表。如果将应用程序元数据存储库写入文件,则将应用程序工作人员元数据存储库写入该
worker-relay-log.info
文件。对于外部使用,工作线程的状态信息显示在性能模式中
replication_applier_status_by_worker
桌子。
复制元数据存储库最初包含的信息类似于语句输出中显示的信息
SHOW
REPLICA STATUS
,这在
第 13.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 TABLE 和ALTER
TABLE 操作的主键的策略 |
Assign_gtids_to_anonymous_transactions_type |
[没有任何] | 14 | 如果通道使用副本的本地 UUID 为尚无 GTID 的复制事务分配 GTID,则此值为LOCAL ;如果通道使用手动设置的 UUID 而不是这样做,则值为UUID . 如果通道在这种情况下没有分配 GTID,则值为
OFF . |
Assign_gtids_to_anonymous_transactions_value |
[没有任何] | 15 | 分配给匿名交易的 GTID 中使用的 UUID |