16.2.4.2 复制申请人元数据存储库

副本服务器创建两个复制应用程序元数据存储库,即复制连接元数据存储库和复制应用程序元数据存储库。复制应用程序元数据存储库在复制服务器关闭后仍可生存。如果正在使用基于二进制日志文件位置的复制,则当副本重新启动时,它将读取两个存储库以确定先前从源读取二进制日志并处理其自己的中继日志时进行了多长时间。如果正在使用基于 GTID 的复制,则该副本不会出于该目的使用复制应用程序元数据存储库,但确实需要它们用于它们包含的其他元数据。

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

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

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

Important

  • 不要尝试手动在mysql.slave_master_infomysql.slave_relay_log_infotable 中更新或插入行。这样做可能导致未定义的行为,并且不受支持。在复制过程中,不允许在slave_master_infoslave_relay_log_infotable 中的一个或两个上执行任何需要写锁定的语句(尽管随时允许只执行读取的语句)。

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

RESET SLAVE清除复制应用程序元数据存储库中的数据,但复制连接参数除外(取决于 MySQL Server 版本和存储库类型)。有关详细信息,请参见RESET SLAVE的描述。

如果将master_info_repositoryrelay_log_info_repository设置为TABLE,则使用InnoDB事务存储引擎创建mysql.slave_master_infomysql.slave_relay_log_infotable。对复制应用程序元数据存储库 table 的更新将与事务一起提交,这意味着即使在服务器意外停止的情况下,记录在该存储库中的副本的进度信息也始终与已应用于数据库的信息一致。必须在副本上启用--relay-log-recovery选项以确保弹性。有关更多详细信息,请参见第 16.3.2 节“处理副本意外停止”

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

另外一个存储库,即复制应用程序工作者元数据存储库,主要供内部使用,并且在多线程副本上保留有关工作线程的状态信息。复制应用程序工作者元数据存储库包括中继日志文件的名称和位置,以及每个工作者线程的源二进制日志文件。如果将复制应用程序元数据存储库创建为默认 table,则复制应用程序工作人员元数据存储库将写入mysql.slave_worker_infotable。如果将复制应用程序元数据存储库写入文件,则复制应用程序辅助元数据存储库将写入worker-relay-log.info文件。供外部使用,性能模式replication_applier_status_by_workertable 中提供了工作线程的状态信息。

复制应用程序元数据存储库最初包含的信息类似于显示从站状态语句的输出中显示的信息,该信息在第 13.4.2 节“用于控制副本服务器的 SQL 语句”中进行了讨论。此后,进一步的信息已添加到复制应用程序元数据存储库中,而显示从站状态语句未显示该信息。

对于复制连接元数据存储库,下 table 显示了mysql.slave_master_infotable 中的列,显示从站状态显示的列和master.info文件中的行之间的对应关系。

master.info文件行slave_master_infotable 格栏SHOW SLAVE STATUSDescription
1Number_of_lines[None]文件中的行数或 table 中的列数
2Master_log_nameMaster_Log_File当前正在从源中读取的二进制日志的名称
3Master_log_posRead_Master_Log_Pos从源读取的二进制日志中的当前位置
4HostMaster_Host源服务器的主机名
5User_nameMaster_User用于连接到源的复制用户名
6User_password密码(显示从站状态未显示)用于连接到源的密码
7PortMaster_Port用于连接到源的网络端口
8Connect_retryConnect_Retry副本在尝试重新连接到源之前将 await 的时间(以秒为单位)
9Enabled_sslMaster_SSL_Allowed指示服务器是否支持 SSL 连接
10Ssl_caMaster_SSL_CA_File用于证书颁发机构(CA)证书的文件
11Ssl_capathMaster_SSL_CA_Path证书颁发机构(CA)证书的路径
12Ssl_certMaster_SSL_CertSSL 证书文件的名称
13Ssl_cipherMaster_SSL_CipherSSL 连接握手中使用的可能密码的列 table
14Ssl_keyMaster_SSL_KeySSL 密钥文件的名称
15Ssl_verify_server_certMaster_SSL_Verify_Server_Cert是否验证服务器证书
16Heartbeat[None]复制心跳之间的间隔(以秒为单位)
17BindMaster_Bind应该使用哪个副本的网络接口连接到源
18Ignored_server_idsReplicate_Ignore_Server_Ids要忽略的服务器 ID 列 table。请注意,对于Ignored_server_ids,服务器 ID 列 table 的前面是要忽略的服务器 ID 的总数。
19UuidMaster_UUID来源的唯一 ID
20Retry_countMaster_Retry_Count允许的最大重新连接尝试次数
21Ssl_crl[None]SSL 证书吊销列 table 文件的路径
22Ssl_crlpath[None]包含 SSL 证书吊销列 table 文件的目录的路径
23Enabled_auto_positionAuto_position是否正在使用自动定位
24Channel_nameChannel_name复制通道的名称
25Tls_versionMaster_TLS_Version来源的 TLS 版本

对于复制应用程序元数据存储库,下 table 显示了mysql.slave_relay_log_infotable 中的列,显示从站状态显示的列和relay-log.info文件中的行之间的对应关系。

relay-log.infoslave_relay_log_infotable 格栏SHOW SLAVE STATUSDescription
1Number_of_lines[None]文件中的行数或 table 中的列数
2Relay_log_nameRelay_Log_File当前中继日志文件的名称
3Relay_log_posRelay_Log_Pos中继日志文件中的当前位置;副本数据库上已执行到此位置的事件
4Master_log_nameRelay_Master_Log_File源的二进制日志文件的名称,从中读取中继日志文件中的事件
5Master_log_posExec_Master_Log_Pos源的二进制日志文件中已执行事件的等效位置
6Sql_delaySQL_Delay副本必须滞后于源的秒数
7Number_of_workers[None]副本上用于并行执行复制事件(事务)的工作线程数
8Id[None]内部使用的 ID;目前这总是 1
9Channel_nameChannel_name复制通道的名称

在 MySQL 5.6 之前的 MySQL 版本中,relay-log.info文件不包含行数或延迟值(并且slave_relay_log_infotable 不可用)。

LineStatus ColumnDescription
1Relay_Log_File当前中继日志文件的名称
2Relay_Log_Pos中继日志文件中的当前位置;副本数据库上已执行到此位置的事件
3Relay_Master_Log_File源的二进制日志文件的名称,从中读取中继日志文件中的事件
4Exec_Master_Log_Pos源的二进制日志文件中已执行事件的等效位置

Note

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

如果relay-log.info文件尚未刷新到磁盘,则relay-log.info文件的内容和显示从站状态语句显示的状态可能不匹配。理想情况下,您只应在脱机副本(即mysqld未运行)上查看relay-log.info。对于正在运行的系统,如果要将复制应用程序元数据存储库写入 table,则可以使用显示从站状态或查询mysql.slave_master_infomysql.slave_relay_log_infotable。