副本服务器创建两个复制元数据存储库,连接元数据存储库和应用程序元数据存储库。复制元数据存储库在副本服务器关闭后仍然存在。如果正在使用基于二进制日志文件位置的复制,当副本重新启动时,它会读取两个存储库以确定它之前从源读取二进制日志和处理自己的中继日志的进度。
副本的连接元数据存储库包含复制 I/O 线程连接到复制源服务器并从源的二进制日志中检索事务所需的信息。此存储库中的元数据包括连接配置、复制用户帐户详细信息、连接的 SSL 设置以及复制 I/O 线程当前从源二进制日志中读取的文件名和位置。
副本的应用程序元数据存储库包含复制 SQL 线程从副本的中继日志读取和应用事务所需的信息。此存储库中的元数据包括复制 SQL 线程在中继日志中执行事务的文件名和位置,以及源二进制日志中的等效位置。它还包括应用事务过程的元数据,例如工作线程的数量。
默认情况下,复制元数据存储库创建为名为
master.info
and
的数据目录中的文件,或者使用由选项和
系统变量relay-log.info
指定的替代名称和位置
。要将复制元数据存储库创建为表,请
在服务器启动时指定
和
。在这种情况下,副本的连接元数据存储库将写入
系统模式
中的表
,而副本的应用程序元数据存储库将写入系统模式中的表
。如果mysqld发出警告消息--master-info-file
relay_log_info_file
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave_master_info
mysql
slave_relay_log_info
mysql
无法初始化复制元数据存储库的表,但允许副本继续启动。当从不支持对存储库使用表的 MySQL 版本升级到支持它们的版本时,最有可能发生这种情况。
不要尝试 手动更新或插入表
mysql.slave_master_info
中 的行。mysql.slave_relay_log_info
这样做会导致未定义的行为,并且不受支持。当复制正在进行时,不允许 执行任何需要对slave_master_info
和 表中的一个或两个写锁定的 语句(尽管在任何时候都允许只执行读取的语句)。slave_relay_log_info
对副本的连接元数据存储库文件或表的访问应仅限于数据库管理员,因为它包含用于连接到源的复制用户帐户名和密码。使用受限访问模式来保护包含此存储库的数据库备份。
RESET SLAVE
清除复制元数据存储库中的数据,复制连接参数除外(取决于 MySQL 服务器版本和存储库类型)。有关详细信息,请参阅 的说明RESET SLAVE
。
在 MySQL 5.6.5 及更早版本中,
默认使用slave_master_info
和
slave_relay_log_info
表
MyISAM
,这意味着在开始复制之前有必要通过发出 来更改这些表使用的存储引擎
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_repository
and
设置relay_log_info_repository
为
TABLE
,则将
使用事务存储引擎创建mysql.slave_master_info
和
mysql.slave_relay_log_info
表。InnoDB
作为一个表,对副本的应用程序元数据存储库的更新与事务一起提交,这意味着记录在该日志中的副本的进度信息始终与已应用于数据库的信息一致,即使在服务器意外停机的情况下也是如此。--relay-log-recovery
必须在副本上启用该
选项以保证弹性。有关详细信息,请参阅
第 17.3.2 节,“处理副本服务器的意外停止”。
当您备份副本的数据或传输其数据的快照以创建新的副本时,请确保您包括包含复制元数据存储库的
mysql.slave_master_info
和
mysql.slave_relay_log_info
表,或等效文件(master.info
和
relay-log.info
在数据目录中,除非您指定了替代名称和位置)。当使用基于二进制日志文件位置的复制时,复制元数据存储库需要在重新启动恢复或复制的副本后恢复复制。如果您没有中继日志文件,但仍有副本的应用程序元数据存储库,您可以检查它以确定复制 SQL 线程在源的二进制日志中执行了多远。然后您可以使用
带有和
选项的CHANGE MASTER TO
语句告诉副本从该点重新读取来自源的二进制日志(前提是源上仍然存在所需的二进制日志)。
MASTER_LOG_FILE
MASTER_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 STATUS
和master.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 STATUS
和relay-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
STATUS
relay-log.info
relay-log.info
mysqld
SHOW SLAVE
STATUS
slave_master_info
slave_relay_log_info