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
选项的值将检查换行符 (\n
或 0x0A
) 字符。这些值中存在此类字符会导致语句以错误失败。
可选的 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
子句来命名通道。有关更多信息,请参见 第 19.2.2 节,“复制通道”。channel
对于 CHANGE REPLICATION SOURCE TO
语句的一些选项,您必须在发出 CHANGE REPLICATION SOURCE TO
语句之前发出 STOP REPLICA
语句(并在之后发出 START REPLICA
语句)。有时,您只需要停止复制 SQL(应用器)线程或复制 I/O(接收器)线程,而不是两者都停止
当应用器线程停止时,您可以使用任何允许的
RELAY_LOG_FILE
、RELAY_LOG_POS
和SOURCE_DELAY
选项组合执行CHANGE REPLICATION SOURCE TO
,即使复制接收器线程正在运行。当接收器线程正在运行时,此语句不能使用其他选项。当接收器线程停止时,您可以使用此语句的任何选项(以任何允许的组合方式)执行
CHANGE REPLICATION SOURCE TO
,除了RELAY_LOG_FILE
、RELAY_LOG_POS
、SOURCE_DELAY
或SOURCE_AUTO_POSITION = 1
之外,即使应用器线程正在运行也是如此。在发出使用
SOURCE_AUTO_POSITION = 1
、GTID_ONLY = 1
或ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的CHANGE REPLICATION SOURCE TO
语句之前,接收器线程和应用器线程都必须停止。
您可以使用 SHOW REPLICA STATUS
检查复制应用器线程和复制接收器线程的当前状态。请注意,组复制应用器通道 (group_replication_applier
) 没有接收器线程,只有应用器线程。
CHANGE REPLICATION SOURCE TO
语句有一些副作用和交互,您应该事先了解它们。
CHANGE REPLICATION SOURCE TO
会导致正在进行的事务隐式提交。请参见 第 15.3.3 节,“导致隐式提交的语句”。CHANGE REPLICATION SOURCE TO
会导致SOURCE_HOST
、SOURCE_PORT
、SOURCE_LOG_FILE
和SOURCE_LOG_POS
的先前值写入错误日志,以及有关副本在执行之前状态的其他信息。如果您使用基于语句的复制和临时表,则在
STOP REPLICA
语句之后执行CHANGE REPLICATION SOURCE TO
语句可能会在副本上留下临时表。每当发生这种情况时,都会发出警告 (ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
)。在这种情况下,您可以通过确保在执行此类CHANGE REPLICATION SOURCE TO
语句之前,Replica_open_temp_tables
系统状态变量的值等于 0 来避免这种情况。当使用多线程副本 (
replica_parallel_workers
> 0) 时,停止副本会导致从中继日志中执行的事务序列中出现间隙,无论副本是故意停止还是其他原因停止。在 MySQL 9.0 中,可以使用 GTID 自动定位来解决这些间隙。
以下选项可用于 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
设置)。
分配一个 GTID,其中包含指定的 UUID,例如复制源服务器的uuid
server_uuid
设置。使用非本地 UUID 可以区分在副本上起源的事务和在源上起源的事务,对于多源副本,可以区分在不同源上起源的事务。您选择的 UUID 仅对副本自身的用途有意义。如果源发送的任何事务都已具有 GTID,则保留该 GTID。特定于组复制的通道无法使用
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
,但另一个源在作为组复制组成员的服务器实例上的异步复制通道可以使用它。在这种情况下,不要将组复制组名称指定为创建 GTID 的 UUID。要将
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置为LOCAL
或
,副本必须具有uuid
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 的副本”。
通过从源请求公钥来启用基于 RSA 密钥对的密码交换。默认情况下禁用该选项。
此选项适用于使用
caching_sha2_password
身份验证插件进行身份验证的副本。对于使用此插件进行身份验证的帐户的连接,源不会发送公钥,除非请求,因此必须在客户端中请求或指定它。如果提供了SOURCE_PUBLIC_KEY_PATH
并指定了一个有效的公钥文件,则它优先于GET_SOURCE_PUBLIC_KEY
。如果您使用的是使用caching_sha2_password
插件(默认值)进行身份验证的复制用户帐户,并且您没有使用安全连接,则必须指定此选项或SOURCE_PUBLIC_KEY_PATH
选项以将 RSA 公钥提供给副本。停止复制通道在复制元数据存储库中持久保存文件名和文件位置。对于异步复制通道,默认情况下禁用
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_FILE
和SOURCE_LOG_POS
)。如果您还提供中继日志文件名和位置(RELAY_LOG_FILE
和RELAY_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_IDS
与gtid_mode=ON
不兼容。如果gtid_mode
为ON
,则带有非空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_FILE
、RELAY_LOG_POS
或两者选项的CHANGE REPLICATION SOURCE TO
语句在正在运行的副本上执行。如果复制应用器线程和复制 I/O(接收器)线程至少有一个正在运行,则会保留中继日志。如果两个线程都已停止,则所有中继日志文件将被删除,除非至少指定了RELAY_LOG_FILE
或RELAY_LOG_POS
之一。对于 Group Replication 应用器通道(group_replication_applier
),该通道仅具有应用器线程,没有接收器线程,如果应用器线程已停止,则情况也是如此,但是对于该通道,您不能使用RELAY_LOG_FILE
和RELAY_LOG_POS
选项。仅允许复制通道处理基于行的复制事件。此选项可防止复制应用器采取创建临时表和执行
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 TABLE
或ALTER TABLE
语句必须生成包含主键的表。OFF
:副本设置sql_require_primary_key = OFF
;不会检查任何复制的CREATE TABLE
或ALTER TABLE
语句是否存在主键。STREAM
:副本使用从源为每个事务复制的sql_require_primary_key
的值。这是默认值,也是默认行为。GENERATE
:导致副本为任何InnoDB
表生成一个不可见的“主键”,该表在复制时缺少“主键”。有关更多信息,请参见第 15.1.20.11 节,“生成的不可见主键”.GENERATE
与 Group Replication 不兼容;您可以使用ON
、OFF
或STREAM
。
只要源支持 GIPK 并且副本使用 MySQL 8.0.32 或更高版本,MySQL Replication 支持基于仅在源或副本表上是否存在生成的不可见主键的差异。如果您在副本上使用 GIPK,而源使用的是更早版本的 MySQL,则除了副本上的额外 GIPK 之外,此类模式差异不受支持,可能会导致复制错误。
对于多源复制,将
REQUIRE_TABLE_PRIMARY_KEY_CHECK
设置为ON
或OFF
允许副本规范化不同源的复制通道的行为,以及保持sql_require_primary_key
的一致设置。使用ON
可以防止当多个源更新同一组表时意外丢失主键。使用OFF
允许可以操作主键的源与无法操作主键的源一起工作。在多个副本的情况下,当
REQUIRE_TABLE_PRIMARY_KEY_CHECK
设置为GENERATE
时,给定副本添加的生成的不可见主键独立于在任何其他副本上添加的任何此类主键。这意味着,如果使用生成的不可见主键,则不同副本上生成的“主键”列中的值不保证相同。当故障转移到此类副本时,这可能是一个问题。当
PRIVILEGE_CHECKS_USER
为NULL
(默认值)时,用户帐户不需要管理级别权限才能设置受限制的会话变量。将此选项设置为除NULL
以外的值意味着,当REQUIRE_TABLE_PRIMARY_KEY_CHECK
为ON
、OFF
或GENERATE
时,用户帐户不需要会话管理级别权限才能设置受限制的会话变量,例如sql_require_primary_key
,避免需要授予帐户此类权限。有关更多信息,请参见第 19.3.3 节,“复制权限检查”.使副本尝试使用基于 GTID 的复制的自动定位功能连接到源,而不是基于二进制日志文件的定位。此选项用于使用基于 GTID 的复制启动副本。默认值为 0,表示不使用 GTID 自动定位和基于 GTID 的复制。只有在复制 SQL(应用)线程和复制 I/O(接收)线程都停止的情况下,此选项才能与
CHANGE REPLICATION SOURCE TO
结合使用。副本和源都必须启用 GTID (
GTID_MODE=ON
、ON_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 集的详细信息,请参见 第 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
系统变量相同,分别是zlib
、zstd
和uncompressed
。这些算法可以按任意顺序指定,但不是优先级顺序 - 算法协商过程尝试使用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_RETRY
和SOURCE_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 节,“使用异步连接故障转移切换源和副本”。重要您只能在使用 GTID 自动定位 (
SOURCE_AUTO_POSITION = 1
) 时设置SOURCE_CONNECTION_AUTO_FAILOVER = 1
。当您设置
SOURCE_CONNECTION_AUTO_FAILOVER = 1
时,请将SOURCE_RETRY_COUNT
和SOURCE_CONNECT_RETRY
设置为最小的数字,这些数字只允许对同一源进行几次重试,以防连接失败是由瞬态网络故障引起的。否则,异步连接故障转移机制无法及时激活。合适的值是SOURCE_RETRY_COUNT=3
和SOURCE_CONNECT_RETRY=10
,它们使副本以 10 秒的间隔重试连接 3 次。当您设置
SOURCE_CONNECTION_AUTO_FAILOVER = 1
时,复制元数据存储库必须包含用于连接到复制通道源列表上所有服务器的复制用户帐户的凭据。该帐户还必须对 Performance Schema 表具有SELECT
权限。可以使用CHANGE REPLICATION SOURCE TO
语句以及SOURCE_USER
和SOURCE_PASSWORD
选项来设置这些凭据。有关更多信息,请参见 第 19.4.9 节,“使用异步连接故障转移切换源和副本”。当您设置
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 节,“副本的异步连接故障转移”。
指定副本必须落后于源多少秒。从源接收到的事件在比源上执行晚至少
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
以将心跳间隔调整为适当的值,以便心跳信号在连接超时之前发生。 如果您不这样做,心跳信号将不起作用,如果未从源接收数据,副本可能会重复尝试重新连接,从而创建僵尸转储线程。复制源服务器的主机名或 IP 地址。 副本使用它来连接到源。 字符串值的最大长度为 255 个字符。
如果您指定了
SOURCE_HOST
或SOURCE_PORT
,副本会认为源服务器与之前不同(即使选项值与当前值相同)。 在这种情况下,源的二进制日志文件名和位置的旧值将被视为不再适用,因此,如果您未在语句中指定SOURCE_LOG_FILE
和SOURCE_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_FILE
或SOURCE_LOG_POS
,则不能指定SOURCE_AUTO_POSITION = 1
,这是用于基于 GTID 的复制。如果未指定
SOURCE_LOG_FILE
或SOURCE_LOG_POS
,则副本使用发出CHANGE REPLICATION SOURCE TO
之前 复制 SQL 线程 的最后一个坐标。 这样可以确保复制不会出现不连续性,即使复制 SQL(应用程序)线程比复制 I/O(接收器)线程慢。用于连接到复制源服务器的复制用户帐户的密码。 字符串值的最大长度为 32 个字符。 如果您指定了
SOURCE_PASSWORD
,则也需要SOURCE_USER
。在
CHANGE REPLICATION SOURCE TO
语句中用于复制用户帐户的密码长度限制为 32 个字符。 尝试使用超过 32 个字符的密码会导致CHANGE REPLICATION SOURCE TO
失败。密码在 MySQL Server 的日志、Performance Schema 表和
SHOW PROCESSLIST
语句中被屏蔽。副本用于连接到复制源服务器的 TCP/IP 端口号。
注意复制不能使用 Unix 套接字文件。 您必须能够使用 TCP/IP 连接到复制源服务器。
如果您指定了
SOURCE_HOST
或SOURCE_PORT
,副本会认为源服务器与之前不同(即使选项值与当前值相同)。 在这种情况下,源的二进制日志文件名和位置的旧值将被视为不再适用,因此,如果您未在语句中指定SOURCE_LOG_FILE
和SOURCE_LOG_POS
,则会静默附加SOURCE_LOG_FILE=''
和SOURCE_LOG_POS=4
。SOURCE_PUBLIC_KEY_PATH = '
key_file_name
'通过提供包含源所需的公钥的副本端副本的路径名,启用基于 RSA 密钥对的密码交换。 该文件必须采用 PEM 格式。 字符串值的最大长度为 511 个字符。
此选项适用于使用
sha256_password
或caching_sha2_password
身份验证插件进行身份验证的副本。 (对于sha256_password
,SOURCE_PUBLIC_KEY_PATH
仅在使用 OpenSSL 构建 MySQL 时才可以使用。)如果您使用的是使用caching_sha2_password
插件(默认值)进行身份验证的复制用户帐户,并且您未使用安全连接,则必须指定此选项或GET_SOURCE_PUBLIC_KEY=1
选项以向副本提供 RSA 公钥。设置副本在连接到源超时后进行的重新连接尝试次数的最大值,由
replica_net_timeout
系统变量确定。 如果副本确实需要重新连接,则第一次重试会在超时后立即进行。 默认值为 10 次尝试。尝试之间的间隔由
SOURCE_CONNECT_RETRY
选项指定。 如果使用默认设置,副本会在重新连接尝试之间等待 60 秒(SOURCE_CONNECT_RETRY=60
),并以这种速度持续尝试重新连接 10 分钟(SOURCE_RETRY_COUNT=10
)。SOURCE_RETRY_COUNT
设置为 0 表示重新连接尝试次数没有限制,因此副本将无限期地尝试重新连接。SOURCE_CONNECT_RETRY
和SOURCE_RETRY_COUNT
的值记录在源元数据存储库中,并在replication_connection_configuration
Performance Schema 表中显示。SOURCE_RETRY_COUNT
优先于--master-retry-count
服务器启动选项。指定副本是否加密复制连接。 默认值为 0,表示副本不加密复制连接。 如果您将
SOURCE_SSL=1
设置为,则可以使用SOURCE_SSL_
和xxx
SOURCE_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_
和xxx
SOURCE_TLS_
选项的值的最大长度为 511 个字符,xxx
SOURCE_TLS_CIPHERSUITES
除外,其最大长度为 4000 个字符。SOURCE_SSL_
和xxx
SOURCE_TLS_
选项执行与 Command Options for Encrypted Connections 中描述的xxx
--ssl-
和xxx
--tls-
客户端选项相同的函数。 两组选项之间的对应关系,以及使用xxx
SOURCE_SSL_
和xxx
SOURCE_TLS_
选项建立安全连接,在 Section 19.3.1, “Setting Up Replication to Use Encrypted Connections” 中进行了说明。xxx
用于连接到复制源服务器的复制用户帐户的用户名。字符串值的最大长度为 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 节“跳过事务”。