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
和其他 更改复制源到
选项的值将检查换行符(\n
或 0x0A
)字符。这些值中的这种字符的存在将导致语句失败并出现错误。
可选的 FOR CHANNEL
子句允许您指定该语句应用于哪个复制通道。提供 channel
FOR CHANNEL
子句将 channel
更改复制源到
语句应用于特定的复制通道,并用于添加新通道或修改现有通道。例如,要添加一个名为 channel2
的新通道:
CHANGE REPLICATION SOURCE TO SOURCE_HOST=host1, SOURCE_PORT=3002 FOR CHANNEL 'channel2';
如果没有命名从属关系并且不存在额外的通道,则更改复制源到
语句将应用于默认通道,其名称为空字符串(")。当您设置了多个复制通道时,每个更改复制源到
语句必须使用FOR CHANNEL
子句命名一个通道。请参阅第 19.2.2 节,“复制通道”以获取更多信息。channel
对于更改复制源到
语句的一些选项,您必须在发出更改复制源到
语句之前发出STOP REPLICA
语句(然后发出START REPLICA
语句)。有时,您只需要停止复制 SQL(应用程序)线程或复制 I/O(接收器)线程,而不是两者:
-
当应用程序线程停止时,您可以使用任何允许的组合执行
更改复制源到
,包括RELAY_LOG_FILE
、RELAY_LOG_POS
和SOURCE_DELAY
选项,即使接收器线程正在运行。不能与正在运行的接收器线程一起使用其他选项。 -
当接收器线程停止时,您可以使用
更改复制源到
语句的任何选项(在任何允许的组合中),除了RELAY_LOG_FILE
、RELAY_LOG_POS
、SOURCE_DELAY
或SOURCE_AUTO_POSITION = 1
,即使应用程序线程正在运行。 -
在发出使用
更改复制源到
语句的SOURCE_AUTO_POSITION = 1
、GTID_ONLY = 1
或ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项之前,必须停止接收器线程和应用程序线程。
您可以使用 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
值被写入错误日志,连同复制状态的其他信息。 -
如果您使用基于语句的复制和临时表,在执行
CHANGE REPLICATION SOURCE TO
语句后,可能会在复制服务器上留下临时表。在这种情况下,将发出警告 (ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
)。您可以通过确保Replica_open_temp_tables
系统状态变量的值为 0 来避免这种情况,然后执行CHANGE REPLICATION SOURCE TO
语句。 -
使用多线程复制服务器 (
replica_parallel_workers
> 0) 时,停止复制服务器可能会导致中继日志中执行的事务序列中的间隙。无论是有意还是无意停止复制服务器,都是如此。在 MySQL 8.3 中,这些间隙可以使用 GTID 自动定位来解决。
以下选项可用于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
设置)。
将GTID分配包括指定的UUID,例如复制源服务器的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
设置为LOCAL
或
,副本必须将uuid
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的副本的复制”。
-
启用基于RSA密钥对的密码交换,通过从源请求公钥。该选项默认情况下处于禁用状态。
该选项适用于使用
身份验证插件的副本。对于使用该插件进行身份验证的连接,源服务器不会发送公钥,除非被请求或在客户端指定。如果指定了 SOURCE_PUBLIC_KEY_PATH
并指定了有效的公钥文件,则它将优先于GET_SOURCE_PUBLIC_KEY
。如果您使用的是使用插件进行身份验证的复制用户帐户(默认情况下),并且您没有使用安全连接,则必须指定该选项或 SOURCE_PUBLIC_KEY_PATH
选项,以提供RSA公钥给副本。 -
停止复制通道在复制元数据存储库中持久化文件名和文件位置。
GTID_ONLY
默认情况下对异步复制通道禁用,但对组复制通道启用,默认情况下无法禁用。对于具有该设置的复制通道,在内存中仍然跟踪文件位置,并且可以通过错误消息和接口(如
SHOW REPLICA STATUS
语句)观察文件位置(如果它们过时,将显示为无效)。然而,在不需要持久化文件位置的情况下,避免了写入和读取操作,包括事务队列和应用程序过程。该选项只能在复制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
)使副本忽略来自指定服务器的事件。该选项采用逗号分隔的服务器 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_mode
是ON
,那么带有非空IGNORE_SERVER_IDS
列表的CHANGE REPLICATION SOURCE TO
将被拒绝并出现错误。同样,如果任何现有的复制通道是在带有要忽略的服务器 ID 列表的情况下创建的,那么SET gtid_mode=ON
也将被拒绝。在开始基于 GTID 的复制之前,请检查并清除涉及的服务器上的忽略服务器 ID 列表;您可以通过检查SHOW REPLICA STATUS
的输出来实现此操作。在这种情况下,您可以通过发出带有空服务器 ID 列表的CHANGE REPLICATION SOURCE TO
来清除列表,如前所示。 -
用于复制源服务器的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_FILE
、RELAY_LOG_POS
或这两个选项的CHANGE REPLICATION SOURCE TO
语句可以在复制 SQL(应用程序)线程停止时在运行的副本上执行。relay 日志将被保留,如果至少有一个复制应用程序线程和复制 I/O(接收器)线程正在运行。如果两个线程都停止了,除非指定了RELAY_LOG_FILE
或RELAY_LOG_POS
中的至少一个,否则所有 relay 日志文件将被删除。对于 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
值为每个事务的默认值和默认行为。 -
生成
: 导致副本生成不可见的主键对于任何InnoDB
表,该表在复制时缺少主键。请参阅第 15.1.20.11 节,“生成的不可见主键”,以获取更多信息。生成
不兼容于组复制;您可以使用ON
、OFF
或STREAM
。
基于源或副本表中生成的不可见主键的差异由 MySQL 复制支持,只要源支持 GIPKs 并且副本使用 MySQL 8.0.32 或更高版本。如果您在使用早期版本的 MySQL 的副本上使用 GIPKs,除了副本上的额外 GIPK 之外,其他 schema 差异可能不受支持并可能导致复制错误。
对于多源复制,设置
REQUIRE_TABLE_PRIMARY_KEY_CHECK
为ON
或OFF
允许副本在不同的复制通道上标准化行为,并保持一致的sql_require_primary_key
设置。使用ON
防止在多个源更新同一组表时意外丢失主键。使用OFF
允许可以操作主键的源与不能操作主键的源一起工作。在多个副本的情况下,当
REQUIRE_TABLE_PRIMARY_KEY_CHECK
设置为生成
时,由某个副本添加的生成的不可见主键独立于其他副本添加的任何这样的键。这意味着,如果使用生成的不可见主键,different 副本上的生成主键列中的值不保证相同。这可能在故障转移到这样的副本时出现问题。当
PRIVILEGE_CHECKS_USER
为NULL
(默认值)时,用户帐户不需要管理级别权限来设置受限的会话变量。将此选项设置为其他值意味着,当REQUIRE_TABLE_PRIMARY_KEY_CHECK
为ON
、OFF
或生成
时,用户帐户不需要会话管理级别权限来设置受限的会话变量,如sql_require_primary_key
,避免了授予帐户这样的权限。有关更多信息,请参阅第 19.3.3 节,“复制权限检查”。 -
-
使用自动定位功能连接到源,而不是使用二进制日志文件位置。这项选项用于使用GTID基于的复制启动副本。默认值为0,表示不使用GTID自动定位和GTID基于的复制。这项选项只能与
CHANGE REPLICATION SOURCE TO
一起使用,前提是复制SQL(应用程序)线程和复制I/O(接收器)线程都已停止。副本和源都必须启用GTID(
GTID_MODE=ON
、ON_PERMISSIVE,
或OFF_PERMISSIVE
在副本上,和GTID_MODE=ON
在源上)。不能与SOURCE_AUTO_POSITION = 1
同时指定SOURCE_LOG_FILE
、SOURCE_LOG_POS
、RELAY_LOG_FILE
和RELAY_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
。可用的算法是
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 节,“二进制日志事务压缩”。 -
指定副本在连接到源超时后重新连接的间隔时间,以秒为单位。默认间隔为 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_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
,这使得副本在 10 秒间隔内重试连接 3 次。 -
当您设置
SOURCE_CONNECTION_AUTO_FAILOVER = 1
时,复制元数据存储库必须包含用于连接到所有源列表服务器的复制用户帐户凭据。该帐户还必须具有SELECT
权限在性能模式表上。这些凭据可以使用CHANGE REPLICATION SOURCE TO
语句的SOURCE_USER
和SOURCE_PASSWORD
选项来设置。有关更多信息,请参阅 第 19.4.9 节,“使用异步连接故障转移切换源和副本”。 -
当您设置
SOURCE_CONNECTION_AUTO_FAILOVER = 1
时,对于副本的异步连接故障转移将自动激活,如果该复制通道位于单一主模式下的组复制主服务器上。启用该功能后,如果主服务器离线或进入错误状态,新的主服务器将在选举后在同一通道上启动复制。如果您想使用该功能,该复制通道还必须在所有次要服务器和任何新加入的成员上设置。(如果服务器使用 MySQL 的克隆功能进行 provision,这一切都会自动发生。)如果您不想使用该功能,可以使用group_replication_disable_member_action()
函数禁用组复制成员操作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
Performance Schema 表中。系统变量
replica_net_timeout
指定了从站等待来自源的更多数据或心跳信号的秒数,否则从站将认为连接断开,中止读取并尝试重新连接。默认值为 60 秒(一分钟)。请注意,更改replica_net_timeout
的值或默认设置不会自动更改心跳间隔,无论是显式设置还是使用之前计算的默认值。如果将全局值replica_net_timeout
设置为小于当前心跳间隔的值,将发出警告。如果更改replica_net_timeout
,您必须也发出CHANGE REPLICATION SOURCE TO
语句,以调整心跳间隔到适当的值,以便心跳信号在连接超时之前发生。如果不这样做,心跳信号将无效,如果从站没有从源接收到数据,将重复尝试重新连接,创建僵尸转储线程。 -
复制源服务器的主机名或 IP 地址。从站使用该主机名或 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_POS =
源日志位置
二进制日志文件名和位置,复制I/O(receiver)线程从源服务器的二进制日志文件中开始读取的位置,下一次线程启动时。指定这些选项,如果您使用基于二进制日志文件位置的复制。
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(applier)线程比复制I/O(receiver)线程晚。 -
用于连接到复制源服务器的复制用户帐户的密码。字符串值的最大长度为32个字符。如果您指定
SOURCE_PASSWORD
,则SOURCE_USER
也需要。在
CHANGE REPLICATION SOURCE TO
语句中使用的复制用户帐户密码的长度限制为32个字符。尝试使用超过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
,SOURCE_PUBLIC_KEY_PATH
只能在 MySQL 使用 OpenSSL 构建时使用。)如果您使用身份验证插件caching_sha2_password
(默认)进行身份验证,并且不使用安全连接,则必须指定此选项或GET_SOURCE_PUBLIC_KEY=1
选项,以提供 RSA 公钥给副本。 -
设置副本在连接到源超时后尝试重新连接的最大次数,该超时由
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_RETRY
和SOURCE_RETRY_COUNT
记录在源元数据存储库中,并在replication_connection_configuration
性能模式表中显示。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为了防止复杂的中间人攻击,对于复制连接非常重要的是验证服务器的身份。你可以指定其他
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_
选项执行与xxx
--ssl-
和xxx
--tls-
客户端选项相同的功能,详见命令选项用于加密连接。这两个选项集之间的对应关系,以及使用xxx
SOURCE_SSL_
和xxx
SOURCE_TLS_
选项设置安全连接的详细信息,见第 19.3.1 节,“设置复制使用加密连接”。xxx
-
复制用户账户的用户名,用于连接到复制源服务器。字符串值的最大长度为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 节,“跳过事务”。