复制中继和状态日志
在复制期间,从属服务器会创建几个日志,以保存从主服务器中继到从属服务器的二进制日志事件,并在中继日志中记录有关当前状态和位置的信息。在此过程中使用三种日志类型,在此处列出:
- 该中继日志包括的事件从主的二进制日志读取并从I / O线程写入。中继日志中的事件在从属服务器上作为SQL线程的一部分执行。
- 该主信息日志包含状态和当前的配置信息从服务器的连接到主机。该日志包含有关主机名,登录凭据和坐标的信息,这些信息指示从属已从主机的二进制日志读取了多远。主信息日志将写入
mysql.slave_master_info
表中。 - 该中继日志信息记录保存有关从服务器的中继日志中的执行点的状态信息。中继日志将写入
mysql.slave_relay_log_info
表中。
在MySQL 8.0中,当mysqld无法初始化复制日志表但允许从属继续启动时,会发出警告。从不支持从属日志表的MySQL版本升级到支持从属日志表的MySQL版本时,最有可能发生这种情况。
在MySQL 8.0中,在复制进行期间,不允许在slave_master_info
和slave_relay_log_info
表中的一个或两个上执行任何需要写锁定的语句,而在任何时候都只允许执行读取操作。
重要请勿尝试在
slave_master_info
或slave_relay_log_info
表中手动更新或插入行。这样做可能会导致不确定的行为,并且不受支持。
使复制能够应对意外的暂停。在mysql.slave_master_info
和mysql.slave_relay_log_info
表可以使用事务性存储引擎创建InnoDB
。中继日志信息日志表的更新将与事务一起提交,这意味着即使在服务器意外停止的情况下,记录在该日志中的从属服务器的进度信息也始终与应用于数据库的信息保持一致。--relay-log-recovery
必须在从站上启用该选项以确保弹性。有关更多详细信息,请参见“处理复制从属的意外中断”。
从站中继日志
中继日志与二进制日志一样,由一组编号文件和一个索引文件组成,其中编号文件包含描述数据库更改的事件,而索引文件则包含所有已使用中继日志文件的名称。中继日志文件的默认位置是数据目录。
术语“中继日志文件”通常表示包含数据库事件的单独编号文件。术语“中继日志”共同表示编号的中继日志文件加上索引文件的集合。
中继日志文件具有与二进制日志文件相同的格式,可以使用mysqlbinlog读取(请参见“mysqlbinlog-用于处理二进制日志文件的实用程序”)。
对于默认复制通道,中继日志文件名具有默认格式,其中是从属服务器主机的名称,并且是序列号。连续中继日志文件是使用以开头的连续序列号创建的。对于非默认复制通道,默认基本名称为,其中是中继日志中记录的复制通道的名称。host_name-relay-bin.nnnnnn
host_name
nnnnnn
000001
host_name-relay-bin-channel
channel
从站使用索引文件来跟踪当前使用的中继日志文件。默认中继日志索引文件名host_name-relay-bin.index
用于默认通道和非默认复制通道。host_name-relay-bin-channel.index
默认中继日志文件和中继日志索引文件的名称和位置可以分别使用relay_log
和relay_log_index
系统变量覆盖(请参见“复制和二进制日志记录选项和变量”)。
如果从站使用默认的基于主机的中继日志文件名,则在设置复制后更改从站的主机名可能导致复制失败,并显示以下错误:无法打开中继日志,并且在中继日志初始化期间找不到目标日志。这是一个已知问题(请参见Bug#2122)。如果您预计从站的主机名将来可能会更改(例如,如果在从站上设置了网络,以便可以使用DHCP修改其主机名),则可以使用relay_log
和来完全避免此问题。relay_log_index
系统变量,以在最初设置从属服务器时显式指定中继日志文件名。这将使名称独立于服务器主机名更改。
如果复制开始后遇到问题,一种解决方法是停止从属服务器,将旧的中继日志索引文件的内容放在新的之前,然后重新启动从属服务器。在Unix系统上,可以按以下所示进行操作:
shell>cat new_relay_log_name.index >> old_relay_log_name.index shell>mv old_relay_log_name.index new_relay_log_name.index
从属服务器在以下条件下创建一个新的中继日志文件:
- 每次I / O线程启动。
- 清除日志时(例如,使用
FLUSH LOGS
或mysqladmin flush-logs)。 当前中继日志文件的大小太大时,确定如下:
- 如果值
max_relay_log_size
大于0,则为最大中继日志文件大小。 - 如果值为
max_relay_log_size
0,则max_binlog_size
确定最大中继日志文件大小。
- 如果值
SQL线程在执行每个中继日志文件中的所有事件并且不再需要该事件后,会自动删除该文件。没有明确的机制可以删除中继日志,因为SQL线程会这样做。但是,FLUSH LOGS
旋转中继日志,这会影响SQL线程删除它们的时间。
从站状态日志
复制从服务器InnoDB
以mysql
系统架构中的表格形式创建两个从状态日志:主信息日志slave_master_info
和中继日志信息日志slave_relay_log_info
。
两个从状态日志包含的信息与SHOW SLAVE STATUS
语句输出中显示的信息类似,该信息在“用于控制从服务器的SQL语句”中进行了讨论。从属状态日志在从属服务器关闭后仍然有效。下次从属服务器启动时,它会读取两个日志,以确定从主机读取二进制日志并处理其自己的中继日志之前,它进行了多长时间。
应该限制对主信息日志表的访问特权,因为它包含用于连接到主数据库的密码。
RESET SLAVE
清除slave_master_info
和连接slave_relay_log_info
表中的数据,但复制连接参数除外(取决于MySQL Server版本)。有关详细信息,请参见的说明RESET SLAVE
。
在MySQL 8.0之前,要将从状态日志创建为表格,必须在服务器启动时指定master_info_repository=TABLE
和relay_log_info_repository=TABLE
。否则,日志将在名为master.info
和的数据目录中以文件形式创建relay-log.info
,或者具有由--master-info-file
选项和relay_log_info_file
系统变量指定的替代名称和位置。从MySQL 8.0开始,默认情况下将从属状态日志创建为表,并且不建议将从属状态日志创建为文件。请注意,将从属状态日志创建为表时,在克隆操作期间将它们复制到收件人,但是当将它们创建为文件时,则不会复制。有关更多信息,请参见“复制和二进制日志记录选项和变量”。
在mysql.slave_master_info
和mysql.slave_relay_log_info
表可以使用创建的InnoDB
事务性存储引擎。中继日志信息日志表的更新将与事务一起提交,这意味着即使在服务器意外停止的情况下,记录在该日志中的从属服务器的进度信息也始终与应用于数据库的信息保持一致。--relay-log-recovery
必须在从站上启用该选项以确保弹性。有关更多详细信息,请参见“处理复制从属的意外中断”。
将另外创建一个从属状态日志,主要供内部使用,并保存有关多线程复制从属上的工作线程的状态信息。该从属工作日志包括每个工作线程的中继日志文件和主二进制日志文件的名称和位置。如果将从属服务器的中继日志信息日志创建为表(默认设置),则将从属服务器工作日志将写入mysql.slave_worker_info
表中。如果将中继日志信息日志写入文件,那么将从属工作日志将写入worker-relay-log.info
文件。供外部使用,性能模式replication_applier_status_by_worker
表中提供了工作线程的状态信息。
从属I / O线程更新主信息日志。下表显示了mysql.slave_master_info
表中的列,所显示的列SHOW SLAVE STATUS
以及不赞成使用的master.info
文件中各行之间的对应关系。
slave_master_info 表格栏 | SHOW SLAVE STATUS 列 | master.info 文件行 | 描述 |
---|---|---|---|
Number_of_lines | [没有] | 1个 | 表中的列数(或文件中的行数) |
Master_log_name | Master_Log_File | 2 | 当前从主数据库读取的主二进制日志的名称 |
Master_log_pos | Read_Master_Log_Pos | 3 | 从主数据库读取的主二进制日志中的当前位置 |
Host | Master_Host | 4 | 主机的主机名 |
User_name | Master_User | 5 | 用于连接主服务器的用户名 |
User_password | 密码(未显示SHOW SLAVE STATUS ) | 6 | 用于连接主机的密码 |
Port | Master_Port | 7 | 用于连接主服务器的网络端口 |
Connect_retry | Connect_Retry | 8 | 从站尝试重新连接到主站之前等待的时间(以秒为单位) |
Enabled_ssl | Master_SSL_Allowed | 9 | 指示服务器是否支持SSL连接 |
Ssl_ca | Master_SSL_CA_File | 10 | 用于证书颁发机构(CA)证书的文件 |
Ssl_capath | Master_SSL_CA_Path | 11 | 证书颁发机构(CA)证书的路径 |
Ssl_cert | Master_SSL_Cert | 12 | SSL证书文件的名称 |
Ssl_cipher | Master_SSL_Cipher | 13 | SSL连接握手中使用的可能密码的列表 |
Ssl_key | Master_SSL_Key | 14 | SSL密钥文件的名称 |
Ssl_verify_server_cert | Master_SSL_Verify_Server_Cert | 15 | 是否验证服务器证书 |
Heartbeat | [没有] | 16 | 复制心跳之间的间隔(以秒为单位) |
Bind | Master_Bind | 17 | 应该使用哪个从站的网络接口连接到主站 |
Ignored_server_ids | Replicate_Ignore_Server_Ids | 18岁 | 要忽略的服务器ID列表。请注意,对于Ignored_server_ids 服务器ID列表,其前面是要忽略的服务器ID总数。 |
Uuid | Master_UUID | 19 | 主人的唯一ID |
Retry_count | Master_Retry_Count | 20 | 允许的最大重新连接尝试次数 |
Ssl_crl | [没有] | 21 | SSL证书吊销列表文件的路径 |
Ssl_crlpath | [没有] | 22 | 包含SSL证书吊销列表文件的目录的路径 |
Enabled_auto_position | Auto_position | 23 | 是否正在使用自动定位 |
Channel_name | Channel_name | 24 | 复制通道的名称 |
Tls_version | Master_TLS_Version | 25 | 主服务器上的TLS版本 |
Public_key_path | Master_public_key_path | 26 | RSA公钥文件名称 |
Get_public_key | Get_master_public_key | 27 | 是否向主机请求RSA公钥 |
Master_compression_algorithm | [没有] | 28 | 允许的压缩算法 |
Master_zstd_compression_level | [没有] | 29 | zstd 压缩等级 |
Tls_ciphersuites | [没有] | 30 | TLSv1.3的允许密码套件 |
slave_relay_log_info 表格栏 | SHOW SLAVE 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_Master_Log_File | 4 | 主二进制日志文件的名称,从中读取中继日志文件中的事件 |
Master_log_pos | Exec_Master_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 | 通道是否仅接受基于行的事件 |
从属SQL线程更新中继日志信息日志。下表显示了mysql.slave_relay_log_info
表中的列,所显示的列SHOW SLAVE STATUS
以及不赞成使用的relay-log.info
文件中各行之间的对应关系。
备份复制从属服务器的数据时,请确保备份包含和从属服务器状态日志的mysql.slave_master_info
和mysql.slave_relay_log_info
表,因为从从属服务器还原数据后需要使用它们来恢复复制。如果丢失了中继日志文件,但仍然具有中继日志信息日志,则可以对其进行检查以确定SQL线程在主二进制日志中执行了多远。然后你可以使用CHANGE MASTER TO
与MASTER_LOG_FILE
和MASTER_LOG_POS
选项告诉奴隶从该点重新读取二进制日志。当然,这要求二进制日志仍存在于主数据库中。