文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (美国信纸) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  CHANGE REPLICATION SOURCE TO 语句

15.4.2.2 CHANGE REPLICATION SOURCE TO 语句

CHANGE REPLICATION SOURCE TO option [, option] ... [ channel_option ]

option: {
    SOURCE_BIND = 'interface_name'
  | SOURCE_HOST = 'host_name'
  | SOURCE_USER = 'user_name'
  | SOURCE_PASSWORD = 'password'
  | SOURCE_PORT = port_num
  | PRIVILEGE_CHECKS_USER = {NULL | 'account'}
  | REQUIRE_ROW_FORMAT = {0|1}
  | REQUIRE_TABLE_PRIMARY_KEY_CHECK = {STREAM | ON | OFF | GENERATE}
  | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = {OFF | LOCAL | uuid}
  | SOURCE_LOG_FILE = 'source_log_name'
  | SOURCE_LOG_POS = source_log_pos
  | SOURCE_AUTO_POSITION = {0|1}
  | RELAY_LOG_FILE = 'relay_log_name'
  | RELAY_LOG_POS = relay_log_pos
  | SOURCE_HEARTBEAT_PERIOD = interval
  | SOURCE_CONNECT_RETRY = interval
  | SOURCE_RETRY_COUNT = count
  | SOURCE_CONNECTION_AUTO_FAILOVER = {0|1}
  | SOURCE_DELAY = interval
  | SOURCE_COMPRESSION_ALGORITHMS = 'algorithm[,algorithm][,algorithm]'
  | SOURCE_ZSTD_COMPRESSION_LEVEL = level
  | SOURCE_SSL = {0|1}
  | SOURCE_SSL_CA = 'ca_file_name'
  | SOURCE_SSL_CAPATH = 'ca_directory_name'
  | SOURCE_SSL_CERT = 'cert_file_name'
  | SOURCE_SSL_CRL = 'crl_file_name'
  | SOURCE_SSL_CRLPATH = 'crl_directory_name'
  | SOURCE_SSL_KEY = 'key_file_name'
  | SOURCE_SSL_CIPHER = 'cipher_list'
  | SOURCE_SSL_VERIFY_SERVER_CERT = {0|1}
  | SOURCE_TLS_VERSION = 'protocol_list'
  | SOURCE_TLS_CIPHERSUITES = 'ciphersuite_list'
  | SOURCE_PUBLIC_KEY_PATH = 'key_file_name'
  | GET_SOURCE_PUBLIC_KEY = {0|1}
  | NETWORK_NAMESPACE = 'namespace'
  | IGNORE_SERVER_IDS = (server_id_list),
  | GTID_ONLY = {0|1}
}

channel_option:
    FOR CHANNEL channel

server_id_list:
    [server_id [, server_id] ... ]

CHANGE REPLICATION SOURCE TO 更改副本服务器用于连接到源服务器和从源服务器读取数据的参数。它还会更新复制元数据存储库的内容(参见 第 19.2.4 节,“中继日志和复制元数据存储库”)。

CHANGE REPLICATION SOURCE TO 需要 REPLICATION_SLAVE_ADMIN 权限(或已弃用的 SUPER 权限)。

您在 CHANGE REPLICATION SOURCE TO 语句中未指定的选项将保留其值,除非以下讨论中有所说明。因此,在大多数情况下,您无需指定不更改的选项。

用于 SOURCE_HOST 和其他 CHANGE REPLICATION SOURCE TO 选项的值将检查换行符 (\n0x0A) 字符。这些值中存在此类字符会导致语句以错误失败。

可选的 FOR CHANNEL channel 子句允许您命名语句适用的复制通道。提供 FOR CHANNEL channel 子句将 CHANGE REPLICATION SOURCE TO 语句应用于特定的复制通道,用于添加新通道或修改现有通道。例如,要添加一个名为 channel2 的新通道

CHANGE REPLICATION SOURCE TO SOURCE_HOST=host1, SOURCE_PORT=3002 FOR CHANNEL 'channel2';

如果没有命名子句且不存在其他通道,则 CHANGE REPLICATION SOURCE TO 语句将应用于默认通道,其名称为空字符串 ("")。当您设置了多个复制通道时,每个 CHANGE REPLICATION SOURCE TO 语句都必须使用 FOR CHANNEL channel 子句来命名通道。有关更多信息,请参见 第 19.2.2 节,“复制通道”

对于 CHANGE REPLICATION SOURCE TO 语句的一些选项,您必须在发出 CHANGE REPLICATION SOURCE TO 语句之前发出 STOP REPLICA 语句(并在之后发出 START REPLICA 语句)。有时,您只需要停止复制 SQL(应用器)线程或复制 I/O(接收器)线程,而不是两者都停止

  • 当应用器线程停止时,您可以使用任何允许的 RELAY_LOG_FILERELAY_LOG_POSSOURCE_DELAY 选项组合执行 CHANGE REPLICATION SOURCE TO,即使复制接收器线程正在运行。当接收器线程正在运行时,此语句不能使用其他选项。

  • 当接收器线程停止时,您可以使用此语句的任何选项(以任何允许的组合方式)执行 CHANGE REPLICATION SOURCE TO除了 RELAY_LOG_FILERELAY_LOG_POSSOURCE_DELAYSOURCE_AUTO_POSITION = 1 之外,即使应用器线程正在运行也是如此。

  • 在发出使用 SOURCE_AUTO_POSITION = 1GTID_ONLY = 1ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONSCHANGE REPLICATION SOURCE TO 语句之前,接收器线程和应用器线程都必须停止。

您可以使用 SHOW REPLICA STATUS 检查复制应用器线程和复制接收器线程的当前状态。请注意,组复制应用器通道 (group_replication_applier) 没有接收器线程,只有应用器线程。

CHANGE REPLICATION SOURCE TO 语句有一些副作用和交互,您应该事先了解它们。

以下选项可用于 CHANGE REPLICATION SOURCE TO 语句

  • ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = {OFF | LOCAL | uuid}

    使复制通道将 GTID 分配给没有 GTID 的复制事务,从而启用从不使用基于 GTID 的复制的源复制到使用 GTID 的副本。对于多源副本,您可以混合使用使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 的通道和不使用它的通道。默认值为 OFF,表示未使用该功能。

    LOCAL 分配一个 GTID,其中包含副本自己的 UUID(server_uuid 设置)。uuid 分配一个 GTID,其中包含指定的 UUID,例如复制源服务器的 server_uuid 设置。使用非本地 UUID 可以区分在副本上起源的事务和在源上起源的事务,对于多源副本,可以区分在不同源上起源的事务。您选择的 UUID 仅对副本自身的用途有意义。如果源发送的任何事务都已具有 GTID,则保留该 GTID。

    特定于组复制的通道无法使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS,但另一个源在作为组复制组成员的服务器实例上的异步复制通道可以使用它。在这种情况下,不要将组复制组名称指定为创建 GTID 的 UUID。

    要将 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 设置为 LOCALuuid,副本必须具有 gtid_mode=ON 设置,此设置之后不能更改。此选项用于具有基于二进制日志文件位置的复制的源,因此无法为通道设置 SOURCE_AUTO_POSITION=1。在设置此选项之前,复制 SQL 线程和复制 I/O(接收器)线程都必须停止。

    重要

    在任何通道上都使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 设置的副本不能在需要故障转移的情况下升级以替换复制源服务器,并且不能使用从副本中获取的备份来还原复制源服务器。相同的限制适用于替换或还原使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 在任何通道上设置的其他副本。

    有关更多限制和信息,请参见 第 19.1.3.6 节,“从没有 GTID 的源复制到具有 GTID 的副本”

  • GET_SOURCE_PUBLIC_KEY = {0|1}

    通过从源请求公钥来启用基于 RSA 密钥对的密码交换。默认情况下禁用该选项。

    此选项适用于使用 caching_sha2_password 身份验证插件进行身份验证的副本。对于使用此插件进行身份验证的帐户的连接,源不会发送公钥,除非请求,因此必须在客户端中请求或指定它。如果提供了 SOURCE_PUBLIC_KEY_PATH 并指定了一个有效的公钥文件,则它优先于 GET_SOURCE_PUBLIC_KEY。如果您使用的是使用 caching_sha2_password 插件(默认值)进行身份验证的复制用户帐户,并且您没有使用安全连接,则必须指定此选项或 SOURCE_PUBLIC_KEY_PATH 选项以将 RSA 公钥提供给副本。

  • GTID_ONLY = {0|1}

    停止复制通道在复制元数据存储库中持久保存文件名和文件位置。对于异步复制通道,默认情况下禁用 GTID_ONLY,但对于组复制通道默认情况下启用,对于组复制通道,它不能被禁用。

    对于具有此设置的复制通道,内存中的文件位置仍将被跟踪,并且仍然可以观察到文件位置以在错误消息和 SHOW REPLICA STATUS 语句等接口中进行调试(如果它们已过期,则会显示为无效)。但是,在基于 GTID 的复制实际上不需要它们的情况下,将避免写入和读取以持久保存和检查文件位置,包括事务排队和应用程序过程。

    此选项仅可在复制 SQL(应用器)线程和复制 I/O(接收器)线程都停止时使用。要为复制通道设置 GTID_ONLY = 1,服务器上必须使用 GTID (gtid_mode = ON),并且源上必须使用基于行的二进制日志记录(不支持基于语句的复制)。复制通道必须设置选项 REQUIRE_ROW_FORMAT = 1SOURCE_AUTO_POSITION = 1

    当设置了 GTID_ONLY = 1 时,如果服务器的系统变量设置为零,则副本使用 replica_parallel_workers=1,因此它在技术上始终是多线程应用器。这是因为多线程应用器使用保存的位置而不是复制元数据存储库来定位它需要重新应用的事务的开始。

    如果您在设置之后禁用了 GTID_ONLY,则现有的中继日志将被删除,并且现有的已知二进制日志文件位置将被持久保存,即使它们已过期也是如此。复制元数据存储库中的二进制日志和中继日志的文件位置可能无效,如果出现这种情况,则会返回警告。只要 SOURCE_AUTO_POSITION 仍然启用,GTID 自动定位将用于提供正确的定位。

    如果您也禁用了SOURCE_AUTO_POSITION,则会使用复制元数据存储库中二进制日志和中继日志的文件位置来定位,前提是它们有效。如果它们被标记为无效,则必须提供有效的二进制日志文件名和位置(SOURCE_LOG_FILESOURCE_LOG_POS)。如果您还提供中继日志文件名和位置(RELAY_LOG_FILERELAY_LOG_POS),则中继日志将被保留,并将应用器位置设置为指定的位置。GTID 自动跳过确保即使最终的应用器位置不正确,也跳过已应用的任何事务。

  • IGNORE_SERVER_IDS = (server_id_list)

    使副本忽略来自指定服务器的事件。该选项接受一个由 0 个或多个服务器 ID 组成的逗号分隔列表。来自这些服务器的日志轮换和删除事件不会被忽略,而是记录在中继日志中。

    在循环复制中,源服务器通常充当其自身事件的终止器,以便它们不会应用多次。因此,当圆圈中的一个服务器被移除时,此选项在循环复制中很有用。假设您有一个带有 4 个服务器的循环复制设置,服务器 ID 分别为 1、2、3 和 4,服务器 3 发生故障。在通过从服务器 2 到服务器 4 启动复制来弥合差距时,您可以在CHANGE REPLICATION SOURCE TO语句中包含IGNORE_SERVER_IDS = (3),您在服务器 4 上发出该语句以告知它使用服务器 2 作为其源而不是服务器 3。这样做会导致它忽略并不会传播任何源自不再使用的服务器的语句。

    如果IGNORE_SERVER_IDS包含服务器的自身 ID,并且服务器是在启用--replicate-same-server-id选项的情况下启动的,则会导致错误。

    源元数据存储库和SHOW REPLICA STATUS的输出提供了当前被忽略的服务器列表。有关更多信息,请参见第 19.2.4.2 节,“复制元数据存储库”第 15.7.7.34 节,“SHOW REPLICA STATUS 语句”.

    如果在没有IGNORE_SERVER_IDS的情况下发出CHANGE REPLICATION SOURCE TO语句,则会保留任何现有的列表。要清除被忽略的服务器列表,需要使用带有空列表的选项,如下所示

    CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();

    RESET REPLICA ALL也会清除IGNORE_SERVER_IDS

    当使用全局事务标识符 (GTID) 进行复制时,已经应用的事务会自动被忽略。因此,IGNORE_SERVER_IDSgtid_mode=ON不兼容。如果gtid_modeON,则带有非空IGNORE_SERVER_IDS列表的CHANGE REPLICATION SOURCE TO会被拒绝并出现错误。同样,如果任何现有的复制通道是使用要忽略的服务器 ID 列表创建的,那么SET gtid_mode=ON也会被拒绝。在启动基于 GTID 的复制之前,请检查并清除参与服务器上的任何被忽略的服务器 ID 列表;您可以通过检查SHOW REPLICA STATUS的输出完成此操作。在这种情况下,您可以通过使用空服务器 ID 列表发出CHANGE REPLICATION SOURCE TO来清除列表,如前所述。

  • NETWORK_NAMESPACE = 'namespace'

    用于与复制源服务器建立 TCP/IP 连接的网络命名空间,或者如果使用 MySQL 通信堆栈,则用于 Group Replication 的组通信连接。字符串值的最大长度为 64 个字符。如果省略此选项,则来自副本的连接将使用默认(全局)命名空间。在未实现网络命名空间支持的平台上,副本尝试连接到源时会发生故障。有关网络命名空间的信息,请参见第 7.1.14 节,“网络命名空间支持”.

  • PRIVILEGE_CHECKS_USER = {NULL | 'account'}

    命名一个为指定通道提供安全上下文的用户帐户。NULL(默认值)表示不使用安全上下文。

    用户帐户的用户名和主机名必须遵循第 8.2.4 节,“指定帐户名称”中描述的语法,并且用户不能是匿名用户(具有空白用户名)或CURRENT_USER。该帐户必须具有REPLICATION_APPLIER权限,以及在通道上复制的事务执行所需的其他权限。有关帐户所需权限的详细信息,请参见第 19.3.3 节,“复制权限检查”。当您重新启动复制通道时,权限检查将从该点开始应用。如果您没有指定通道,并且没有其他通道存在,则该语句将应用于默认通道。

    当设置PRIVILEGE_CHECKS_USER时,强烈建议使用基于行的二进制日志记录,您可以设置REQUIRE_ROW_FORMAT来强制执行此操作。例如,要在正在运行的副本的channel_1通道上启动权限检查,请发出以下语句

    STOP REPLICA FOR CHANNEL 'channel_1';
    
    CHANGE REPLICATION SOURCE TO
        PRIVILEGE_CHECKS_USER = 'user'@'host',
        REQUIRE_ROW_FORMAT = 1,
        FOR CHANNEL 'channel_1';
    
    START REPLICA FOR CHANNEL 'channel_1';
  • RELAY_LOG_FILE = 'relay_log_file' , RELAY_LOG_POS = 'relay_log_pos'

    中继日志文件名以及在该文件中复制 SQL 线程下次启动时从副本的中继日志中开始读取的位置。RELAY_LOG_FILE可以使用绝对路径或相对路径,并使用与SOURCE_LOG_FILE相同的基名。字符串值的最大长度为 511 个字符。

    当复制 SQL(应用器)线程已停止时,可以使用RELAY_LOG_FILERELAY_LOG_POS或两者选项的CHANGE REPLICATION SOURCE TO语句在正在运行的副本上执行。如果复制应用器线程和复制 I/O(接收器)线程至少有一个正在运行,则会保留中继日志。如果两个线程都已停止,则所有中继日志文件将被删除,除非至少指定了RELAY_LOG_FILERELAY_LOG_POS之一。对于 Group Replication 应用器通道(group_replication_applier),该通道仅具有应用器线程,没有接收器线程,如果应用器线程已停止,则情况也是如此,但是对于该通道,您不能使用RELAY_LOG_FILERELAY_LOG_POS选项。

  • REQUIRE_ROW_FORMAT = {0|1}

    仅允许复制通道处理基于行的复制事件。此选项可防止复制应用器采取创建临时表和执行LOAD DATA INFILE请求等操作,从而提高通道的安全性。REQUIRE_ROW_FORMAT选项默认情况下对于异步复制通道是禁用的,但默认情况下对于 Group Replication 通道是启用的,并且不能为它们禁用。有关更多信息,请参见第 19.3.3 节,“复制权限检查”.

  • REQUIRE_TABLE_PRIMARY_KEY_CHECK = {STREAM | ON | OFF | GENERATE}

    此选项允许副本设置自己的主键检查策略,如下所示

    • ON:副本设置sql_require_primary_key = ON;任何复制的CREATE TABLEALTER TABLE语句必须生成包含主键的表。

    • OFF:副本设置sql_require_primary_key = OFF;不会检查任何复制的CREATE TABLEALTER TABLE语句是否存在主键。

    • STREAM:副本使用从源为每个事务复制的sql_require_primary_key的值。这是默认值,也是默认行为。

    • GENERATE:导致副本为任何InnoDB表生成一个不可见的“主键”,该表在复制时缺少“主键”。有关更多信息,请参见第 15.1.20.11 节,“生成的不可见主键”.

      GENERATE与 Group Replication 不兼容;您可以使用ONOFFSTREAM

    只要源支持 GIPK 并且副本使用 MySQL 8.0.32 或更高版本,MySQL Replication 支持基于仅在源或副本表上是否存在生成的不可见主键的差异。如果您在副本上使用 GIPK,而源使用的是更早版本的 MySQL,则除了副本上的额外 GIPK 之外,此类模式差异不受支持,可能会导致复制错误。

    对于多源复制,将REQUIRE_TABLE_PRIMARY_KEY_CHECK设置为ONOFF允许副本规范化不同源的复制通道的行为,以及保持sql_require_primary_key的一致设置。使用ON可以防止当多个源更新同一组表时意外丢失主键。使用OFF允许可以操作主键的源与无法操作主键的源一起工作。

    在多个副本的情况下,当REQUIRE_TABLE_PRIMARY_KEY_CHECK设置为GENERATE时,给定副本添加的生成的不可见主键独立于在任何其他副本上添加的任何此类主键。这意味着,如果使用生成的不可见主键,则不同副本上生成的“主键”列中的值不保证相同。当故障转移到此类副本时,这可能是一个问题。

    PRIVILEGE_CHECKS_USERNULL(默认值)时,用户帐户不需要管理级别权限才能设置受限制的会话变量。将此选项设置为除NULL以外的值意味着,当REQUIRE_TABLE_PRIMARY_KEY_CHECKONOFFGENERATE时,用户帐户不需要会话管理级别权限才能设置受限制的会话变量,例如sql_require_primary_key,避免需要授予帐户此类权限。有关更多信息,请参见第 19.3.3 节,“复制权限检查”.

  • SOURCE_AUTO_POSITION = {0|1}

    使副本尝试使用基于 GTID 的复制的自动定位功能连接到源,而不是基于二进制日志文件的定位。此选项用于使用基于 GTID 的复制启动副本。默认值为 0,表示不使用 GTID 自动定位和基于 GTID 的复制。只有在复制 SQL(应用)线程和复制 I/O(接收)线程都停止的情况下,此选项才能与 CHANGE REPLICATION SOURCE TO 结合使用。

    副本和源都必须启用 GTID (GTID_MODE=ONON_PERMISSIVE,OFF_PERMISSIVE 在副本上,以及 GTID_MODE=ON 在源上)。SOURCE_LOG_FILESOURCE_LOG_POSRELAY_LOG_FILERELAY_LOG_POS 不能与 SOURCE_AUTO_POSITION = 1 同时指定。如果副本上启用了多源复制,则需要为每个适用的复制通道设置 SOURCE_AUTO_POSITION = 1 选项。

    在设置了 SOURCE_AUTO_POSITION = 1 之后,副本会在初始连接握手时发送一个包含其已经接收、提交或两者兼有的事务的 GTID 集。源会通过发送其二进制日志中记录的所有事务来响应,这些事务的 GTID 不包含在副本发送的 GTID 集中。这种交换确保源只发送副本尚未记录或提交的 GTID 的事务。如果副本从多个源接收事务,例如菱形拓扑结构,则自动跳过功能确保不会两次应用这些事务。有关计算副本发送的 GTID 集的详细信息,请参见 第 19.1.3.3 节,“GTID 自动定位”

    如果源应该发送的任何事务已从源的二进制日志中清除,或者通过其他方法添加到 gtid_purged 系统变量的 GTID 集中,则源会向副本发送错误 ER_SOURCE_HAS_PURGED_REQUIRED_GTIDS,复制不会启动。缺少的清除事务的 GTID 会在源的错误日志中以警告消息 ER_FOUND_MISSING_GTIDS 形式标识并列出。此外,如果在事务交换过程中发现副本已记录或提交了具有源 UUID 的 GTID 的事务,但源本身尚未提交它们,则源会向副本发送错误 ER_REPLICA_HAS_MORE_GTIDS_THAN_SOURCE,复制不会启动。有关如何处理这些情况的信息,请参见 第 19.1.3.3 节,“GTID 自动定位”

    您可以通过检查 Performance Schema replication_connection_status 表或 SHOW REPLICA STATUS 的输出,查看复制是否以启用 GTID 自动定位的方式运行。再次禁用 SOURCE_AUTO_POSITION 选项会使副本恢复为基于文件的复制。

  • SOURCE_BIND = 'interface_name'

    确定在具有多个网络接口的副本上,选择哪个副本的网络接口连接到源。指定网络接口的 IP 地址。字符串值的最大长度为 255 个字符。

    如果配置了此选项,则配置的 IP 地址可以在 SHOW REPLICA STATUS 输出的 Source_Bind 列中看到。在源元数据存储库表 mysql.slave_master_info 中,该值可以作为 Source_bind 列看到。NDB Cluster 也支持将副本绑定到特定网络接口的功能。

  • SOURCE_COMPRESSION_ALGORITHMS = 'algorithm[,algorithm][,algorithm]'

    指定一个、两个或三个允许的压缩算法用于连接到复制源服务器,用逗号分隔。字符串值的最大长度为 99 个字符。默认值为 uncompressed

    可用的算法与 protocol_compression_algorithms 系统变量相同,分别是 zlibzstduncompressed。这些算法可以按任意顺序指定,但不是优先级顺序 - 算法协商过程尝试使用 zlib,然后使用 zstd,然后使用 uncompressed(如果指定了这些算法)。

    SOURCE_COMPRESSION_ALGORITHMS 的值仅在 replica_compressed_protocol 系统变量禁用时适用。如果启用了 replica_compressed_protocol,则它优先于 SOURCE_COMPRESSION_ALGORITHMS,并且连接到源使用 zlib 压缩(如果源和副本都支持该算法)。有关更多信息,请参见 第 6.2.8 节,“连接压缩控制”

    二进制日志事务压缩由 binlog_transaction_compression 系统变量激活,也可以用来节省带宽。如果您将此与连接压缩结合使用,连接压缩将减少对数据的处理机会,但仍然可以压缩报头以及未压缩的事件和事务有效负载。有关二进制日志事务压缩的更多信息,请参见 第 7.4.4.5 节,“二进制日志事务压缩”

  • SOURCE_CONNECT_RETRY = interval

    指定副本在连接到源超时后进行重新连接尝试的时间间隔(以秒为单位)。默认间隔为 60 秒。

    尝试次数受 SOURCE_RETRY_COUNT 选项限制。如果同时使用默认设置,则副本会在重新连接尝试之间等待 60 秒 (SOURCE_CONNECT_RETRY=60),并以这种速率持续尝试重新连接 10 分钟 (SOURCE_RETRY_COUNT=10)。这些值记录在源元数据存储库中,并在 replication_connection_configuration Performance Schema 表中显示。

  • SOURCE_CONNECTION_AUTO_FAILOVER = {0|1}

    如果存在一个或多个备用复制源服务器(因此,当存在多个 MySQL 服务器或共享复制数据的服务器组时),则为复制通道激活异步连接故障转移机制。默认值为 0,表示未激活该机制。有关设置此功能的完整信息和说明,请参见 第 19.4.9.2 节,“副本的异步连接故障转移”

    在由 SOURCE_CONNECT_RETRYSOURCE_RETRY_COUNT 控制的重新连接尝试用尽后,异步连接故障转移机制将接管。它将副本重新连接到从指定的源列表中选择的备用源,您可以使用函数 asynchronous_connection_failover_add_source()asynchronous_connection_failover_delete_source() 来管理该列表。要添加和删除受管理的服务器组,请使用 asynchronous_connection_failover_add_managed()asynchronous_connection_failover_delete_managed()。有关更多信息,请参见 第 19.4.9 节,“使用异步连接故障转移切换源和副本”

    重要
    1. 您只能在使用 GTID 自动定位 (SOURCE_AUTO_POSITION = 1) 时设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1

    2. 当您设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1 时,请将 SOURCE_RETRY_COUNTSOURCE_CONNECT_RETRY 设置为最小的数字,这些数字只允许对同一源进行几次重试,以防连接失败是由瞬态网络故障引起的。否则,异步连接故障转移机制无法及时激活。合适的值是 SOURCE_RETRY_COUNT=3SOURCE_CONNECT_RETRY=10,它们使副本以 10 秒的间隔重试连接 3 次。

    3. 当您设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1 时,复制元数据存储库必须包含用于连接到复制通道源列表上所有服务器的复制用户帐户的凭据。该帐户还必须对 Performance Schema 表具有 SELECT 权限。可以使用 CHANGE REPLICATION SOURCE TO 语句以及 SOURCE_USERSOURCE_PASSWORD 选项来设置这些凭据。有关更多信息,请参见 第 19.4.9 节,“使用异步连接故障转移切换源和副本”

    4. 当您设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1 时,如果此复制通道位于单主模式下组中的 Group Replication 主服务器上,则会自动激活副本的异步连接故障转移。使用此功能,如果正在复制的主服务器脱机或进入错误状态,则当选为主服务器的新主服务器会在此通道上启动复制。如果您想使用此功能,则此复制通道还必须在复制组中的所有从服务器以及任何新加入的成员上设置好。(如果使用 MySQL 的克隆功能来配置服务器,则所有这些操作都会自动进行。)如果您不想使用此功能,请通过使用 group_replication_disable_member_action() 函数禁用 Group Replication 成员操作 mysql_start_failover_channels_if_primary 来禁用它,该操作默认情况下处于启用状态。有关更多信息,请参见 第 19.4.9.2 节,“副本的异步连接故障转移”

  • SOURCE_DELAY = interval

    指定副本必须落后于源多少秒。从源接收到的事件在比源上执行晚至少 interval 秒后才会执行。 interval 必须是非负整数,范围从 0 到 231−1。默认值为 0。有关更多信息,请参见 第 19.4.11 节,“延迟复制”

    当复制 SQL 线程停止时,可以使用 SOURCE_DELAY 选项执行的 CHANGE REPLICATION SOURCE TO 语句可以在正在运行的副本上执行。

  • SOURCE_HEARTBEAT_PERIOD = interval

    控制心跳间隔,如果连接良好,则在没有数据的情况下停止连接超时。 在指定秒数后向副本发送心跳信号,并且每当源的二进制日志更新事件时,等待时间都会重置。 因此,仅当源的二进制日志文件中在超过此时间段内没有未发送的事件时,源才会发送心跳。

    心跳间隔 interval 是一个十进制值,范围为 0 到 4294967 秒,精度为毫秒; 最小的非零值为 0.001。 将 interval 设置为 0 将完全禁用心跳。 心跳间隔默认为 replica_net_timeout 系统变量值的一半。 它记录在源元数据存储库中,并在 replication_connection_configuration Performance Schema 表中显示。

    replica_net_timeout 系统变量指定副本在认为连接断开、中止读取并尝试重新连接之前,等待更多数据或源心跳信号的秒数。 默认值为 60 秒(一分钟)。 请注意,更改 replica_net_timeout 的值或默认设置不会自动更改心跳间隔,无论心跳间隔是显式设置还是使用先前计算的默认值。 如果您将 replica_net_timeout 的全局值设置为小于当前心跳间隔的值,则会发出警告。 如果更改了 replica_net_timeout,您还必须发出 CHANGE REPLICATION SOURCE TO 以将心跳间隔调整为适当的值,以便心跳信号在连接超时之前发生。 如果您不这样做,心跳信号将不起作用,如果未从源接收数据,副本可能会重复尝试重新连接,从而创建僵尸转储线程。

  • SOURCE_HOST = 'host_name'

    复制源服务器的主机名或 IP 地址。 副本使用它来连接到源。 字符串值的最大长度为 255 个字符。

    如果您指定了 SOURCE_HOSTSOURCE_PORT,副本会认为源服务器与之前不同(即使选项值与当前值相同)。 在这种情况下,源的二进制日志文件名和位置的旧值将被视为不再适用,因此,如果您未在语句中指定 SOURCE_LOG_FILESOURCE_LOG_POS,则会静默附加 SOURCE_LOG_FILE=''SOURCE_LOG_POS=4

    SOURCE_HOST='' 设置为(即,显式将其值设置为空字符串)与根本不设置 SOURCE_HOST 不同。 尝试将 SOURCE_HOST 设置为空字符串会导致错误。

  • SOURCE_LOG_FILE = 'source_log_name', SOURCE_LOG_POS = source_log_pos

    二进制日志文件名,以及该文件中复制 I/O(接收器)线程下次启动时开始从源的二进制日志中读取的位置。 如果您使用的是基于二进制日志文件位置的复制,请指定这些选项。

    SOURCE_LOG_FILE 必须包含源服务器上可用的特定二进制日志文件的数字后缀,例如,SOURCE_LOG_FILE='binlog.000145'。 字符串值的最大长度为 511 个字符。

    SOURCE_LOG_POS 是副本在该文件中开始读取的数字位置。 SOURCE_LOG_POS=4 表示二进制日志文件中的事件开始。

    如果您指定了 SOURCE_LOG_FILESOURCE_LOG_POS,则不能指定 SOURCE_AUTO_POSITION = 1,这是用于基于 GTID 的复制。

    如果未指定 SOURCE_LOG_FILESOURCE_LOG_POS,则副本使用发出 CHANGE REPLICATION SOURCE TO 之前 复制 SQL 线程 的最后一个坐标。 这样可以确保复制不会出现不连续性,即使复制 SQL(应用程序)线程比复制 I/O(接收器)线程慢。

  • SOURCE_PASSWORD = 'password'

    用于连接到复制源服务器的复制用户帐户的密码。 字符串值的最大长度为 32 个字符。 如果您指定了 SOURCE_PASSWORD,则也需要 SOURCE_USER

    CHANGE REPLICATION SOURCE TO 语句中用于复制用户帐户的密码长度限制为 32 个字符。 尝试使用超过 32 个字符的密码会导致 CHANGE REPLICATION SOURCE TO 失败。

    密码在 MySQL Server 的日志、Performance Schema 表和 SHOW PROCESSLIST 语句中被屏蔽。

  • SOURCE_PORT = port_num

    副本用于连接到复制源服务器的 TCP/IP 端口号。

    注意

    复制不能使用 Unix 套接字文件。 您必须能够使用 TCP/IP 连接到复制源服务器。

    如果您指定了 SOURCE_HOSTSOURCE_PORT,副本会认为源服务器与之前不同(即使选项值与当前值相同)。 在这种情况下,源的二进制日志文件名和位置的旧值将被视为不再适用,因此,如果您未在语句中指定 SOURCE_LOG_FILESOURCE_LOG_POS,则会静默附加 SOURCE_LOG_FILE=''SOURCE_LOG_POS=4

  • SOURCE_PUBLIC_KEY_PATH = 'key_file_name'

    通过提供包含源所需的公钥的副本端副本的路径名,启用基于 RSA 密钥对的密码交换。 该文件必须采用 PEM 格式。 字符串值的最大长度为 511 个字符。

    此选项适用于使用 sha256_passwordcaching_sha2_password 身份验证插件进行身份验证的副本。 (对于 sha256_passwordSOURCE_PUBLIC_KEY_PATH 仅在使用 OpenSSL 构建 MySQL 时才可以使用。)如果您使用的是使用 caching_sha2_password 插件(默认值)进行身份验证的复制用户帐户,并且您未使用安全连接,则必须指定此选项或 GET_SOURCE_PUBLIC_KEY=1 选项以向副本提供 RSA 公钥。

  • SOURCE_RETRY_COUNT = count

    设置副本在连接到源超时后进行的重新连接尝试次数的最大值,由 replica_net_timeout 系统变量确定。 如果副本确实需要重新连接,则第一次重试会在超时后立即进行。 默认值为 10 次尝试。

    尝试之间的间隔由 SOURCE_CONNECT_RETRY 选项指定。 如果使用默认设置,副本会在重新连接尝试之间等待 60 秒(SOURCE_CONNECT_RETRY=60),并以这种速度持续尝试重新连接 10 分钟(SOURCE_RETRY_COUNT=10)。 SOURCE_RETRY_COUNT 设置为 0 表示重新连接尝试次数没有限制,因此副本将无限期地尝试重新连接。

    SOURCE_CONNECT_RETRYSOURCE_RETRY_COUNT 的值记录在源元数据存储库中,并在 replication_connection_configuration Performance Schema 表中显示。 SOURCE_RETRY_COUNT 优先于 --master-retry-count 服务器启动选项。

  • SOURCE_SSL = {0|1}

    指定副本是否加密复制连接。 默认值为 0,表示副本不加密复制连接。 如果您将 SOURCE_SSL=1 设置为,则可以使用 SOURCE_SSL_xxxSOURCE_TLS_xxx 选项配置加密。

    将复制连接的 SOURCE_SSL=1 设置为,然后不设置其他 SOURCE_SSL_xxx 选项,相当于将 --ssl-mode=REQUIRED 设置为客户端,如 Command Options for Encrypted Connections 中所述。 使用 SOURCE_SSL=1,连接尝试仅在能够建立加密连接时才能成功。 复制连接不会回退到非加密连接,因此没有与复制的 --ssl-mode=PREFERRED 设置相对应的设置。 如果将 SOURCE_SSL=0 设置为,则相当于 --ssl-mode=DISABLED

    重要

    为了帮助防止复杂的中间人攻击,副本验证服务器身份非常重要。 您可以指定其他 SOURCE_SSL_xxx 选项以对应于设置 --ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY,与默认设置相比,它们是更好的选择,可以帮助防止此类攻击。 使用这些设置,副本会检查服务器的证书是否有效,并检查副本正在使用的主机名是否与服务器证书中的身份匹配。 若要实现这些验证级别之一,您必须首先确保服务器的 CA 证书可靠地可用于副本,否则可用性问题会导致结果。 因此,它们不是默认设置。

  • SOURCE_SSL_xxx, SOURCE_TLS_xxx

    指定副本如何使用加密和密码来保护复制连接。 即使在没有 SSL 支持的副本上也可以更改这些选项。 它们会保存到源元数据存储库中,但如果副本未启用 SSL 支持,则会被忽略。 字符串值 SOURCE_SSL_xxxSOURCE_TLS_xxx 选项的值的最大长度为 511 个字符,SOURCE_TLS_CIPHERSUITES 除外,其最大长度为 4000 个字符。

    SOURCE_SSL_xxxSOURCE_TLS_xxx 选项执行与 Command Options for Encrypted Connections 中描述的 --ssl-xxx--tls-xxx 客户端选项相同的函数。 两组选项之间的对应关系,以及使用 SOURCE_SSL_xxxSOURCE_TLS_xxx 选项建立安全连接,在 Section 19.3.1, “Setting Up Replication to Use Encrypted Connections” 中进行了说明。

  • SOURCE_USER = 'user_name'

    用于连接到复制源服务器的复制用户帐户的用户名。字符串值的最大长度为 96 个字符。

    对于组复制,此帐户必须存在于复制组的每个成员上。如果组使用 XCom 通信堆栈,则用于分布式恢复;如果组使用 MySQL 通信堆栈,则还用于组通信连接。使用 MySQL 通信堆栈时,该帐户必须具有 GROUP_REPLICATION_STREAM 权限。

    可以通过指定 SOURCE_USER='' 设置空用户名,但复制通道无法使用空用户名启动。如果始终使用 START REPLICA 语句或 START GROUP_REPLICATION 语句来启动复制通道(该语句启动复制通道),则设置空的 SOURCE_USER 用户名是有效的。这种方法意味着复制通道始终需要操作员干预才能重新启动,但用户凭据不会记录在复制元数据存储库中。

    重要

    要使用使用 caching_sha2_password 插件进行身份验证的复制用户帐户连接到源,您必须按照 第 19.3.1 节“设置复制以使用加密连接” 中所述设置安全连接,或者启用未加密连接以支持使用 RSA 密钥对的密码交换。 caching_sha2_password 身份验证插件是新用户的默认插件(请参阅 第 8.4.1.1 节“缓存 SHA-2 可插拔身份验证”)。如果您为复制创建或使用的用户帐户使用此身份验证插件,并且您没有使用安全连接,则必须为成功连接启用基于 RSA 密钥对的密码交换。您可以使用 SOURCE_PUBLIC_KEY_PATH 选项或此语句的 GET_SOURCE_PUBLIC_KEY=1 选项来执行此操作。

  • SOURCE_ZSTD_COMPRESSION_LEVEL = level

    用于使用 zstd 压缩算法连接到复制源服务器的压缩级别。允许的级别为 1 到 22,较大的值表示更高的压缩级别。默认级别为 3。

    压缩级别设置对不使用 zstd 压缩的连接没有影响。有关更多信息,请参阅 第 6.2.8 节“连接压缩控制”

示例

CHANGE REPLICATION SOURCE TO 用于在您拥有源的快照并已记录与快照时间相对应的源的二进制日志坐标时设置副本。将快照加载到副本中以将其与源同步后,可以在副本上运行 CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='log_name', SOURCE_LOG_POS=log_pos 以指定副本应开始读取源的二进制日志的坐标。以下示例更改了副本使用的源服务器,并建立了副本开始读取的源的二进制日志坐标

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='source2.example.com',
  SOURCE_USER='replication',
  SOURCE_PASSWORD='password',
  SOURCE_PORT=3306,
  SOURCE_LOG_FILE='source2-bin.001',
  SOURCE_LOG_POS=4,
  SOURCE_CONNECT_RETRY=10;

有关在故障转移期间将现有副本切换到新源的过程,请参阅 第 19.4.8 节“在故障转移期间切换源”

当源和副本上使用 GTID 时,请指定 GTID 自动定位,而不是指定二进制日志文件位置,如以下示例所示。有关在新的或已停止的服务器、在线服务器或其他副本上配置和启动基于 GTID 的复制的完整说明,请参阅 第 19.1.3 节“使用全局事务标识符进行复制”

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='source3.example.com',
  SOURCE_USER='replication',
  SOURCE_PASSWORD='password',
  SOURCE_PORT=3306,
  SOURCE_AUTO_POSITION = 1,
  FOR CHANNEL "source_3";

在此示例中,使用多源复制,并且 CHANGE REPLICATION SOURCE TO 语句应用于将副本连接到指定主机上的复制通道 "source_3"。有关设置多源复制的指南,请参阅 第 19.1.5 节“MySQL 多源复制”

下一个示例展示了如何使副本应用您想要重复的重传日志文件中的事务。为此,源不需要可访问。您可以使用 CHANGE REPLICATION SOURCE TO 来定位您希望副本开始重新应用事务的重传日志位置,然后启动 SQL 线程

CHANGE REPLICATION SOURCE TO
  RELAY_LOG_FILE='replica-relay-bin.006',
  RELAY_LOG_POS=4025;
START REPLICA SQL_THREAD;

CHANGE REPLICATION SOURCE TO 也可用于跳过导致复制停止的二进制日志中的事务。执行此操作的适当方法取决于是否使用 GTID。有关使用 CHANGE REPLICATION SOURCE TO 或其他方法跳过事务的说明,请参阅 第 19.1.7.3 节“跳过事务”