Documentation Home

13.4.2.3 将复制源更改为语句

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}
  | 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 更改副本服务器用于连接到源和从源读取数据的参数。它还更新复制元数据存储库的内容(请参阅第 17.2.4 节,“中继日志和复制元数据存储库”)。在 MySQL 8.0.23 及更高版本中,使用CHANGE REPLICATION SOURCE TO代替已弃用的 CHANGE MASTER TO语句。

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

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

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

可选子句使您能够命名该语句适用于哪个复制通道。提供一个子句将 语句应用于特定的复制通道,并用于添加新通道或修改现有通道。例如,要添加一个名为的新频道: FOR CHANNEL channelFOR CHANNEL channelCHANGE REPLICATION SOURCE TOchannel2

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

如果没有命名子句并且不存在额外的通道, CHANGE REPLICATION SOURCE TO 则声明适用于默认通道,其名称为空字符串 ("")。当您设置了多个复制通道时,每个CHANGE REPLICATION SOURCE TO语句都必须使用该 子句命名一个通道。有关更多信息,请参阅 第 17.2.2 节,“复制通道”FOR CHANNEL channel

对于CHANGE REPLICATION SOURCE TO声明的某些选项,您必须 STOP REPLICA在发布声明之前发布CHANGE REPLICATION SOURCE TO声明(以及START REPLICA之后的声明)。有时,您只需要停止复制 SQL(应用程序)线程或复制 I/O(接收方)线程,而不是同时停止:

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

  • 当接收器线程停止时,您可以 CHANGE REPLICATION SOURCE TO 使用此语句的任何选项(在任何允许的组合中)执行,除了 RELAY_LOG_FILERELAY_LOG_POSSOURCE_DELAYSOURCE_AUTO_POSITION = 1甚至当应用程序线程正在运行时。

  • 在发出使用、 或 的CHANGE REPLICATION SOURCE TO语句 之前,必须停止接收线程和应用程序线程。 SOURCE_AUTO_POSITION = 1GTID_ONLY = 1ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS

您可以使用检查复制应用程序线程和复制接收器线程的当前状态 SHOW REPLICA STATUS。请注意,Group Replication applier channel ( group_replication_applier) 没有接收线程,只有一个 applier 线程。

CHANGE REPLICATION SOURCE TO 语句有许多您应该事先了解的副作用和相互作用:

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

ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = {OFF | LOCAL | uuid}

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

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

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

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

重要的

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

有关更多限制和信息,请参阅 第 17.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(这是 MySQL 8.0 的默认设置),并且您没有使用安全连接,则必须指定此选项或SOURCE_PUBLIC_KEY_PATH向副本提供 RSA 公钥的选项。

GTID_ONLY = {0|1}

停止复制通道在复制元数据存储库中保留文件名和文件位置。 GTID_ONLY从 MySQL 8.0.27 开始可用。异步复制通道默认禁用该GTID_ONLY选项,但组复制通道默认启用该选项,并且无法为它们禁用。

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

仅当复制 SQL(应用程序)线程和复制 I/O(接收方)线程都停止时,才能使用此选项。要设置GTID_ONLY = 1复制通道,GTID 必须在服务器 ( gtid_mode = ON) 上使用,并且基于行的二进制日志记录必须在源上使用(不支持基于语句的复制)。必须为复制通道设置 选项REQUIRE_ROW_FORMAT = 1和。SOURCE_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 的复制来弥合差距时,您可以 IGNORE_SERVER_IDS = (3)CHANGE REPLICATION SOURCE TO您在服务器 4 上发出的语句,告诉它使用服务器 2 而不是服务器 3 作为其源。这样做会导致它忽略并且不传播源自不再使用的服务器的任何语句。

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

笔记

当全局事务标识符 (GTID) 用于复制时,已经应用的事务将被自动忽略,因此该 IGNORE_SERVER_IDS功能不是必需的,已被弃用。如果 为服务器设置了 ,如果您在语句 中包含该选项,gtid_mode=ON则会发出弃用警告。IGNORE_SERVER_IDSCHANGE REPLICATION SOURCE TO

源元数据存储库和输出 SHOW REPLICA STATUS提供了当前被忽略的服务器列表。有关详细信息,请参阅 第 17.2.4.2 节,“复制元数据存储库”第 13.7.7.35 节,“SHOW REPLICA STATUS 语句”

如果CHANGE REPLICATION SOURCE TO发出的语句没有任何 IGNORE_SERVER_IDS选项,则保留任何现有列表。要清除忽略的服务器列表,必须使用带有空列表的选项:

CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();

RESET REPLICA ALL清除 IGNORE_SERVER_IDS

笔记

SET GTID_MODE=ON如果在任何通道的现有服务器 ID 设置为 时 发出 ,则会发出 弃用警告IGNORE_SERVER_IDS。在开始基于 GTID 的复制之前,检查并清除所涉及服务器上所有忽略的服务器 ID 列表。该 SHOW REPLICA STATUS 语句显示忽略的 ID 列表(如果有的话)。如果确实收到弃用警告,您仍然可以在 gtid_mode=ON设置后通过发出包含带有空列表 CHANGE REPLICATION SOURCE TO的选项的语句 来清除列表。IGNORE_SERVER_IDS

NETWORK_NAMESPACE = 'namespace'

用于到复制源服务器的 TCP/IP 连接的网络名称空间,或者,如果正在使用 MySQL 通信堆栈,则用于组复制的组通信连接。字符串值的最大长度为 64 个字符。如果省略此选项,则来自副本的连接将使用默认(全局)命名空间。在不实现网络命名空间支持的平台上,当副本尝试连接到源时会失败。有关网络命名空间的信息,请参阅 第 5.1.14 节,“网络命名空间支持”NETWORK_NAMESPACE从 MySQL 8.0.22 开始可用。

PRIVILEGE_CHECKS_USER = {NULL | 'account'}

命名为指定通道提供安全上下文的用户帐户。NULL,这是默认值,表示不使用安全上下文。 PRIVILEGE_CHECKS_USER从 MySQL 8.0.18 开始可用。

用户帐户的用户名和主机名必须遵循 第 6.2.4 节“指定帐户名”中描述的语法,并且用户不能是匿名用户(用户名为空)或 CURRENT_USER. 该帐户必须具有 REPLICATION_APPLIER 特权,以及执行在通道上复制的交易所需的特权。有关帐户所需权限的详细信息,请参阅 第 17.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(应用程序)线程停止时,可以在正在运行的副本上执行使用 、 或这两个选项的 语句CHANGE REPLICATION SOURCE TO 。如果复制应用程序线程和复制 I/O(接收方)线程中的至少一个正在运行,则会保留中继日志。如果两个线程都停止,则删除所有中继日志文件,除非至少指定了 或之一。对于组复制应用程序通道(RELAY_LOG_FILERELAY_LOG_POSRELAY_LOG_FILERELAY_LOG_POSgroup_replication_applier),它只有一个应用程序线程而没有接收程序线程,如果应用程序线程停止,就会出现这种情况,但是对于该通道,您不能使用 RELAY_LOG_FILERELAY_LOG_POS选项。

REQUIRE_ROW_FORMAT = {0|1}

仅允许复制通道处理基于行的复制事件。此选项可防止复制应用程序执行创建临时表和执行LOAD DATA INFILE请求等操作,从而提高通道的安全性。异步复制通道默认禁用该REQUIRE_ROW_FORMAT 选项,但组复制通道默认启用该选项,并且无法为它们禁用。有关详细信息,请参阅 第 17.3.3 节,“复制权限检查”REQUIRE_ROW_FORMAT从 MySQL 8.0.19 开始可用。

REQUIRE_TABLE_PRIMARY_KEY_CHECK = {STREAM | ON | OFF}

使副本能够选择自己的主键检查策略。默认值为STREAMREQUIRE_TABLE_PRIMARY_KEY_CHECK从 MySQL 8.0.20 开始可用。

当该选项设置为ON用于复制通道时,副本始终在复制操作中使用系统变量的值 ONsql_require_primary_key 需要主键。当该选项设置为 OFF时,副本始终在复制操作中使用该值 OFFsql_require_primary_key因此永远不需要主键,即使源需要一个也是如此。当该 REQUIRE_TABLE_PRIMARY_KEY_CHECK选项设置为STREAM默认值时,副本使用从每个事务的源复制的任何值。

对于多源复制,设置 REQUIRE_TABLE_PRIMARY_KEY_CHECKON启用OFF副本以规范不同源的复制通道的行为,并保持 sql_require_primary_key 系统变量的一致设置。ON当多个源更新同一组表时,使用保护措施防止意外丢失主键。Using OFF允许可以操纵主键的源与不能操纵主键的源一起工作。

设置时PRIVILEGE_CHECKS_USER,设置REQUIRE_TABLE_PRIMARY_KEY_CHECKONOFF意味着用户帐户不需要会话管理级别权限来设置受限会话变量,这些变量需要更改值 sql_require_primary_key 以匹配每个事务的源设置。有关详细信息,请参阅 第 17.3.3 节,“复制权限检查”

SOURCE_AUTO_POSITION = {0|1}

使副本尝试使用基于 GTID 的复制的自动定位功能连接到源,而不是基于二进制日志文件的位置。此选项用于使用基于 GTID 的复制来启动副本。默认为 0,表示不使用 GTID 自动定位和基于 GTID 的复制。CHANGE REPLICATION SOURCE TO 仅当复制 SQL(应用程序)线程和复制 I/O(接收方)线程都停止 时,才能使用此选项。

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

SOURCE_AUTO_POSITION = 1设置,在初始连接握手中,副本发送一个 GTID 集,其中包含它已经接收、提交或两者都包含的事务。源通过发送记录在其二进制日志中的所有事务来响应,这些事务的 GTID 不包含在副本发送的 GTID 集中。此交换确保源仅发送具有副本尚未记录或提交的 GTID 的事务。如果副本从多个来源接收交易,如在菱形拓扑的情况下,自动跳过功能确保交易不会被应用两次。副本发送的GTID集是如何计算的,详见 第 17.1.3.3 节,“GTID 自动定位”

如果应由源发送的任何事务已从源的二进制日志中清除,或已 gtid_purged通过其他方法添加到系统变量中的 GTID 集,则源将错误发送 ER_MASTER_HAS_PURGED_REQUIRED_GTIDS 到副本,并且复制不会开始. 丢失的清除事务的 GTID 被识别并列在警告消息中的源错误日志中 ER_FOUND_MISSING_GTIDS. 此外,如果在事务交换期间发现副本已记录或提交了 GTID 中源的 UUID 的事务,但源本身尚未提交它们,则源将错误发送 ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER 到副本并且复制不会启动。有关如何处理这些情况的信息,请参阅 第 17.1.3.3 节,“GTID 自动定位”

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

SOURCE_BIND = 'interface_name'

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

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

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

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

可用的算法是zlibzstduncompressed,与 protocol_compression_algorithms 系统变量相同。可以按任何顺序指定算法,但它不是优先顺序 - 如果指定了算法协商过程,则会尝试使用 zlib, then zstd, then uncompressedSOURCE_COMPRESSION_ALGORITHMS从 MySQL 8.0.18 开始可用。

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

由系统变量激活的二进制日志事务压缩(自 MySQL 8.0.20 起可用) binlog_transaction_compression 也可用于节省带宽。如果结合连接压缩执行此操作,则连接压缩对数据起作用的机会较少,但仍可以压缩标头以及那些未压缩的事件和事务有效负载。有关二进制日志事务压缩的更多信息,请参阅 第 5.4.4.5 节,“二进制日志事务压缩”

SOURCE_CONNECT_RETRY = interval

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

尝试次数受 SOURCE_RETRY_COUNT选项限制。如果使用这两种默认设置,副本将在重新连接尝试之间等待 60 秒 ( SOURCE_CONNECT_RETRY=60),并在 60 天内继续尝试以此速率重新连接 ( SOURCE_RETRY_COUNT=86400)。这些值记录在源元数据存储库中,并显示在 replication_connection_configuration 性能模式表中。

SOURCE_CONNECTION_AUTO_FAILOVER = {0|1}

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

SOURCE_CONNECT_RETRY在由和 控制的重新连接尝试SOURCE_RETRY_COUNT耗尽 后,异步连接故障转移机制接管 。它将副本重新连接到从指定源列表中选择的替代源,您可以使用 asynchronous_connection_failover_add_sourceasynchronous_connection_failover_delete_source 函数管理该列表。要添加和删除托管服务器组,请改用 asynchronous_connection_failover_add_managedasynchronous_connection_failover_delete_managed 函数。有关详细信息,请参阅 第 17.4.9 节,“使用异步连接故障转移切换源和副本”

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

  2. 当您设置 时 SOURCE_CONNECTION_AUTO_FAILOVER = 1,将 SOURCE_RETRY_COUNT和 设置SOURCE_CONNECT_RETRY为仅允许对同一源进行几次重试的最小数字,以防连接失败是由瞬态网络中断引起的。否则异步连接故障转移机制不能及时启动。合适的值是 SOURCE_RETRY_COUNT=3SOURCE_CONNECT_RETRY=10,这使得副本以 10 秒的间隔重试连接 3 次。

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

  4. 从 MySQL 8.0.27 开始,当你设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1,如果此复制通道在单主模式下的组中的组复制主上,则会自动激活副本的异步连接故障转移。With this function active, if the primary that is replicating goes offline or into an error state, the new primary starts replication on the same channel when it is elected. 如果要使用该功能,还必须在复制组中的所有辅助服务器以及任何新加入的成员上设置此复制通道。(如果使用 MySQL 的克隆功能配置服务器,这一切都会自动发生。 group_replication_disable_member_action 函数禁用 Group Replication member action mysql_start_failover_channels_if_primary,默认情况下启用。有关详细信息,请参阅 第 17.4.9.2 节,“副本的异步连接故障转移”

SOURCE_DELAY = interval

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

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

SOURCE_HEARTBEAT_PERIOD = interval

控制心跳间隔,如果连接仍然良好,它会停止在没有数据的情况下发生的连接超时。在该秒数后,心跳信号将发送到副本,并且只要源的二进制日志更新了事件,等待时间就会重置。因此,仅当二进制日志文件中没有未发送的事件的时间长于此时间时,源才会发送心跳。

心跳间隔interval 是一个十进制值,取值范围为0到4294967秒,单位为毫秒;最小的非零值是 0.001。设置 interval为 0 将完全禁用心跳。replica_net_timeout心跳间隔默认为or slave_net_timeout系统变量值的一半 。它记录在源元数据存储库中,并显示在 replication_connection_configuration 性能模式表中。发出 RESET REPLICA将心跳间隔重置为默认值。

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

SOURCE_HOST = 'host_name'

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

如果您指定SOURCE_HOSTor SOURCE_PORT,则副本假定源服务器与以前不同(即使选项值与其当前值相同。)在这种情况下,源的二进制日志文件名和位置的旧值被认为是 no不再适用,因此如果您没有在声明中 指定SOURCE_LOG_FILEand , 则会默默地附加到它。 SOURCE_LOG_POSSOURCE_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,则副本使用 发布之前 复制 SQL 线程CHANGE REPLICATION SOURCE TO的最后坐标。这确保了复制没有中断,即使复制 SQL(应用程序)线程比复制 I/O(接收方)线程晚了。

SOURCE_PASSWORD = 'password'

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

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

密码在 MySQL 服务器的日志、性能模式表和SHOW PROCESSLIST语句中被屏蔽。

SOURCE_PORT = port_num

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

笔记

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

如果您指定SOURCE_HOSTor SOURCE_PORT,则副本假定源服务器与以前不同(即使选项值与其当前值相同。)在这种情况下,源的二进制日志文件名和位置的旧值被认为是 no不再适用,因此如果您没有在声明中 指定SOURCE_LOG_FILEand , 则会默默地附加到它。 SOURCE_LOG_POSSOURCE_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插件进行身份验证的复制用户帐户(这是 MySQL 8.0 的默认设置),并且您没有使用安全连接,则必须指定此选项或GET_SOURCE_PUBLIC_KEY=1向副本提供 RSA 公钥的选项。

SOURCE_RETRY_COUNT = count

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

尝试之间的间隔由 SOURCE_CONNECT_RETRY选项指定。如果使用这两种默认设置,副本将在重新连接尝试之间等待 60 秒 ( SOURCE_CONNECT_RETRY=60),并在 60 天内继续尝试以此速率重新连接 ( SOURCE_RETRY_COUNT=86400)。设置为 0SOURCE_RETRY_COUNT意味着重新连接尝试的次数没有限制,因此副本会无限期地尝试重新连接。

SOURCE_CONNECT_RETRY和 的值SOURCE_RETRY_COUNT记录在源元数据存储库中,并显示在 replication_connection_configuration 性能模式表中。 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=REQUIREDSOURCE_SSL=1--ssl-mode=PREFERREDSOURCE_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 支持,则会被忽略。字符串值 和 选项的值的最大长度为 511 个字符,但 除外 ,它的最大长度为 4000 个字符。 SOURCE_SSL_xxxSOURCE_TLS_xxxSOURCE_TLS_CIPHERSUITES

和 选项执行 与 加密连接 的命令选项中描述 的 和 客户端选项 相同的功能 。两组选项之间的对应关系,以及使用 和 选项来设置安全连接,在 第 17.3.1 节“设置复制以使用加密连接”中进行了解释。 SOURCE_SSL_xxxSOURCE_TLS_xxx--ssl-xxx--tls-xxxSOURCE_SSL_xxxSOURCE_TLS_xxx

SOURCE_USER = 'user_name'

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

对于组复制,此帐户必须存在于复制组的每个成员上。如果组使用 XCom 通信栈,它用于分布式恢复,如果组使用 MySQL 通信栈,它也用于组通信连接。与MySQL通讯栈,账号必须有 GROUP_REPLICATION_STREAM 权限。

可以通过指定来设置一个空的用户名 SOURCE_USER='',但是不能用一个空的用户名来启动复制通道。在 MySQL 8.0.21 之前的版本中, SOURCE_USER如果出于安全目的需要从复制元数据存储库中清除以前使用的凭据,则仅设置空用户名。之后不要使用通道,因为这些版本中的错误可以在从存储库读取空用户名时替换默认用户名(例如,在组复制通道自动重启期间)。从 MySQL 8.0.21 开始,设置一个空是有效的 SOURCE_USER如果您始终使用启动复制通道的START REPLICA语句或语句提供用户凭据,则使用用户名并在之后使用该 通道。START GROUP_REPLICATION这种方法意味着复制通道总是需要操作员干预才能重新启动,但用户凭证不会记录在复制元数据存储库中。

重要的

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

SOURCE_ZSTD_COMPRESSION_LEVEL = level

用于连接到使用 zstd压缩算法的复制源服务器的压缩级别。 SOURCE_ZSTD_COMPRESSION_LEVEL从 MySQL 8.0.18 开始可用。允许的级别从 1 到 22,值越大表示压缩级别越高。默认级别为 3。

压缩级别设置对不使用zstd压缩的连接没有影响。有关更多信息,请参阅 第 4.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;

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

当 GTID 在源和副本上使用时,指定 GTID 自动定位而不是给出二进制日志文件位置,如以下示例所示。有关在新的或停止的服务器、在线服务器或其他副本上配置和启动基于 GTID 的复制的完整说明,请参阅 第 17.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"将副本连接到指定主机的复制通道。有关设置多源复制的指南,请参阅第 17.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或其他方法跳过事务的说明,请参阅 第 17.1.7.3 节,“跳过事务”