16.2.4.2 复制申请人元数据存储库
副本服务器创建两个复制应用程序元数据存储库,即复制连接元数据存储库和复制应用程序元数据存储库。复制应用程序元数据存储库在复制服务器关闭后仍可生存。如果正在使用基于二进制日志文件位置的复制,则当副本重新启动时,它将读取两个存储库以确定先前从源读取二进制日志并处理其自己的中继日志时进行了多长时间。如果正在使用基于 GTID 的复制,则该副本不会出于该目的使用复制应用程序元数据存储库,但确实需要它们用于它们包含的其他元数据。
-
“复制连接元数据存储库”包含复制 I/O 线程连接到复制源服务器并从源的二进制日志中检索事务所需的信息。此存储库中的元数据包括连接配置,复制用户帐户详细信息,连接的 SSL 设置,以及复制 I/O 线程当前正在从源二进制日志读取的文件名和位置。
-
“复制应用程序元数据存储库”包含复制 SQL 线程读取和应用副本的中继日志中的事务所需的信息。此存储库中的元数据包括复制 SQL 线程已在中继日志中执行事务的文件名和位置,以及源二进制日志中的等效位置。它还包括用于应用事务处理的元数据,例如工作线程数。
默认情况下,复制应用程序元数据存储库在文件名为master.info
和relay-log.info
的数据目录中创建为文件,或者使用--master-info-file选项和relay_log_info_file系统变量指定的替代名称和位置。要将复制应用程序元数据存储库创建为 table,请在服务器启动时指定master_info_repository=TABLE和relay_log_info_repository=TABLE。在这种情况下,将复制连接元数据存储库写入mysql
系统模式中的slave_master_info
table,并将复制应用程序元数据存储库写入mysql
系统模式中的slave_relay_log_info
table。如果mysqld无法初始化复制应用程序元数据存储库的 table,则发出警告消息,但允许该副本 continue 启动。从不支持对存储库使用 table 的 MySQL 版本升级到支持 table 的 MySQL 时,最有可能发生这种情况。
Important
-
不要尝试手动在
mysql.slave_master_info
或mysql.slave_relay_log_info
table 中更新或插入行。这样做可能导致未定义的行为,并且不受支持。在复制过程中,不允许在slave_master_info
和slave_relay_log_info
table 中的一个或两个上执行任何需要写锁定的语句(尽管随时允许只执行读取的语句)。 -
对复制连接元数据存储库文件或 table 的访问应仅限于数据库 Management 员,因为它包含用于连接到源的复制用户帐户名和密码。使用受限访问模式来保护包含此存储库的数据库备份。
RESET SLAVE清除复制应用程序元数据存储库中的数据,但复制连接参数除外(取决于 MySQL Server 版本和存储库类型)。有关详细信息,请参见RESET SLAVE的描述。
如果将master_info_repository和relay_log_info_repository设置为TABLE
,则使用InnoDB事务存储引擎创建mysql.slave_master_info
和mysql.slave_relay_log_info
table。对复制应用程序元数据存储库 table 的更新将与事务一起提交,这意味着即使在服务器意外停止的情况下,记录在该存储库中的副本的进度信息也始终与已应用于数据库的信息一致。必须在副本上启用--relay-log-recovery选项以确保弹性。有关更多详细信息,请参见第 16.3.2 节“处理副本意外停止”。
备份副本的数据或传输其数据的快照以创建新副本时,请确保在数据目录中包括包含复制应用程序元数据存储库的mysql.slave_master_info
和mysql.slave_relay_log_info
table 或等效文件(master.info
和relay-log.info
),除非您指定了其他名称和位置)。使用基于二进制日志文件位置的复制时,在重新启动已还原或复制的副本之后,需要复制应用程序元数据存储库来恢复复制。如果您没有中继日志文件,但是仍然有复制应用程序元数据存储库,则可以检查它以确定复制 SQL 线程在源二进制日志中执行了多远。然后,您可以使用带有MASTER_LOG_FILE
和MASTER_LOG_POS
选项的更改为主语句,告诉副本从该点重新读取源中的二进制日志(前提是所需的二进制日志仍存在于源中)。
另外一个存储库,即复制应用程序工作者元数据存储库,主要供内部使用,并且在多线程副本上保留有关工作线程的状态信息。复制应用程序工作者元数据存储库包括中继日志文件的名称和位置,以及每个工作者线程的源二进制日志文件。如果将复制应用程序元数据存储库创建为默认 table,则复制应用程序工作人员元数据存储库将写入mysql.slave_worker_info
table。如果将复制应用程序元数据存储库写入文件,则复制应用程序辅助元数据存储库将写入worker-relay-log.info
文件。供外部使用,性能模式replication_applier_status_by_workertable 中提供了工作线程的状态信息。
复制应用程序元数据存储库最初包含的信息类似于显示从站状态语句的输出中显示的信息,该信息在第 13.4.2 节“用于控制副本服务器的 SQL 语句”中进行了讨论。此后,进一步的信息已添加到复制应用程序元数据存储库中,而显示从站状态语句未显示该信息。
对于复制连接元数据存储库,下 table 显示了mysql.slave_master_info
table 中的列,显示从站状态显示的列和master.info
文件中的行之间的对应关系。
master.info 文件行 |
slave_master_info table 格栏 |
SHOW SLAVE STATUS 列 |
Description |
---|---|---|---|
1 | Number_of_lines |
[None] | 文件中的行数或 table 中的列数 |
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 |
密码(显示从站状态未显示) | 用于连接到源的密码 |
7 | Port |
Master_Port |
用于连接到源的网络端口 |
8 | Connect_retry |
Connect_Retry |
副本在尝试重新连接到源之前将 await 的时间(以秒为单位) |
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 连接握手中使用的可能密码的列 table |
14 | Ssl_key |
Master_SSL_Key |
SSL 密钥文件的名称 |
15 | Ssl_verify_server_cert |
Master_SSL_Verify_Server_Cert |
是否验证服务器证书 |
16 | Heartbeat |
[None] | 复制心跳之间的间隔(以秒为单位) |
17 | Bind |
Master_Bind |
应该使用哪个副本的网络接口连接到源 |
18 | Ignored_server_ids |
Replicate_Ignore_Server_Ids |
要忽略的服务器 ID 列 table。请注意,对于Ignored_server_ids ,服务器 ID 列 table 的前面是要忽略的服务器 ID 的总数。 |
19 | Uuid |
Master_UUID |
来源的唯一 ID |
20 | Retry_count |
Master_Retry_Count |
允许的最大重新连接尝试次数 |
21 | Ssl_crl |
[None] | SSL 证书吊销列 table 文件的路径 |
22 | Ssl_crlpath |
[None] | 包含 SSL 证书吊销列 table 文件的目录的路径 |
23 | Enabled_auto_position |
Auto_position |
是否正在使用自动定位 |
24 | Channel_name |
Channel_name |
复制通道的名称 |
25 | Tls_version |
Master_TLS_Version |
来源的 TLS 版本 |
对于复制应用程序元数据存储库,下 table 显示了mysql.slave_relay_log_info
table 中的列,显示从站状态显示的列和relay-log.info
文件中的行之间的对应关系。
在relay-log.info 行 |
slave_relay_log_info table 格栏 |
SHOW SLAVE STATUS 列 |
Description |
---|---|---|---|
1 | Number_of_lines |
[None] | 文件中的行数或 table 中的列数 |
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 |
源的二进制日志文件中已执行事件的等效位置 |
6 | Sql_delay |
SQL_Delay |
副本必须滞后于源的秒数 |
7 | Number_of_workers |
[None] | 副本上用于并行执行复制事件(事务)的工作线程数 |
8 | Id |
[None] | 内部使用的 ID;目前这总是 1 |
9 | Channel_name |
Channel_name | 复制通道的名称 |
在 MySQL 5.6 之前的 MySQL 版本中,relay-log.info
文件不包含行数或延迟值(并且slave_relay_log_info
table 不可用)。
Line | Status Column | Description |
---|---|---|
1 | Relay_Log_File |
当前中继日志文件的名称 |
2 | Relay_Log_Pos |
中继日志文件中的当前位置;副本数据库上已执行到此位置的事件 |
3 | Relay_Master_Log_File |
源的二进制日志文件的名称,从中读取中继日志文件中的事件 |
4 | Exec_Master_Log_Pos |
源的二进制日志文件中已执行事件的等效位置 |
Note
如果将副本服务器降级到 MySQL 5.6 之前的版本,则旧服务器将无法正确读取relay-log.info
文件。若要解决此问题,请在文本编辑器中通过删除包含行数的初始行来修改文件。
如果relay-log.info
文件尚未刷新到磁盘,则relay-log.info
文件的内容和显示从站状态语句显示的状态可能不匹配。理想情况下,您只应在脱机副本(即mysqld
未运行)上查看relay-log.info
。对于正在运行的系统,如果要将复制应用程序元数据存储库写入 table,则可以使用显示从站状态或查询mysql.slave_master_info
和mysql.slave_relay_log_info
table。