13.4.2.5 START SLAVE 语句

START SLAVE [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
          |   MASTER_LOG_FILE = 'log_name', MASTER_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)

没有* thread_type *选项的START SLAVE将启动两个复制线程。复制 I/O 线程从源服务器读取事件,并将事件存储在中继日志中。复制 SQL 线程从中继日志中读取事件并执行它们。 START SLAVE需要REPLICATION_SLAVE_ADMINSUPER特权。

如果START SLAVE成功启动复制线程,它将返回而没有任何错误。但是,即使在那种情况下,也可能是复制线程启动了,然后又停止了(例如,因为它们无法 Management 连接到源或读取其二进制日志或其他问题)。 START SLAVE不会对此发出警告。您必须检查副本的错误日志中是否有由复制线程生成的错误消息,或者使用显示从站状态检查它们是否令人满意地运行。

START SLAVE导致正在进行的事务的隐式提交。参见第 13.3.3 节“导致隐式提交的声明”

在发出此语句之前,必须将gtid_next设置为AUTOMATIC

可选的FOR CHANNEL channel子句使您可以命名该语句应用于哪个复制通道。提供FOR CHANNEL channel子句会将START SLAVE语句应用于特定的复制通道。如果未命名任何子句且不存在其他通道,则该语句将应用于默认通道。如果START SLAVE语句在使用多个通道时未定义通道,则该语句启动所有通道的指定线程。 group_replication_recovery通道不允许使用此语句。有关更多信息,请参见第 16.2.3 节“复制通道”

您可以在语句中添加IO_THREADSQL_THREAD选项,以命名要启动的线程。请注意,组复制应用程序通道(group_replication_applier)没有 I/O 线程,只有 SQL 线程。启动此通道时指定IO_THREADSQL_THREAD选项没有任何好处。

START SLAVE支持具有USERPASSWORDDEFAULT_AUTHPLUGIN_DIR选项的可插拔用户密码验证,如下 table 所示:

  • USER:用户名。不能设置为空字符串或空字符串,或者如果使用PASSWORD则不能设置为空。

  • PASSWORD:密码。

  • DEFAULT_AUTH:插件名称;默认为 MySQL 本机认证。

  • PLUGIN_DIR:插件的位置。

指定USERPASSWORDDEFAULT_AUTHPLUGIN_DIR中的任何一个时,不能使用SQL_THREAD选项,除非还提供了IO_THREAD选项。

有关更多信息,请参见第 6.2.13 节“可插入身份验证”

如果将不安全的连接与这些选项一起使用,则服务器会发出警告,以纯文本格式发送不带 SSL/TLS 的密码是非常不安全的。

START SLAVE ... UNTIL支持两个附加选项,可与全局事务标识符(GTID)一起使用(请参阅第 16.1.3 节“使用全局事务标识符进行复制”)。其中的每一个都采用一组一个或多个全局事务标识符* gtid_set *作为参数(有关更多信息,请参见GTID Sets)。

如果未指定* thread_type ,则START SLAVE UNTIL SQL_BEFORE_GTIDS使复制 SQL 线程处理事务,直到到达 GT_ gtid_set 中列出其 GTID 的 first 事务为止。 START SLAVE UNTIL SQL_AFTER_GTIDS导致复制线程处理所有事务,直到两个线程都已处理 gtid_set 中的 last 事务。换句话说,START SLAVE UNTIL SQL_BEFORE_GTIDS使复制 SQL 线程处理到达 gtid_set 中的第一个 GTID 之前发生的所有事务,并且START SLAVE UNTIL SQL_AFTER_GTIDS使复制线程处理所有事务,包括那些在 gtid_set *中找到其 GTID 的事务,直到每个人都遇到了 GTID 不属于该 Transaction 集的 Transaction。 SQL_BEFORE_GTIDSSQL_AFTER_GTIDS每个都支持SQL_THREADIO_THREAD选项,尽管当前与它们一起使用IO_THREAD无效。

例如,START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56使复制 SQL 线程处理所有源于server_uuid3E11FA47-71CA-11E1-9E33-C80AA9429562的源的事务,直到遇到 Sequences 号为 11 的事务为止;否则,然后它停止而不处理该事务。换句话说,处理直至并包括序列号为 10 的事务的所有事务。另一方面,执行START SLAVE SQL_THREAD UNTIL SQL_AFTER_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56将导致复制 SQL 线程从源中获取刚刚提到的所有事务,包括序列号为 11 到 56 的所有事务,然后停止而不处理任何其他事务;也就是说,序列号为 56 的事务将是复制 SQL 线程获取的最后一个事务。

在使用多线程副本时,在以下情况下,从中继日志执行的事务序列中可能会有间隙:

  • 杀死协调线程

  • 工作线程中发生错误后

  • mysqld意外关闭

使用从开始直到 SQL_AFTER_MTS_GAPS语句使多线程副本的工作线程仅运行,直到在中继日志中找不到更多间隙为止,然后停止。该语句可以使用SQL_THREAD选项,但是该语句的效果保持不变。它对复制 I/O 线程没有影响(并且不能与IO_THREAD选项一起使用)。

在多线程副本上发出START SLAVE时,如果从中继日志执行的事务序列中存在间隔,则会发出警告。在这种情况下,解决方案是使用从开始直到 SQL_AFTER_MTS_GAPS,然后发出RESET SLAVE删除所有剩余的中继日志。有关更多信息,请参见第 16.4.1.32 节,“复制和事务不一致”

要将失败的多线程副本更改为单线程模式,可以按所示 Sequences 发出以下一系列语句:

START SLAVE UNTIL SQL_AFTER_MTS_GAPS;

SET @@GLOBAL.slave_parallel_workers = 0;

START SLAVE SQL_THREAD;

Note

可以在SHOW PROCESSLIST的输出中查看正在运行的START SLAVE ...语句的整个文本,包括使用的任何USERPASSWORD值。对于正在运行的更改为主语句的文本也是如此,包括它为MASTER_USERMASTER_PASSWORD使用的任何值。

复制 I/O 线程和复制 SQL 线程均已启动之后,START SLAVE向用户发送确认。但是,复制 I/O 线程可能尚未连接。由于这个原因,成功的_导致显示从站状态显示Slave_SQL_Running=Yes,但这不能保证Slave_IO_Running=Yes(因为Slave_IO_Running=Yes仅在复制 I/O 线程正在运行并且已连接)。有关更多信息,请参见第 13.7.5.34 节“ SHOW SLAVE STATUS 语句”第 16.1.7.1 节“检查复制状态”

可以添加UNTIL子句(* until_option *,在前面的语法中),以指定副本应启动并运行,直到复制 SQL 线程到达源的二进制日志中的给定点(由MASTER_LOG_POS和 MASTER_LOG_FILE 选项指定)为止,或者副本的中继日志中的给定点,用RELAY_LOG_POSRELAY_LOG_FILE选项指示。当 SQL 线程达到指定点时,它将停止。如果在语句中指定了SQL_THREAD选项,则它仅启动 SQL 线程。否则,它将启动两个复制线程。如果 SQL 线程正在运行,则UNTIL子句将被忽略并发出警告。您不能将UNTIL子句与IO_THREAD选项一起使用。

如本节前面所述,使用START SLAVE UNTIL还可以使用选项SQL_BEFORE_GTIDSSQL_AFTER_GTIDS中的一个来指定相对于给定 GTID 或一组 GTID 的停止点。使用这些选项之一时,可以指定SQL_THREADIO_THREAD或两者均指定。如果仅指定SQL_THREAD,则只有复制 SQL 线程受该语句影响;如果仅使用IO_THREAD,则仅影响复制 I/O 线程。如果同时使用SQL_THREADIO_THREAD,或者都不使用SQL_THREADIO_THREAD,则两个复制线程均受该语句影响。

对于UNTIL子句,必须指定以下任意一项:

  • 两个一个日志文件名和该文件中的位置

    • SQL_BEFORE_GTIDSSQL_AFTER_GTIDS中的任意一个
  • SQL_AFTER_MTS_GAPS

不要混用源日志和中继日志选项。请勿将日志文件选项与 GTID 选项混合使用。

多线程副本不支持UNTIL子句,除非也使用SQL_AFTER_MTS_GAPS。如果在没有SQL_AFTER_MTS_GAPS的多线程副本上使用UNTIL,则副本将以单线程(Sequences)模式运行以进行复制,直到达到UNTIL子句指定的点为止。

后续的STOP SLAVE语句,不包含UNTIL子句的START SLAVE语句或服务器重新启动将重置任何UNTIL条件。

指定日志文件和位置时,即使只有复制 SQL 线程受此语句影响,也可以将IO_THREAD选项与START SLAVE ... UNTIL一起使用。在这种情况下,IO_THREAD选项将被忽略。当使用 GTID 选项之一(SQL_BEFORE_GTIDSSQL_AFTER_GTIDS)时,上述限制不适用; GTID 选项支持SQL_THREADIO_THREAD,如本节前面所述。

UNTIL子句可用于调试复制,或使复制 continue 进行,直到要避免副本复制事件之前。例如,如果在源上执行了一个不明智的DROP TABLE语句,则可以使用UNTIL指示副本在该点之前执行,但不能执行得更远。若要查找事件是什么,请将mysqlbinlog与源的二进制日志或副本的中继日志一起使用,或者使用显示 BINLOG 事件语句。

如果使用UNTIL来使副本进程分节复制查询,建议您使用--skip-slave-start选项启动副本,以防止在副本服务器启动时 SQL 线程运行。最好在选项文件中而不是在命令行中使用此选项,以免服务器意外重启不会导致它被遗忘。

显示从站状态语句包括显示UNTIL条件的当前值的输出字段。