17.2.2.2 复制元数据存储库

副本服务器创建两个复制元数据存储库,连接元数据存储库和应用程序元数据存储库。复制元数据存储库在副本服务器关闭后仍然存在。如果正在使用基于二进制日志文件位置的复制,当副本重新启动时,它会读取两个存储库以确定它之前从源读取二进制日志和处理自己的中继日志的进度。

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

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

默认情况下,复制元数据存储库创建为名为 master.infoand 的数据目录中的文件,或者使用由选项和 系统变量relay-log.info指定的替代名称和位置 。要将复制元数据存储库创建为表,请 在服务器启动时指定 和 。在这种情况下,副本的连接元数据存储库将写入 系统模式 中的表 ,而副本的应用程序元数据存储库将写入系统模式中的表 。如果mysqld发出警告消息--master-info-filerelay_log_info_filemaster_info_repository=TABLErelay_log_info_repository=TABLEslave_master_infomysqlslave_relay_log_infomysql无法初始化复制元数据存储库的表,但允许副本继续启动。当从不支持对存储库使用表的 MySQL 版本升级到支持它们的版本时,最有可能发生这种情况。

重要的
  1. 不要尝试 手动更新或插入表mysql.slave_master_info中 的行。mysql.slave_relay_log_info这样做会导致未定义的行为,并且不受支持。当复制正在进行时,不允许 执行任何需要对slave_master_info和 表中的一个或两个写锁定的 语句(尽管在任何时候都允许只执行读取的语句)。slave_relay_log_info

  2. 对副本的连接元数据存储库文件或表的访问应仅限于数据库管理员,因为它包含用于连接到源的复制用户帐户名和密码。使用受限访问模式来保护包含此存储库的数据库备份。

RESET SLAVE清除复制元数据存储库中的数据,复制连接参数除外(取决于 MySQL 服务器版本和存储库类型)。有关详细信息,请参阅 的说明RESET SLAVE

在 MySQL 5.6.5 及更早版本中, 默认使用slave_master_infoslave_relay_log_infoMyISAM,这意味着在开始复制之前有必要通过发出 来更改这些表使用的存储引擎 ALTER TABLE ... ENGINE=InnoDB,如下所示:

ALTER TABLE mysql.slave_master_info ENGINE=InnoDB;
ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB;

这些ALTER TABLE语句必须由 MySQL或其他对系统数据库root具有适当权限的用户帐户 执行。mysql您不应在复制运行时尝试执行此操作;ALTER TABLE从 MySQL 5.6.3 开始,不允许在复制进行时 尝试在这些表上执行。

从 MySQL 5.6.6 开始,如果将 master_info_repositoryand 设置relay_log_info_repositoryTABLE,则将 使用事务存储引擎创建mysql.slave_master_infomysql.slave_relay_log_info表。InnoDB作为一个表,对副本的应用程序元数据存储库的更新与事务一起提交,这意味着记录在该日志中的副本的进度信息始终与已应用于数据库的信息一致,即使在服务器意外停机的情况下也是如此。--relay-log-recovery必须在副本上启用该 选项以保证弹性。有关详细信息,请参阅 第 17.3.2 节,“处理副本服务器的意外停止”

当您备份副本的数据或传输其数据的快照以创建新的副本时,请确保您包括包含复制元数据存储库的 mysql.slave_master_infomysql.slave_relay_log_info表,或等效文件(master.inforelay-log.info在数据目录中,除非您指定了替代名称和位置)。当使用基于二进制日志文件位置的复制时,复制元数据存储库需要在重新启动恢复或复制的副本后恢复复制。如果您没有中继日志文件,但仍有副本的应用程序元数据存储库,您可以检查它以确定复制 SQL 线程在源的二进制日志中执行了多远。然后您可以使用 带有和 选项的CHANGE MASTER TO语句告诉副本从该点重新读取来自源的二进制日志(前提是源上仍然存在所需的二进制日志)。 MASTER_LOG_FILEMASTER_LOG_POS

另一个存储库,即应用程序工作人员元数据存储库,主要供内部使用而创建,并保存有关多线程副本上工作线程的状态信息。applier worker 元数据存储库包括中继日志文件的名称和位置以及每个工作线程的源二进制日志文件。如果副本的应用程序元数据存储库创建为表(默认情况下),则应用程序工作人员元数据存储库将写入该 mysql.slave_worker_info表。如果将应用程序元数据存储库写入文件,则将应用程序工作人员元数据存储库写入 worker-relay-log.info文件。对于外部使用,工作线程的状态信息显示在性能模式 replication_applier_status_by_worker 表中。

复制元数据存储库最初包含的信息类似于语句输出中显示的信息 SHOW SLAVE STATUS,这在 第 13.4.2 节“用于控制副本服务器的 SQL 语句”中进行了讨论。此后,更多信息已添加到复制元数据存储库中,该 SHOW SLAVE STATUS声明未显示这些信息。

对于连接元数据仓库,下表显示了 mysql.slave_master_info表格中的列、 显示的列SHOW SLAVE STATUSmaster.info文件中的行之间的对应关系。

master.info文件行 slave_master_info表列 SHOW SLAVE STATUS柱子 描述
1个 Number_of_lines [没有任何] 文件中的行数,或表中的列数
2个 Master_log_name Master_Log_File 当前正在从源中读取的二进制日志的名称
3个 Master_log_pos Read_Master_Log_Pos 从源读取的二进制日志中的当前位置
4个 Host Master_Host 源服务器的主机名
5个 User_name Master_User 用于连接到源的复制用户名
6个 User_password 密码(未显示SHOW SLAVE STATUS 用于连接源的密码
7 Port Master_Port 用于连接源的网络端口
8个 Connect_retry Connect_Retry 副本在尝试重新连接到源之前等待的时间(以秒为单位)
9 Enabled_ssl Master_SSL_Allowed 指示服务器是否支持 SSL 连接
10 Ssl_ca Master_SSL_CA_File 用于证书颁发机构 (CA) 证书的文件
11 Ssl_capath Master_SSL_CA_Path 证书颁发机构 (CA) 证书的路径
12 Ssl_cert Master_SSL_Cert SSL 证书文件的名称
13 Ssl_cipher Master_SSL_Cipher 用于 SSL 连接的握手中可能使用的密码列表
14 Ssl_key Master_SSL_Key SSL 密钥文件的名称
15 Ssl_verify_server_cert Master_SSL_Verify_Server_Cert 是否验证服务器证书
16 Heartbeat [没有任何] 复制心跳之间的间隔,以秒为单位
17 Bind Master_Bind 应使用副本的哪个网络接口连接到源
18 Ignored_server_ids Replicate_Ignore_Server_Ids 要忽略的服务器 ID 列表。请注意,对于 Ignored_server_ids服务器 ID 列表,前面是要忽略的服务器 ID 总数。
19 Uuid Master_UUID 源的唯一 ID
20 Retry_count Master_Retry_Count 允许的最大重新连接尝试次数
21 Ssl_crl [没有任何] SSL 证书撤销列表文件的路径
22 Ssl_crl_path [没有任何] 包含 SSL 证书撤销列表文件的目录的路径
23 Enabled_auto_position Auto_position 是否使用自动定位(MySQL 5.6.5版本新增)

对于applier元数据仓库,下表展示了 mysql.slave_relay_log_info表格中的列、显示的列SHOW SLAVE STATUSrelay-log.info文件中的行的对应关系。

线路输入relay-log.info slave_relay_log_info表列 SHOW SLAVE STATUS柱子 描述
1个 Number_of_lines [没有任何] 文件中的行数或表中的列数
2个 Relay_log_name Relay_Log_File 当前中继日志文件的名称
3个 Relay_log_pos Relay_Log_Pos 中继日志文件中的当前位置;到此位置的事件已在副本数据库上执行
4个 Master_log_name Relay_Master_Log_File 从中读取中继日志文件中的事件的源二进制日志文件的名称
5个 Master_log_pos Exec_Master_Log_Pos 已执行事件在源的二进制日志文件中的等效位置
5个 Sql_delay SQL_Delay 副本必须滞后源的秒数
6个 Number_of_workers [没有任何] 副本上用于并行执行复制事件(事务)的工作线程数
7 Id [没有任何] 用于内部目的的 ID;目前这总是 1

在 MySQL 5.6 之前,该relay-log.info文件不包括行数或延迟值(并且该 slave_relay_log_info表不可用)。

线 状态栏 描述
1个 Relay_Log_File 当前中继日志文件的名称
2个 Relay_Log_Pos 中继日志文件中的当前位置;到此位置的事件已在副本数据库上执行
3个 Relay_Master_Log_File 从中读取中继日志文件中的事件的源二进制日志文件的名称
4个 Exec_Master_Log_Pos 已执行事件在源的二进制日志文件中的等效位置
笔记

如果将副本服务器降级到早于 MySQL 5.6 的版本,则旧服务器无法 relay-log.info正确读取文件。要解决此问题,请通过删除包含行数的初始行来在文本编辑器中修改文件。

如果文件尚未刷新到磁盘,文件 的内容和语句 relay-log.info显示的状态可能不匹配。理想情况下,您应该只查看 离线(即未运行)的副本。对于正在运行的系统,如果要将复制元数据存储库写入表,则 可以使用或查询 和 表。SHOW SLAVE STATUSrelay-log.inforelay-log.infomysqldSHOW SLAVE STATUSslave_master_infoslave_relay_log_info