Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  CHANGE REPLICATION SOURCE TO Statement

15.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 | 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] ... ]

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

更改复制源到 需要 REPLICATION_SLAVE_ADMIN 权限(或已弃用的 SUPER 权限)。

您未在 更改复制源到 语句中指定的选项将保留其值,除非在以下讨论中指出。在大多数情况下,因此无需指定不变的选项。

用于 SOURCE_HOST 和其他 更改复制源到 选项的值将检查换行符(\n0x0A)字符。这些值中的这种字符的存在将导致语句失败并出现错误。

可选的 FOR CHANNEL channel 子句允许您指定该语句应用于哪个复制通道。提供 FOR CHANNEL channel 子句将 更改复制源到 语句应用于特定的复制通道,并用于添加新通道或修改现有通道。例如,要添加一个名为 channel2 的新通道:

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

如果没有命名从属关系并且不存在额外的通道,则更改复制源到语句将应用于默认通道,其名称为空字符串(")。当您设置了多个复制通道时,每个更改复制源到语句必须使用FOR CHANNEL channel子句命名一个通道。请参阅第 19.2.2 节,“复制通道”以获取更多信息。

对于更改复制源到语句的一些选项,您必须在发出更改复制源到语句之前发出STOP REPLICA语句(然后发出START REPLICA语句)。有时,您只需要停止复制 SQL(应用程序)线程或复制 I/O(接收器)线程,而不是两者:

您可以使用 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-based复制的源服务器能够复制到使用GTID的副本服务器。在多源副本中,可以混合使用使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS的通道和不使用该选项的通道。默认值为OFF,表示该功能未启用。

    LOCAL将GTID分配包括副本自己的UUID(server_uuid设置)。 uuid将GTID分配包括指定的UUID,例如复制源服务器的server_uuid设置。使用非本地UUID可以区分副本和源服务器上originated的事务,并且对于多源副本,可以区分来自不同源的事务。您选择的UUID仅对副本自己的使用有意义。如果源服务器发送的事务已经具有GTID,那么该GTID将被保留。

    Group Replication专用通道不能使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS,但是异步复制通道可以在Group Replication组成员服务器实例上使用该选项。在这种情况下,不要将Group Replication组名指定为创建GTID的UUID。

    要将ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS设置为LOCALuuid,副本必须将gtid_mode=ON设置,并且不能在以后更改该设置。该选项用于与具有二进制日志文件位置基于复制的源服务器一起使用,因此不能将SOURCE_AUTO_POSITION=1设置为该通道。复制SQL线程和复制I/O(receiver)线程必须在设置该选项之前停止。

    Important

    使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS在任何通道上的副本不能在需要故障转移时取代复制源服务器,并且从副本备份不能用于恢复复制源服务器。同样的限制也适用于使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS在任何通道上的其他副本的替换或恢复。

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

  • GET_SOURCE_PUBLIC_KEY = {0|1}

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

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

  • GTID_ONLY = {0|1}

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

    对于具有该设置的复制通道,在内存中仍然跟踪文件位置,并且可以通过错误消息和接口(如SHOW REPLICA STATUS语句)观察文件位置(如果它们过时,将显示为无效)。然而,在不需要持久化文件位置的情况下,避免了写入和读取操作,包括事务队列和应用程序过程。

    该选项只能在复制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)

    使副本忽略来自指定服务器的事件。该选项采用逗号分隔的服务器 ID 列表。日志轮换和删除事件来自服务器,不会被忽略,并将记录在中继日志中。

    在环形复制中,原始服务器通常充当自己的事件终止者,以便它们不会被应用多次。因此,该选项在环形复制中非常有用,当其中一个服务器从环中删除时。假设您有一个环形复制设置,具有服务器 ID 1、2、3 和 4,服务器 3 失败。当通过从服务器 2 到服务器 4 的复制来桥接间隙时,您可以在服务器 4 上的 CHANGE REPLICATION SOURCE TO 语句中包含 IGNORE_SERVER_IDS = (3),以告诉它使用服务器 2 作为其源,而不是服务器 3。这样做将导致它忽略并且不传播来自不再使用的服务器的任何语句。

    如果 IGNORE_SERVER_IDS 包含服务器自己的 ID,并且服务器以 --replicate-same-server-id 选项启用启动,那么将出现错误。

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

    如果发出 CHANGE REPLICATION SOURCE TO 语句,而不带 IGNORE_SERVER_IDS,那么现有的列表将被保留。要清除忽略服务器的列表,需要使用带空列表的选项,如下所示:

    CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();

    RESET REPLICA ALL 也将清除 IGNORE_SERVER_IDS

    当使用全局事务标识符(GTIDs)进行复制时,已经应用的交易将自动被忽略。因此,IGNORE_SERVER_IDS 不兼容于 gtid_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 = '命名空间'

    用于复制源服务器的TCP/IP连接或组复制组通信连接的网络命名空间。如果省略此选项,副本将使用默认(全局)命名空间。在不支持网络命名空间的平台上,副本尝试连接到源时将失败。有关网络命名空间的信息,请参阅第 7.1.14 节,“网络命名空间支持”

  • PRIVILEGE_CHECKS_USER = {NULL | '账户'}

    指定了一个用户账户,该账户提供了指定通道的安全上下文。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 个字符。

    使用 RELAY_LOG_FILERELAY_LOG_POS 或这两个选项的 CHANGE REPLICATION SOURCE TO 语句可以在复制 SQL(应用程序)线程停止时在运行的副本上执行。relay 日志将被保留,如果至少有一个复制应用程序线程和复制 I/O(接收器)线程正在运行。如果两个线程都停止了,除非指定了 RELAY_LOG_FILERELAY_LOG_POS 中的至少一个,否则所有 relay 日志文件将被删除。对于 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 值为每个事务的默认值和默认行为。

    • 生成: 导致副本生成不可见的主键对于任何InnoDB表,该表在复制时缺少主键。请参阅第 15.1.20.11 节,“生成的不可见主键”,以获取更多信息。

      生成 不兼容于组复制;您可以使用 ONOFFSTREAM

    基于源或副本表中生成的不可见主键的差异由 MySQL 复制支持,只要源支持 GIPKs 并且副本使用 MySQL 8.0.32 或更高版本。如果您在使用早期版本的 MySQL 的副本上使用 GIPKs,除了副本上的额外 GIPK 之外,其他 schema 差异可能不受支持并可能导致复制错误。

    对于多源复制,设置 REQUIRE_TABLE_PRIMARY_KEY_CHECKONOFF 允许副本在不同的复制通道上标准化行为,并保持一致的 sql_require_primary_key 设置。使用 ON 防止在多个源更新同一组表时意外丢失主键。使用 OFF 允许可以操作主键的源与不能操作主键的源一起工作。

    在多个副本的情况下,当 REQUIRE_TABLE_PRIMARY_KEY_CHECK 设置为 生成 时,由某个副本添加的生成的不可见主键独立于其他副本添加的任何这样的键。这意味着,如果使用生成的不可见主键,different 副本上的生成主键列中的值不保证相同。这可能在故障转移到这样的副本时出现问题。

    PRIVILEGE_CHECKS_USERNULL(默认值)时,用户帐户不需要管理级别权限来设置受限的会话变量。将此选项设置为其他值意味着,当 REQUIRE_TABLE_PRIMARY_KEY_CHECKONOFF生成 时,用户帐户不需要会话管理级别权限来设置受限的会话变量,如 sql_require_primary_key,避免了授予帐户这样的权限。有关更多信息,请参阅第 19.3.3 节,“复制权限检查”

  • SOURCE_AUTO_POSITION = {0|1}

    使用自动定位功能连接到源,而不是使用二进制日志文件位置。这项选项用于使用GTID基于的复制启动副本。默认值为0,表示不使用GTID自动定位和GTID基于的复制。这项选项只能与CHANGE REPLICATION SOURCE TO一起使用,前提是复制SQL(应用程序)线程和复制I/O(接收器)线程都已停止。

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

    使用SOURCE_AUTO_POSITION = 1设置,在初始连接握手机制中,副本将发送包含已经接收、提交或两者的交易的GTID集。源将响应发送其二进制日志中记录的所有交易,GTID不在副本发送的GTID集中。这次交换确保源只发送副本尚未记录或提交的交易。如果副本从多个源接收交易,如diamond拓扑结构中,自动跳过函数确保交易不会被应用两次。有关副本发送的GTID集如何计算的详细信息,请参阅第19.1.3.3节,“GTID自动定位”

    如果源服务器上的某些事务已经从二进制日志中清除,或者通过其他方法添加到gtid_purged系统变量中,那么源服务器将错误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 自动定位”

    您可以通过检查性能模式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 集群也支持将副本绑定到特定的网络接口。

  • SOURCE_COMPRESSION_ALGORITHMS = '算法[,算法][,算法]'

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

    可用的算法是 zlibzstduncompressed,与 protocol_compression_algorithms 系统变量相同。算法可以以任意顺序指定,但不是优先顺序 - 算法协商过程尝试使用 zlib,然后是 zstd,最后是 uncompressed,如果它们被指定。

    如果 replica_compressed_protocol 系统变量被禁用,则 SOURCE_COMPRESSION_ALGORITHMS 的值才生效。如果 replica_compressed_protocol 被启用,它将优先于 SOURCE_COMPRESSION_ALGORITHMS,并且连接到源使用 zlib 压缩,如果源和副本都支持该算法。有关更多信息,请参阅 第 6.2.8 节,“连接压缩控制”

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

  • SOURCE_CONNECT_RETRY = 间隔

    指定副本在连接到源超时后重新连接的间隔时间,以秒为单位。默认间隔为 60。

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

  • 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 节,“使用异步连接故障转移切换源和副本”

    Important
    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 时,复制元数据存储库必须包含用于连接到所有源列表服务器的复制用户帐户凭据。该帐户还必须具有 SELECT 权限在性能模式表上。这些凭据可以使用 CHANGE REPLICATION SOURCE TO 语句的 SOURCE_USERSOURCE_PASSWORD 选项来设置。有关更多信息,请参阅 第 19.4.9 节,“使用异步连接故障转移切换源和副本”

    4. 当您设置 SOURCE_CONNECTION_AUTO_FAILOVER = 1 时,对于副本的异步连接故障转移将自动激活,如果该复制通道位于单一主模式下的组复制主服务器上。启用该功能后,如果主服务器离线或进入错误状态,新的主服务器将在选举后在同一通道上启动复制。如果您想使用该功能,该复制通道还必须在所有次要服务器和任何新加入的成员上设置。(如果服务器使用 MySQL 的克隆功能进行 provision,这一切都会自动发生。)如果您不想使用该功能,可以使用 group_replication_disable_member_action() 函数禁用组复制成员操作 mysql_start_failover_channels_if_primary,默认情况下启用该操作。有关更多信息,请参阅 第 19.4.9.2 节,“副本的异步连接故障转移”

  • SOURCE_DELAY = interval

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

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

  • 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 = '主机名'

    复制源服务器的主机名或 IP 地址。从站使用该主机名或 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_POS = 源日志位置

    二进制日志文件名和位置,复制I/O(receiver)线程从源服务器的二进制日志文件中开始读取的位置,下一次线程启动时。指定这些选项,如果您使用基于二进制日志文件位置的复制。

    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_FILE 也没有指定 SOURCE_LOG_POS,则复制使用 复制SQL线程CHANGE REPLICATION SOURCE TO 发出之前的最后一个坐标。这确保了复制的连续性,即使复制SQL(applier)线程比复制I/O(receiver)线程晚。

  • SOURCE_PASSWORD = '密码'

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

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

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

  • SOURCE_PORT = 端口号

    复制使用的TCP/IP端口号,以连接到复制源服务器。

    Note

    复制不能使用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 只能在 MySQL 使用 OpenSSL 构建时使用。)如果您使用身份验证插件 caching_sha2_password(默认)进行身份验证,并且不使用安全连接,则必须指定此选项或 GET_SOURCE_PUBLIC_KEY=1 选项,以提供 RSA 公钥给副本。

  • SOURCE_RETRY_COUNT = count

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

    Note

    在 MySQL 8.1 中,SOURCE_RETRY_COUNT 的默认值为 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 性能模式表中显示。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,如 命令选项加密连接 中所述。使用 SOURCE_SSL=1,连接尝试仅在建立加密连接时成功,不会回退到不加密连接,因此没有设置对应于 --ssl-mode=PREFERRED 的设置。如果 SOURCE_SSL=0 被设置,这相当于 --ssl-mode=DISABLED

    Important

    为了防止复杂的中间人攻击,对于复制连接非常重要的是验证服务器的身份。你可以指定其他 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选项执行与--ssl-xxx--tls-xxx客户端选项相同的功能,详见命令选项用于加密连接。这两个选项集之间的对应关系,以及使用SOURCE_SSL_xxxSOURCE_TLS_xxx选项设置安全连接的详细信息,见第 19.3.1 节,“设置复制使用加密连接”

  • SOURCE_USER = 'user_name'

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

    对于组复制,这个账户必须存在于组中的每个成员中。如果使用XCom通信栈,它将用于分布式恢复;如果使用MySQL通信栈,它将用于组通信连接。在使用MySQL通信栈时,该账户必须具有GROUP_REPLICATION_STREAM权限。

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

    Important

    要使用复制用户帐户连接到源服务器,该帐户使用 caching_sha2_password 插件进行身份验证,必须设置安全连接,如 第 19.3.1 节,“设置复制以使用加密连接”所述,或者启用未加密的连接以支持使用 RSA 密钥对交换密码。 caching_sha2_password 身份验证插件是新用户的默认设置(请参阅 第 8.4.1.2 节,“caching 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 节,“连接压缩控制”

示例

更改复制源到 在设置副本时非常有用,当您拥有源的快照并记录了源的二进制日志坐标对应于快照的时间。加载快照到副本中以同步它与源,然后可以在副本上运行 更改复制源到 SOURCE_LOG_FILE='日志名称', SOURCE_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 节,“故障转移期间切换源”

当源和副本上都使用 GTIDs 时,指定 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";

在这个示例中,多源复制正在使用中,并将 更改复制源到 语句应用于连接副本到指定主机的复制通道 "source_3"。有关设置多源复制的指导,请参阅 第 19.1.5 节,“MySQL 多源复制”

下一个示例显示了如何使副本应用从中继日志文件中您想要重复的事务。为此,源不需要可达。您可以使用 更改复制源到 定位中继日志位置,以便副本重新应用事务,然后启动 SQL 线程:

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

更改复制源到 也可以用来跳过二进制日志中的事务,以便复制停止。是否使用GTIDs将决定跳过事务的方法。有关使用 更改复制源到 或其他方法跳过事务的说明,请参阅 第 19.1.7.3 节,“跳过事务”