15.4.2.4 启动副本语句
START REPLICA [thread_types] [until_option] [connection_options] [channel_option]
thread_types:
[thread_type [, thread_type] ... ]
thread_type:
IO_THREAD | SQL_THREAD
until_option:
UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
| SOURCE_LOG_FILE = 'log_name', SOURCE_LOG_POS = log_pos
| RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
| SQL_AFTER_MTS_GAPS }
connection_options:
[USER='user_name'] [PASSWORD='user_pass'] [DEFAULT_AUTH='plugin_name'] [PLUGIN_DIR='plugin_dir']
channel_option:
FOR CHANNEL channel
gtid_set:
uuid_set [, uuid_set] ...
| ''
uuid_set:
uuid:interval[:interval]...
uuid:
hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
h:
[0-9,A-F]
interval:
n[-n]
(n >= 1)
START REPLICA
启动复制线程,或者单独启动。
START REPLICA
需要REPLICATION_SLAVE_ADMIN
特权(或弃用的SUPER
特权)。START REPLICA
会隐式提交当前事务。见第15.3.3节,“隐式提交语句”。
对于线程类型选项,您可以指定IO_THREAD
、SQL_THREAD
,或这两个选项中的任何一个,也可以不指定任何选项。只有启动的线程受到语句的影响。
-
START REPLICA
没有线程类型选项启动所有复制线程,而START REPLICA
有两个线程类型选项启动所有线程。 -
IO_THREAD
启动复制接收线程,该线程从源服务器读取事件并将其存储在中继日志中。 -
SQL_THREAD
启动复制应用线程,该线程从中继日志读取事件并执行它们。多线程副本(具有replica_parallel_workers
> 0)使用协调线程和多个应用线程应用事务,并且SQL_THREAD
启动所有这些线程。
START REPLICA
发送一个确认给用户,所有复制线程都启动后。但是,复制接收线程可能还没有成功连接到源服务器,或者应用线程可能在启动后立即停止。START REPLICA
不会继续监控线程,因此不会警告您如果它们随后停止或无法连接。您必须检查副本的错误日志,以获取复制线程生成的错误消息,或者使用SHOW REPLICA STATUS
检查它们是否运行正常。成功的START REPLICA
语句会使SHOW REPLICA STATUS
显示Replica_SQL_Running=Yes
,但可能不会显示Replica_IO_Running=Yes
,因为Replica_IO_Running=Yes
只有在接收线程同时运行且连接时才显示。更多信息,请见第19.1.7.1节,“检查副本状态”。
可选的FOR CHANNEL
子句允许您指定语句应用于哪个复制通道。提供channel
FOR CHANNEL
子句将channel
START REPLICA
语句应用于特定的复制通道。如果没有指定子句且没有额外通道存在,语句将应用于默认通道。如果START REPLICA
语句在使用多个通道时没有定义通道,这个语句将为所有通道启动指定的线程。请参阅第19.2.2节,“复制通道”获取更多信息。
Group Replication (group_replication_applier
和 group_replication_recovery
) 的复制通道由服务器实例自动管理。START REPLICA
不能与group_replication_recovery
通道一起使用,并且在Group Replication不运行时只能使用group_replication_applier
通道。group_replication_applier
通道只有一个applier线程,没有receiver线程,因此可以使用SQL_THREAD
选项而不使用IO_THREAD
选项来启动该通道。
START REPLICA
支持可插拔用户密码身份验证(请参阅第8.2.17节,“可插拔身份验证”),使用USER
、PASSWORD
、DEFAULT_AUTH
和PLUGIN_DIR
选项,以下列表中描述。使用这些选项时,您必须启动receiver线程(IO_THREAD
选项)或所有复制线程;不能单独启动复制applier线程(SQL_THREAD
选项)。
-
USER
-
帐户的用户名。必须在使用
PASSWORD
时设置该选项。该选项不能设置为空或null字符串。 -
PASSWORD
-
指定帐户的密码。
-
DEFAULT_AUTH
-
身份验证插件的名称。默认为MySQL原生身份验证。
-
PLUGIN_DIR
-
身份验证插件的位置。
使用START REPLICA
设置的密码在MySQL Server的日志、性能Schema表和SHOW PROCESSLIST
语句中被mask时。然而,在发送到副本服务器实例的连接时,它将以明文形式发送。为了保护密码在传输过程中,请使用SSL/TLS加密、SSH隧道或其他保护连接免受未经授权的查看的方法,以连接副本服务器实例和客户端之间的连接。
《UNTIL》子句使得复制副本开始复制,然后处理到您在《UNTIL》子句中指定的点,然后停止。《UNTIL》子句可以用来使复制副本直到您想要跳过的交易前,然后跳过该交易,如第19.1.7.3节,“跳过交易”中所述。要标识交易,您可以使用mysqlbinlog与源服务器的二进制日志或副本服务器的中继日志,或者使用SHOW BINLOG EVENTS
语句。
您还可以使用《UNTIL》子句来调试复制,处理交易一个一个或分批。如果您使用《UNTIL》子句来这样做,请在启动副本服务器时使用--skip-replica-start
来防止SQL线程在副本服务器启动时运行。删除该选项或系统变量设置,以免在意外服务器重启时遗忘。
《SHOW REPLICA STATUS》语句包括输出字段,显示《UNTIL》条件的当前值。《UNTIL》条件将持续到影响线程仍在运行时,并在它们停止时被删除。
《UNTIL》子句操作复制应用线程(SQL_THREAD
选项)。您可以使用SQL_THREAD
选项或让副本默认启动两个线程。如果您使用IO_THREAD
选项单独使用,UNTIL
子句将被忽略,因为应用线程没有启动。
您在《UNTIL》子句中指定的点可以是以下任意一个(且仅一个)选项:
-
SOURCE_LOG_FILE
andSOURCE_LOG_POS
-
这些选项使复制应用线程处理到其中继日志中的某个位置,该位置在源服务器的二进制日志中对应的点上。应用线程找到或在指定位置的最近的交易边界,完成应用交易,然后停止。对于压缩的交易负载,指定压缩的
Transaction_payload_event
。这些选项仍然可以在
CHANGE REPLICATION SOURCE TO
语句中设置了GTID_ONLY
选项时使用,以停止复制通道从持久化文件名和文件位置到复制元数据存储库中。文件名和文件位置在内存中跟踪。 -
RELAY_LOG_FILE
andRELAY_LOG_POS
-
这些选项使复制应用程序进程在复制副本的中继日志中指定的位置处停止。应用程序线程找到最近的事务边界或更晚的位置,完成事务应用,并停止在该位置。对于压缩的事务负载,指定压缩的
Transaction_payload_event
的末尾位置。这些选项仍然可以在
CHANGE REPLICATION SOURCE TO
语句中设置了GTID_ONLY
选项时使用,以停止复制通道从持久化文件名和文件位置在复制元数据存储库中。文件名和文件位置在内存中跟踪。 -
SQL_BEFORE_GTIDS
-
这个选项使复制应用程序从指定的GTID集开始处理事务,并在遇到任何事务时停止该事务和该事务集中的其他事务。该选项接受一个包含一个或多个全局事务标识符的GTID集作为参数(见GTID Sets)。GTID集中的事务不一定按照其GTID顺序出现在复制流中,因此应用程序停止的事务不一定是最早的。
-
SQL_AFTER_GTIDS
-
这个选项使复制应用程序从指定的GTID集开始处理事务,并在处理完所有事务后停止。该选项接受一个包含一个或多个全局事务标识符的GTID集作为参数(见GTID Sets)。
使用
SQL_AFTER_GTIDS
,复制线程在处理完所有事务在GTID集中的事务后停止。事务按接收顺序处理,因此可能包括不在GTID集中的事务,但是在处理这些事务之前已经提交了。例如,执行START REPLICA UNTIL SQL_AFTER_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56
将使副本从源中获取并处理所有事务,直到所有事务的序列号为11-56的所有事务都被处理完,然后停止不再处理任何事务。在MySQL 8.4中,这个选项可以与
replica_parallel_workers > 1
一起使用,而不再会导致副本退回到单线程模式。 -
SQL_AFTER_MTS_GAPS
-
对于多线程副本(
replica_parallel_workers
> 0),这个选项使副本处理事务直到没有更多的gap在relay日志中的事务顺序中。当使用多线程副本时,在以下情况下可能会出现gap:-
协调线程被停止。
-
在应用程序线程中出现错误。
-
mysqld 意外关闭。
当复制通道出现空隙时,副本的数据库可能从源数据库中从未存在过。副本内部跟踪空隙,并禁止执行将删除空隙信息的语句,如
CHANGE REPLICATION SOURCE TO
语句。所有副本默认都是多线程的。当副本上设置了
replica_preserve_commit_order=ON
(默认值),那么空隙一般不会出现,除非在描述中列出的特定情况。如果设置了replica_preserve_commit_order
为OFF
,那么事务的提交顺序将不被保留,这使得空隙出现的可能性大大增加。如果GTIDs不在使用,并且需要将失败的多线程副本更改为单线程模式,可以按照以下顺序执行以下一系列语句:
START REPLICA UNTIL SQL_AFTER_MTS_GAPS; SET @@GLOBAL.replica_parallel_workers = 0; START REPLICA SQL_THREAD;
-