• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 复制中继和状态日志

    在复制期间,从属服务器会创建几个日志,以保存从主服务器中继到从属服务器的二进制日志事件,并在中继日志中记录有关当前状态和位置的信息。在此过程中使用三种日志类型,在此处列出:

    • 中继日志包括的事件从主的二进制日志读取并从I / O线程写入。中继日志中的事件在从属服务器上作为SQL线程的一部分执行。
    • 主信息日志包含状态和当前的配置信息从服务器的连接到主机。该日志包含有关主机名,登录凭据和坐标的信息,这些信息指示从属已从主机的二进制日志读取了多远。主信息日志将写入mysql.slave_master_info表中。
    • 中继日志信息记录保存有关从服务器的中继日志中的执行点的状态信息。中继日志将写入mysql.slave_relay_log_info表中。

    在MySQL 8.0中,当mysqld无法初始化复制日志表但允许从属继续启动时,会发出警告。从不支持从属日志表的MySQL版本升级到支持从属日志表的MySQL版本时,最有可能发生这种情况。

    在MySQL 8.0中,在复制进行期间,不允许在slave_master_infoslave_relay_log_info表中的一个或两个上执行任何需要写锁定的语句,而在任何时候都只允许执行读取操作。

    重要

    请勿尝试在slave_master_infoslave_relay_log_info表中手动更新或插入行。这样做可能会导致不确定的行为,并且不受支持。

    使复制能够应对意外的暂停。mysql.slave_master_infomysql.slave_relay_log_info表可以使用事务性存储引擎创建InnoDB。中继日志信息日志表的更新将与事务一起提交,这意味着即使在服务器意外停止的情况下,记录在该日志中的从属服务器的进度信息也始终与应用于数据库的信息保持一致。--relay-log-recovery必须在从站上启用该选项以确保弹性。有关更多详细信息,请参见“处理复制从属的意外中断”。


    从站中继日志

    中继日志与二进制日志一样,由一组编号文件和一个索引文件组成,其中编号文件包含描述数据库更改的事件,而索引文件则包含所有已使用中继日志文件的名称。中继日志文件的默认位置是数据目录。

    术语“中继日志文件”通常表示包含数据库事件的单独编号文件。术语“中继日志”共同表示编号的中继日志文件加上索引文件的集合。

    中继日志文件具有与二进制日志文件相同的格式,可以使用mysqlbinlog读取(请参见“mysqlbinlog-用于处理二进制日志文件的实用程序”)。

    对于默认复制通道,中继日志文件名具有默认格式,其中是从属服务器主机的名称,并且是序列号。连续中继日志文件是使用以开头的连续序列号创建的。对于非默认复制通道,默认基本名称为,其中是中继日志中记录的复制通道的名称。host_name-relay-bin.nnnnnnhost_namennnnnn000001host_name-relay-bin-channelchannel

    从站使用索引文件来跟踪当前使用的中继日志文件。默认中继日志索引文件名host_name-relay-bin.index用于默认通道和非默认复制通道。host_name-relay-bin-channel.index

    默认中继日志文件和中继日志索引文件的名称和位置可以分别使用relay_logrelay_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 LOGSmysqladmin flush-logs)。
    • 当前中继日志文件的大小太大时,确定如下:

      • 如果值max_relay_log_size大于0,则为最大中继日志文件大小。
      • 如果值为max_relay_log_size0,则max_binlog_size确定最大中继日志文件大小。

    SQL线程在执行每个中继日志文件中的所有事件并且不再需要该事件后,会自动删除该文件。没有明确的机制可以删除中继日志,因为SQL线程会这样做。但是,FLUSH LOGS旋转中继日志,这会影响SQL线程删除它们的时间。


    从站状态日志

    复制从服务器InnoDBmysql系统架构中的表格形式创建两个从状态日志:主信息日志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=TABLErelay_log_info_repository=TABLE。否则,日志将在名为master.info和的数据目录中以文件形式创建relay-log.info,或者具有由--master-info-file选项和relay_log_info_file系统变量指定的替代名称和位置。从MySQL 8.0开始,默认情况下将从属状态日志创建为表,并且不建议将从属状态日志创建为文件。请注意,将从属状态日志创建为表时,在克隆操作期间将它们复制到收件人,但是当将它们创建为文件时,则不会复制。有关更多信息,请参见“复制和二进制日志记录选项和变量”。

    mysql.slave_master_infomysql.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 STATUSmaster.info文件行描述
    Number_of_lines[没有]1个表中的列数(或文件中的行数)
    Master_log_nameMaster_Log_File2当前从主数据库读取的主二进制日志的名称
    Master_log_posRead_Master_Log_Pos3从主数据库读取的主二进制日志中的当前位置
    HostMaster_Host4主机的主机名
    User_nameMaster_User5用于连接主服务器的用户名
    User_password密码(未显示SHOW SLAVE STATUS6用于连接主机的密码
    PortMaster_Port7用于连接主服务器的网络端口
    Connect_retryConnect_Retry8从站尝试重新连接到主站之前等待的时间(以秒为单位)
    Enabled_sslMaster_SSL_Allowed9指示服务器是否支持SSL连接
    Ssl_caMaster_SSL_CA_File10用于证书颁发机构(CA)证书的文件
    Ssl_capathMaster_SSL_CA_Path11证书颁发机构(CA)证书的路径
    Ssl_certMaster_SSL_Cert12SSL证书文件的名称
    Ssl_cipherMaster_SSL_Cipher13SSL连接握手中使用的可能密码的列表
    Ssl_keyMaster_SSL_Key14SSL密钥文件的名称
    Ssl_verify_server_certMaster_SSL_Verify_Server_Cert15是否验证服务器证书
    Heartbeat[没有]16复制心跳之间的间隔(以秒为单位)
    BindMaster_Bind17应该使用哪个从站的网络接口连接到主站
    Ignored_server_idsReplicate_Ignore_Server_Ids18岁要忽略的服务器ID列表。请注意,对于Ignored_server_ids服务器ID列表,其前面是要忽略的服务器ID总数。
    UuidMaster_UUID19主人的唯一ID
    Retry_countMaster_Retry_Count20允许的最大重新连接尝试次数
    Ssl_crl[没有]21SSL证书吊销列表文件的路径
    Ssl_crlpath[没有]22包含SSL证书吊销列表文件的目录的路径
    Enabled_auto_positionAuto_position23是否正在使用自动定位
    Channel_nameChannel_name24复制通道的名称
    Tls_versionMaster_TLS_Version25主服务器上的TLS版本
    Public_key_pathMaster_public_key_path26RSA公钥文件名称
    Get_public_keyGet_master_public_key27是否向主机请求RSA公钥
    Master_compression_algorithm[没有]28允许的压缩算法
    Master_zstd_compression_level[没有]29zstd压缩等级
    Tls_ciphersuites[没有]30TLSv1.3的允许密码套件

    slave_relay_log_info表格栏SHOW SLAVE STATUS在线路relay-log.info文件描述
    Number_of_lines[没有]1个表中的列数或文件中的行数
    Relay_log_nameRelay_Log_File2当前中继日志文件的名称
    Relay_log_posRelay_Log_Pos3中继日志文件中的当前位置;在从属数据库上已执行到此位置的事件
    Master_log_nameRelay_Master_Log_File4主二进制日志文件的名称,从中读取中继日志文件中的事件
    Master_log_posExec_Master_Log_Pos5主机二进制日志文件中已执行事件的等效位置
    Sql_delaySQL_Delay6从站必须落后于主站的秒数
    Number_of_workers[没有]7用于并行执行复制事件(事务)的从属应用程序线程数
    Id[没有]8内部使用的ID;目前这总是1
    Channel_nameChannel_name9复制通道的名称
    Privilege_checks_username[没有]10PRIVILEGE_CHECKS_USER频道帐户的用户名
    Privilege_checks_hostname[没有]11PRIVILEGE_CHECKS_USER频道帐户的主机名
    Require_row_format[没有]12通道是否仅接受基于行的事件

    从属SQL线程更新中继日志信息日志。下表显示了mysql.slave_relay_log_info表中的列,所显示的列SHOW SLAVE STATUS以及不赞成使用的relay-log.info文件中各行之间的对应关系。

    备份复制从属服务器的数据时,请确保备份包含和从属服务器状态日志的mysql.slave_master_infomysql.slave_relay_log_info表,因为从从属服务器还原数据后需要使用它们来恢复复制。如果丢失了中继日志文件,但仍然具有中继日志信息日志,则可以对其进行检查以确定SQL线程在主二进制日志中执行了多远。然后你可以使用CHANGE MASTER TOMASTER_LOG_FILEMASTER_LOG_POS选项告诉奴隶从该点重新读取二进制日志。当然,这要求二进制日志仍存在于主数据库中。