15.4.2.2 将复制源更改为语句
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节,“Relay Log and Replication Metadata Repositories”)。
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
语句中的某些选项,您必须在发出STOP REPLICA
语句后,才能发出CHANGE REPLICATION SOURCE TO
语句(并且在发出START REPLICA
语句)。有时,您只需要停止复制SQL(applier)线程或复制I/O(receiver)线程,而不是两者:
-
当applier线程被停止时,您可以使用任何组合的
RELAY_LOG_FILE
、RELAY_LOG_POS
和SOURCE_DELAY
选项,包括在receiver线程运行的情况下。否则,不允许使用其他选项。 -
当接收线程停止时,您可以使用任何组合的选项执行
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 channel(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
。 -
如果您使用语句级别复制并且临时表,可能在执行
CHANGE REPLICATION SOURCE TO
语句后留下临时表在副本上。每当发生这种情况都会发出警告(ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
)。在执行这种语句前,您可以确保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-Based复制的源服务器到副本服务器的复制。对于多源副本,您可以混合使用
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
和不使用该功能的通道。默认是OFF
,表示该功能不被使用。LOCAL
将分配包括副本自己的UUID(server_uuid
设置)。
将分配包括指定UUID的GTID,例如副本服务器的源服务器的uuid
server_uuid
设置。使用非本地UUID让您可以区分在副本上起源的交易和在源上起源的交易,以及多源副本上起源的不同交易。您选择的UUID只对副本自己的用途有意义。如果源服务器发送的任何交易已经有了GTID,那么该GTID将被保留。组播复制特定的渠道不能使用
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
,但是异步复制渠道可以在服务器实例上执行该操作,该服务器实例是组播复制组成员。在这种情况下,不要将组播复制组名称指定为创建GTIDs的UUID。设置
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
到LOCAL
或
,复制服务器必须将uuid
gtid_mode=ON
设置,并且不能在以后更改。该选项用于与有二进制日志文件位置基于复制的源服务器一起使用,所以SOURCE_AUTO_POSITION=1
不能为渠道设置。同时,复制SQL线程和复制I/O(接收)线程都必须停止前设置该选项。Important在任何渠道上设置了
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的副本不能在发生故障转移时替换源服务器,备份副本也不能用于恢复源服务器。同样,对于使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的任何渠道上的其他副本都有相同的限制。关于更多限制和信息,见第19.1.3.6节,“从无GTIDs源服务器复制到有GTIDs副本服务器”。
-
启用基于RSA密钥对的密码交换,请求源服务器的公钥。该选项默认禁用。
这个选项适用于使用
caching_sha2_password
身份验证插件的副本。对于使用该插件认证的账户,源服务器不会发送公钥,除非被请求或指定在客户端。如果您使用认证为caching_sha2_password
插件(默认)的复制用户账户,并且不使用安全连接,您必须指定这个选项或SOURCE_PUBLIC_KEY_PATH
选项来提供RSA公钥给副本。 -
停止复制通道在复制元数据存储库中保留文件名和文件位置。
GTID_ONLY
对异步复制通道默认禁用,但对群组复制通道默认启用,且不能被禁用。对于具有该设置的复制通道,在内存中仍然跟踪文件位置,可以在错误信息和通过接口,如
SHOW REPLICA STATUS
语句中观察文件位置(如果它们是过期的,显示为无效)。然而,在GTID-基于复制不实际需要它们的情况下,避免了写入和读取文件位置的操作,包括事务队列和应用程序进程。只能在 replication SQL(应用)线程和 replication I/O(接收)线程都停止的情况下设置
GTID_ONLY = 1
。要为复制通道设置GTID_ONLY = 1
,服务器必须使用 GTIDs(gtid_mode = ON
),源服务器必须使用行基于的二进制日志记录(语句基于的复制不支持)。复制通道的选项REQUIRE_ROW_FORMAT = 1
和SOURCE_AUTO_POSITION = 1
必须被设置。当
GTID_ONLY = 1
设置时,副本使用replica_parallel_workers=1
,如果服务器的该系统变量设置为零,则总是技术上是一个多线程应用程序。这是因为多线程应用程序使用保存的位置,而不是复制元数据存储库来定位需要重新应用的事务。如果您禁用
GTID_ONLY
,已经设置的relay日志将被删除,已经知晓的二进制日志文件位置将被保留,即使它们是过期的。二进制日志和relay日志在复制元数据存储库中的文件位置可能无效,如果这样,返回警告。假设SOURCE_AUTO_POSITION
仍然启用,GTID自动定位将提供正确的定位。如果您也禁用
SOURCE_AUTO_POSITION
,二进制日志和relay日志在复制元数据存储库中的文件位置用于定位,如果它们是有效的。否则,您必须提供一个有效的二进制日志文件名和位置(SOURCE_LOG_FILE
和SOURCE_LOG_POS
)。如果您也提供relay日志文件名和位置(RELAY_LOG_FILE
和RELAY_LOG_POS
),relay日志将被保留,applier定位设置为所述的位置。GTID自动跳过确保已经应用的事务,即使最终applier定位不正确。 -
IGNORE_SERVER_IDS = (
server_id_list
)使得副本忽略来自指定服务器的事件。该选项接受一个逗号分隔的0或多个服务器ID列表。从服务器来的日志旋转和删除事件不被忽略,记录在relay日志中。
在环形复制中,源服务器通常作为事件的终止器,以避免事件被应用多次。因此,这个选项在环形复制中非常有用,当其中的一个服务器被移除时。假设你有一個环形复制设置,包括服务器1、2、3和4,服务器3失败。当从服务器2到服务器4恢复复制,你可以在服务器4上执行
CHANGE REPLICATION SOURCE TO
语句,包括IGNORE_SERVER_IDS = (3)
,让服务器4使用服务器2作为源,而不是服务器3。这样做会使得服务器4忽略并不传播来自已不再使用的服务器的语句。如果
IGNORE_SERVER_IDS
包含了服务器自己的ID,并且服务器启动时启用了--replicate-same-server-id
选项,会出现错误。源元数据仓库和
SHOW REPLICA STATUS
的输出提供了当前被忽略的服务器列表。更多信息,请参见第19.2.4.2节,“Replication Metadata Repositories”和第15.7.7.34节,“SHOW REPLICA STATUS Statement”。如果没有指定
IGNORE_SERVER_IDS
,执行CHANGE REPLICATION SOURCE TO
语句时,将保留现有的列表。要清除忽略服务器的列表,需要使用空列表选项,如下所示:CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();
RESET REPLICA ALL
也会清除IGNORE_SERVER_IDS
。当使用全局事务标识符(GTIDs)进行复制时,已经应用的事务将自动忽略。因此,
IGNORE_SERVER_IDS
与gtid_mode=ON
不兼容。如果gtid_mode
为ON
,CHANGE REPLICATION SOURCE TO
带有非空的IGNORE_SERVER_IDS
列表将被拒绝错误。类似地,如果某个现有的复制通道创建了要忽略的服务器ID列表,SET gtid_mode=ON
也将被拒绝。在开始基于GTID的复制前,在涉及到的服务器上检查并清除忽略服务器ID列表;可以通过SHOW REPLICA STATUS
的输出来检查。这样,可以使用之前所示的方式清除列表。 -
NETWORK_NAMESPACE = '
namespace
'用于 TCP/IP 连接到复制源服务器或,如果 MySQL 通信栈在使用,用于 Group 复制的组通信连接的网络命名空间。字符串值的最大长度为 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
'复制线程开始读取副本的下一个relay日志文件名和位置。
RELAY_LOG_FILE
可以使用绝对或相对路径,同样使用SOURCE_LOG_FILE
的基础名称。字符串值的最大长度为511个字符。在复制SQL线程停止的情况下,可以执行一个
CHANGE REPLICATION SOURCE TO
语句,使用RELAY_LOG_FILE
、RELAY_LOG_POS
或者这两个选项。relay日志文件如果至少有一个复制线程或I/O线程在运行,那么就保留。如果两个线程都停止,所有relay日志文件将被删除,除非指定了RELAY_LOG_FILE
或RELAY_LOG_POS
。对于 Group Replication applier 通道(group_replication_applier
),只有一个applier线程没有receiver线程,在这个通道下,如果applier线程停止,那么就不能使用RELAY_LOG_FILE
和RELAY_LOG_POS
选项。 -
仅允许行级别复制事件被处理的 replication 通道。这选项防止了复制应用程序执行创建临时表和执行
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
。
MySQL 复制支持基于生成不可见主键的差异,只要源服务器支持GIPK且复制服务器使用 MySQL 8.0.32 或更高版本。如果在源服务器上使用早期版本的 MySQL,除了额外的 GIPK 在 replica 上,其他 schema 差异不受支持可能导致复制错误。
在多源复制中,设置
REQUIRE_TABLE_PRIMARY_KEY_CHECK
为ON
或OFF
可以让副本对不同来源的行为进行 normalize,并保持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基于的复制。这选项只能与
CHANGE REPLICATION SOURCE TO
一起使用,如果同时停止了复制SQL(applier)线程和复制I/O(receiver)线程。复制服务器和源服务器都必须启用 GTIDs (
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 集合中的所有事务。这一交换确保源服务器只发送 replica 未记录或未提交的事务。如果复制服务器从多个源服务器接收事务,例如diamond拓扑结构,自动跳过函数确保事务不被应用两次。关于复制服务器发送的 GTID 集合计算方式,请参见第19.1.3.3节,“GTID 自动定位”。如果源服务器上的某些事务已经被 purge 掉了,或者在
gtid_purged
系统变量中通过其他方法添加到了 GTIDs 集合中,源服务器就将错误ER_SOURCE_HAS_PURGED_REQUIRED_GTIDS
发送给副本,复制不启动。缺少 purge 事务的 GTIDs 在源服务器错误日志中被标识并列举在警告信息ER_FOUND_MISSING_GTIDS
中。另外,如果在事务交换过程中发现副本已经记录或提交了源服务器的 UUID 在 GTID,但源服务器自己还没有提交它们,源服务器就将错误ER_REPLICA_HAS_MORE_GTIDS_THAN_SOURCE
发送给副本,复制不启动。关于如何处理这些情况,请参阅第 19.1.3.3 节,“GTID 自动定位”。可以通过检查性能chema中的
replication_connection_status
表或SHOW REPLICA STATUS
的输出来查看是否启用了GTID自动定位。再次禁用SOURCE_AUTO_POSITION
选项使得副本回退到基于文件的复制。 -
SOURCE_BIND = '
interface_name
'确定副本的网络接口哪个用于连接源,适用于具有多个网络接口的副本。指定网络接口的IP地址。字符串值的最大长度为255个字符。
使用该选项配置的IP地址,如果存在,可以在
SHOW REPLICA STATUS
的输出中看到,源元数据存储表mysql.slave_master_info中的Source_Bind
列。NDB集群也支持将副本绑定到特定的网络接口。 -
SOURCE_COMPRESSION_ALGORITHMS = '
算法
[,算法
][,算法
]'指定连接到复制源服务器的压缩算法,使用逗号分隔。字符串值的最大长度为99个字符。默认值是
uncompressed
。可用的算法有
zlib
、zstd
和uncompressed
,与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 =
interval
指定副本服务器在连接到源服务器超时后重连的时间间隔,单位为秒,默认值为60。
尝试次数受
SOURCE_RETRY_COUNT
选项限制。如果使用默认设置,复制服务器在重新连接时等待60秒 (SOURCE_CONNECT_RETRY=60
),并且在10分钟内以这个速度继续尝试重新连接 (SOURCE_RETRY_COUNT=10
)。这些值记录在源元数据存储库中,并显示在replication_connection_configuration
性能chema表中。 -
SOURCE_CONNECTION_AUTO_FAILOVER = {0|1}
如果有一个或多个备用复制源服务器可用,激活异步连接故障转移机制(例如,当有多个MySQL服务器或服务器组共享复制数据)。默认值为0,表示不激活该机制。详细信息和设置方法请见第19.4.9.2节,“异步连接故障转移for Replicas”。
异步连接故障转移机制在
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节,“异步连接故障转移”.Important-
只能在使用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
-
当您将
SOURCE_CONNECTION_AUTO_FAILOVER = 1
设置时,replication元数据存储库中必须包含用于连接所有源服务器的 replication用户帐户的凭证。该帐户还需要在性能架构表上拥有SELECT
权限。这些凭证可以使用CHANGE REPLICATION SOURCE TO
语句中的SOURCE_USER
和SOURCE_PASSWORD
选项设置。更多信息,请参见第19.4.9节,“异步连接故障机制”。 -
当您将
SOURCE_CONNECTION_AUTO_FAILOVER = 1
设置时,异步连接故障转移对于副本在单主模式下的组播 replication 通道自动激活。该函数活动时,如果正在复制的主服务器离线或进入错误状态,新的主服务器将在同一个通道上开始复制,当它被选举为主服务器。如果您想使用该函数,这个 replication 通道必须在所有副本服务器和加入的新成员中设置。如果您不想使用该函数,可以使用group_replication_disable_member_action()
函数来禁用组播 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
秒后发送心跳信号,并且每当源服务器的二进制日志文件更新事件时重置等待期限。因此,只有在二进制日志文件中没有未发送事件的情况下,源服务器才会发送心跳信号。心跳间隔
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
语句来调整心跳间隔,以便心跳信号在连接超时前发生。如果不这样做,心跳信号无效,如果源服务器未发送数据,副本可以重复尝试重新连接,创建僵尸dump线程。 -
副本服务器的主机名或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
,副本将使用复制 SQL 线程之前的最后坐标,这样可以确保复制不中断,即使复制 SQL (应用)线程晚于复制 I/O (接收)线程。 -
用于连接到复制源服务器的复制用户账户密码。字符串值的最大长度为 32 个字符。如果指定了
SOURCE_PASSWORD
,也需要指定SOURCE_USER
。在
CHANGE REPLICATION SOURCE TO
语句中使用的复制用户账户密码长度不能超过 32 个字符,否则将导致CHANGE REPLICATION SOURCE TO
失败。密码在 MySQL 服务器的日志、性能架构表和
SHOW PROCESSLIST
语句中被掩码。 -
副本使用的 TCP/IP 端口号,以连接到复制源服务器。
Note复制不能使用 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
,则只能在使用 OpenSSL 构建 MySQL 时使用SOURCE_PUBLIC_KEY_PATH
) 如果您使用的是使用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
性能 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
,如加密连接选项所述。使用SOURCE_SSL=1
,连接尝试只在建立加密连接时成功。复制连接不回退到未加密连接,所以没有对应于--ssl-mode=PREFERRED
设置的设置。如果设置SOURCE_SSL=0
,等同于--ssl-mode=DISABLED
。Important为了防止复杂的中间人攻击, replica 应该验证服务器的身份。你可以指定额外的
SOURCE_SSL_
选项,以对应设置xxx
--ssl-mode=VERIFY_CA
和--ssl-mode=VERIFY_IDENTITY
,这些设置比默认设置更好地防止这种攻击。使用这些设置, replica 会检查服务器证书的有效性,并检查 replica 使用的主机名是否与服务器证书中的身份相符。要实现这两个验证级别,你必须首先确保服务器的CA证书可靠地可供 replica 使用,否则将出现可用性问题。因此,这些设置不是默认设置。 -
SOURCE_SSL_xxx
,SOURCE_TLS_xxx
指定复制服务器使用加密和密码来安全地连接。这些选项可以在没有SSL支持的副本上更改,但它们将被保存到源元数据存储库中,如果副本不启用SSL支持则忽略。字符串值
SOURCE_SSL_xxx
和SOURCE_TLS_xxx
选项的最大长度为511个字符,除了SOURCE_TLS_CIPHERSUITES
外,为4000个字符。SOURCE_SSL_
和xxx
SOURCE_TLS_
选项与客户端选项xxx
--ssl-
和xxx
--tls-
的功能相同,详见加密连接命令选项。两个选项集之间的对应关系和使用xxx
SOURCE_SSL_
和xxx
SOURCE_TLS_
选项来设置安全连接的解释见第19.3.1节,“使用加密连接设置复制”。xxx
-
用于连接复制源服务器的 replication 用户账户名称。字符串值的最大长度为 96 个字符。
对于 Group Replication,这个账户必须在每个复制组成员上存在。它用于分布式恢复,如果 XCom 通信栈用于组,或者用于组通信连接,如果 MySQL 通信栈用于组。使用 MySQL 通信栈时,该账户必须拥有
GROUP_REPLICATION_STREAM
权限。可以通过指定
SOURCE_USER=''
来设置空用户名,但不能使用空用户名启动复制通道。设置空SOURCE_USER
用户名后,可以使用START REPLICA
语句或START GROUP_REPLICATION
语句启动复制通道。这意味着,复制通道总是需要操作员干预来重启,但用户凭证不会记录在复制元数据存储库中。Important使用缓存 SHA-2 密码插件认证的源服务器连接,您必须按照第19.3.1节,“使用加密连接设置”描述设置安全连接,或者启用未加密连接以支持 RSA 密钥对的密码交换。缓存 SHA-2 密码插件是新用户默认的(见第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 多源复制”。
下一个示例展示了如何让副本从relay日志文件中重复事务。为了实现这个目标,源服务器不需要可达。你可以使用CHANGE REPLICATION SOURCE TO
来定位relay日志位置,然后启动SQL线程:
CHANGE REPLICATION SOURCE TO
RELAY_LOG_FILE='replica-relay-bin.006',
RELAY_LOG_POS=4025;
START REPLICA SQL_THREAD;
CHANGE REPLICATION SOURCE TO
也可以用来跳过binary log中的事务,导致复制停止。是否使用GTIDs决定了该方法。关于使用CHANGE REPLICATION SOURCE TO
或其他方法跳过事务的说明,见第19.1.7.3节,“跳过事务”。