Documentation Home

13.4.2.5 START SLAVE 语句

START SLAVE [thread_types] [until_option] [connection_options]

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']


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 SLAVE没有 thread_type选项启动两个复制线程。I/O 线程从复制源服务器读取事件并将它们存储在中继日志中。SQL 线程从中继日志中读取事件并执行它们。 START SLAVE需要 SUPER特权。

如果START SLAVE成功启动复制线程,它会无任何错误地返回。然而,即使在那种情况下,复制线程也可能启动然后停止(例如,因为它们无法连接到源或读取其二进制日志,或其他一些问题)。START SLAVE 不会就此警告您。您必须检查副本的错误日志以了解复制线程生成的错误消息,或者检查它们是否以令人满意的方式运行 SHOW SLAVE STATUS

START SLAVE导致正在进行的事务的隐式提交。请参阅第 13.3.3 节,“导致隐式提交的语句”

从 MySQL 5.6.11 开始, gtid_next必须 AUTOMATIC在发出此语句之前设置为(错误 #16062608)。

START SLAVEUSER支持带有、 和 选项的可插入用户密码验证,PASSWORD如下表所述: DEFAULT_AUTHPLUGIN_DIR

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

  • PASSWORD: 密码。

  • DEFAULT_AUTH:插件名称;默认是 MySQL 本机身份验证。

  • PLUGIN_DIR: 插件位置。

SQL_THREAD在指定 、 、 或 中的任何一个时,您不能使用该选项USERPASSWORD除非DEFAULT_AUTH还 提供PLUGIN_DIR了该 IO_THREAD选项。

有关详细信息,请参阅 第 6.2.11 节,“可插入身份验证”

如果将不安全的连接与任何这些选项一起使用,服务器会发出警告Sending passwords in plain text without SSL/TLS is extremely insecure

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

thread_type指定 no 时,START SLAVE UNTIL SQL_BEFORE_GTIDS导致复制 SQL 线程处理事务,直到它到达第一个事务,其 GTID 在gtid_set. START SLAVE UNTIL SQL_AFTER_GTIDS导致复制线程处理所有事务,直到 中的 last事务 gtid_set已被两个线程处理。换句话说,START SLAVE UNTIL SQL_BEFORE_GTIDS使复制 SQL 线程处理在 gtid_set到达第一个 GTID 之前发生的所有事务, START SLAVE UNTIL SQL_AFTER_GTIDS并使复制线程处理所有事务,包括那些在中找到 GTID 的事务gtid_set,直到每个人都遇到一个 GTID 不属于该集合的事务。SQL_BEFORE_GTIDS并且 SQL_AFTER_GTIDS每个都支持 SQL_THREADIO_THREAD 选项,尽管IO_THREAD与它们一起使用目前没有效果。

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

在 MySQL 5.6.14 之前,SQL_AFTER_GTIDS在指示的事务完成后不会停止副本,而是等到收到另一个 GTID 事件(错误 #14767986)。

使用该START SLAVE UNTIL SQL_AFTER_MTS_GAPS语句使多线程副本的 SQL 线程运行,直到在中继日志中找不到更多间隙,然后停止。该语句可以带一个SQL_THREAD选项,但语句的效果保持不变。它对复制 I/O 线程没有影响(并且不能与该 IO_THREAD选项一起使用)。START SLAVE UNTIL SQL_AFTER_MTS_GAPS在副本在多线程模式下因错误而失败后,应在将副本从多线程模式切换到单线程模式(即, slave_parallel_workers从正的非零值重置回 0 时)之前使用。

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

START SLAVE UNTIL SQL_AFTER_MTS_GAPS;

SET @@GLOBAL.slave_parallel_workers = 0;

START SLAVE SQL_THREAD;

如果您在 relay_log_recovery启用的情况下运行失败的多线程副本,那么您必须START SLAVE UNTIL SQL_AFTER_MTS_GAPS在执行之前 发出CHANGE MASTER TO。否则后一条语句失败。

笔记

START SLAVE ...可以在 的输出中查看正在运行的语句 的整个文本 ,包括使用的任何USERPASSWORDSHOW PROCESSLIST。对于运行语句的文本也是如此,包括它为或 CHANGE MASTER TO 所使用的任何值 。 MASTER_USERMASTER_PASSWORD

START SLAVE在 I/O 线程和 SQL 线程都启动后向用户发送确认。但是,I/O 线程可能尚未连接。出于这个原因,成功 START SLAVE导致 SHOW SLAVE STATUS显示 Slave_SQL_Running=Yes,但这并不能保证Slave_IO_Running=Yes(因为 Slave_IO_Running=Yes只有当 I/O 线程正在运行和连接时)。有关详细信息,请参阅第 13.7.5.35 节,“SHOW SLAVE STATUS 语句”第 17.1.5.1 节,“检查复制状态”

您可以向语句添加IO_THREADSQL_THREAD选项以命名要启动的线程。指定、、 或 中的SQL_THREAD 任何一个时,不允许使用 该选项,除非 还提供了该选项。 USERPASSWORDDEFAULT_AUTHPLUGIN_DIRIO_THREAD

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

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

多线程副本不支持该UNTIL子句,除非同时使用 SQL_AFTER_MTS_GAPS.

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

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

  • _ SQL_BEFORE_GTIDS_ SQL_AFTER_GTIDS

  • SQL_AFTER_MTS_GAPS

不要混用二进制日志和中继日志选项。不要将日志文件选项与 GTID 选项混合使用。

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

指定日志文件和位置时,您可以使用 IO_THREAD选项 withSTART SLAVE ... UNTIL即使只有 SQL 线程受此语句影响。在这种情况下该IO_THREAD选项将被忽略。SQL_BEFORE_GTIDS使用其中一个 GTID 选项(和 )时,上述限制不适用SQL_AFTER_GTIDS;GTID 选项同时支持SQL_THREADIO_THREAD,如本节前面所述。

UNTIL子句可用于调试复制,或使复制继续进行,直到您希望避免副本复制事件的点之前。例如,如果 DROP TABLE在源上执行了一条不明智的语句,您可以使用UNTIL告诉副本执行到该点但不再执行。要查找事件是什么,请将mysqlbinlog与源的二进制日志或副本的中继日志一起使用,或者使用 SHOW BINLOG EVENTS语句。

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

SHOW SLAVE STATUS语句包括显示 UNTIL条件当前值的输出字段。