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
语句之前(并在之后发出 START REPLICA
语句)发出 STOP 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 8.4 中,可以使用 GTID 自动定位来解决这些问题。
以下是 CHANGE REPLICATION SOURCE TO
语句的可用选项。
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = {OFF | LOCAL |
uuid
}使复制通道为没有 GTID 的复制事务分配 GTID,从而能够从不使用基于 GTID 的复制的源复制到使用 GTID 的副本。对于多源副本,您可以混合使用使用
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的通道和不使用它的通道。默认值为OFF
,表示不使用此功能。LOCAL
会分配一个包含副本自身 UUID(server_uuid
设置)的 GTID。
会分配一个包含指定 UUID 的 GTID,例如复制源服务器的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 来弥合差距时,您可以在您在服务器 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.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
表生成一个不可见的(invisible)主键。有关更多信息,请参阅 第 15.1.20.11 节“生成的不可见主键”。GENERATE
与 Group Replication 不兼容;您可以使用ON
、OFF
或STREAM
。
只要源支持 GIPK 并且副本使用 MySQL 8.0.32 或更高版本,MySQL 复制就支持仅基于源或副本表上是否存在生成的不可见主键的差异。如果您在副本上使用 GIPK,而源使用的是早期版本的 MySQL,则此类模式差异(除副本上的额外 GIPK 外)不受支持,可能会导致复制错误。
对于多源复制,将
REQUIRE_TABLE_PRIMARY_KEY_CHECK
设置为ON
或OFF
允许副本跨不同源的复制通道规范化行为,并保持sql_require_primary_key
的一致设置。使用ON
可以防止当多个源更新同一组表时意外丢失主键。使用OFF
允许可以操作主键的源与不能操作主键的源一起工作。在多个副本的情况下,当
REQUIRE_TABLE_PRIMARY_KEY_CHECK
设置为GENERATE
时,由给定副本添加的生成的不可见主键独立于在任何其他副本上添加的此类主键。这意味着,如果使用生成的不可见主键,则不同副本上生成的 primary key 列中的值不能保证相同。这在故障转移到此类副本时可能是一个问题。当
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 的复制。此选项只能与
CHANGE REPLICATION SOURCE TO
一起使用,前提是复制 SQL(应用程序)线程和复制 I/O(接收器)线程都已停止。副本和源都必须启用 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
。可用的算法是
zlib
、zstd
和uncompressed
,与protocol_compression_algorithms
系统变量相同。算法可以按任何顺序指定,但这不是优先顺序 - 算法协商过程尝试使用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
)。这些值会记录在源元数据存储库中,并在 Performance Schema 表replication_connection_configuration
中显示。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
,这使得副本尝试连接 3 次,每次尝试之间间隔 10 秒。设置
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 节,“延迟复制”。使用
SOURCE_DELAY
选项的CHANGE REPLICATION SOURCE TO
语句可以在复制 SQL 线程停止时在运行的副本上执行。SOURCE_HEARTBEAT_PERIOD =
interval
控制心跳间隔,当没有数据时,如果连接仍然有效,则可以阻止连接超时。 在指定秒数后,会向副本发送心跳信号,并且每当源的二进制日志更新事件时,等待时间都会重置。 因此,只有在二进制日志文件中没有未发送的事件超过指定时间段后,源才会发送心跳。
心跳间隔
interval
是一个小数,取值范围为 0 到 4294967 秒,分辨率为毫秒;最小的非零值为 0.001。 将interval
设置为 0 将完全禁用心跳。 心跳间隔默认为replica_net_timeout
系统变量值的一半。 它记录在源元数据存储库中,并在replication_connection_configuration
性能架构表中显示。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_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
,副本将使用 复制 SQL 线程 在发出CHANGE REPLICATION SOURCE TO
之前的最后一个坐标。 这确保了复制没有中断,即使复制 SQL(应用器)线程比复制 I/O(接收器)线程晚。用于连接到复制源服务器的复制用户帐户的密码。 字符串值的最大长度为 32 个字符。 如果指定了
SOURCE_PASSWORD
,则还需要SOURCE_USER
。在
CHANGE REPLICATION SOURCE TO
语句中用于复制用户帐户的密码长度限制为 32 个字符。 尝试使用超过 32 个字符的密码会导致CHANGE REPLICATION SOURCE TO
失败。密码在 MySQL 服务器的日志、性能架构表和
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
仅当 MySQL 使用 OpenSSL 构建时才可用。) 如果您使用使用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
性能架构表中显示。SOURCE_RETRY_COUNT
优先于--master-retry-count
服务器启动选项。指定副本是否加密复制连接。 默认值为 0,表示副本不加密复制连接。 如果您将
SOURCE_SSL=1
设置为 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.2 节,“缓存 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 节,“跳过交易”。