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)
START SLAVE没有 thread_type选项,将启动两个从属线程。I / O线程从主服务器读取事件,并将其存储在中继日志中。SQL线程从中继日志中读取事件并执行它们。 START SLAVE需要 REPLICATION_SLAVE_ADMIN或 SUPER特权。
如果START SLAVE成功启动从属线程,它将返回而没有任何错误。但是,即使在这种情况下,也可能是从属线程启动,然后又停止了(例如,因为它们无法管理连接到主线程或读取其二进制日志或其他问题)。START SLAVE不会对此警告您。您必须检查从属服务器的错误日志中是否有从属线程生成的错误消息,或者使用来检查它们是否令人满意地运行SHOW SLAVE STATUS。
START SLAVE导致隐式提交正在进行的事务。请参见第13.3.3节“导致隐式提交的声明”。
gtid_next必须AUTOMATIC在发布此语句之前设置为 。
可选的子句使您可以命名该语句应用于哪个复制通道。提供子句可将该语句应用于 特定的复制通道。如果未命名任何子句且不存在其他通道,则该语句将应用于默认通道。如果 在使用多个通道时没有定义通道的语句,则该语句将启动所有通道的指定线程。该语句不适用于该通道。有关更多信息,请参见第17.2.3节“复制通道”。 FOR CHANNEL channelFOR CHANNEL channelSTART SLAVESTART SLAVEgroup_replication_recovery
您可以在语句中添加IO_THREAD和 SQL_THREAD选项以命名要启动的线程。请注意,“组复制”应用程序通道(group_replication_applier)没有I / O线程,只有SQL线程。 启动此通道时指定 IO_THREAD或SQL_THREAD选项没有任何好处。
MySQL支持可插拔的用户密码认证 START SLAVE与USER, PASSWORD,DEFAULT_AUTH和 PLUGIN_DIR选项,如下面的列表中所述:
USER: 用户名。不能设置为空字符串或空字符串,或者PASSWORD使用设置为未设置 。
PASSWORD:密码。
DEFAULT_AUTH:插件名称;默认为MySQL本机认证。
PLUGIN_DIR:插件位置。
你不能使用SQL_THREAD指定的任何选项时USER, PASSWORD,DEFAULT_AUTH,或者 PLUGIN_DIR,除非 IO_THREAD还提供了选项。
有关更多信息,请参见第6.2.17节“可插入身份验证”。
如果将不安全的连接与这些选项一起使用,则服务器会发出警告,以纯文本格式发送不带SSL / TLS的密码非常不安全。
START SLAVE ... UNTIL支持两个用于全局事务标识符(GTID)的附加选项(请参见 第17.1.3节“使用全局事务标识符进行复制”)。这些中的每一个都采用一组一个或多个全局事务标识符 gtid_set作为参数(有关更多信息,请参见 GTID Sets)。
如果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_THREAD和IO_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线程获取的最后一个事务。
当使用带有slave_preserve_commit_order=0set 的多线程从属服务器时,在以下情况下,从中继日志执行的事务序列中可能会有间隙:
杀死协调线程
在应用程序线程中发生错误后
mysqld意外关闭
使用该START SLAVE UNTIL SQL_AFTER_MTS_GAPS语句使多线程从属的工作线程仅运行,直到在中继日志中找不到更多间隙为止,然后停止。该语句可以SQL_THREAD选择,但是语句的效果保持不变。它对从属I / O线程无效(并且不能与该IO_THREAD选件一起使用 )。
发出START SLAVE从中继日志执行的事务的序列中具有间隙的多线程从生成警告。在这种情况下,解决方案是使用 START SLAVE UNTIL SQL_AFTER_MTS_GAPS,然后发出 RESET SLAVE以删除所有剩余的中继日志。有关 更多信息,请参见 第17.5.1.33节“复制和事务不一致”。
要将发生故障的多线程从属设备更改为单线程模式,可以按所示顺序发出以下一系列语句:
START SLAVE UNTIL SQL_AFTER_MTS_GAPS;
SET @@GLOBAL.slave_parallel_workers = 0;
START SLAVE SQL_THREAD;
注意
可以在输出中查看正在运行的START SLAVE ...语句的整个文本 ,包括使用的任何 值USER或PASSWORD使用的值SHOW PROCESSLIST。对于正在运行的CHANGE MASTER TO 语句的文本也是如此,包括它用于MASTER_USER或的 任何值 MASTER_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.7.34节“ SHOW SLAVE STATUS语句”和 第17.1.7.1节“检查复制状态”。
可以添加 一个UNTIL子句(until_option,在前面的语法中),以指定从属服务器应启动并运行,直到SQL线程到达主二进制日志中的给定点(由MASTER_LOG_POS 和MASTER_LOG_FILE选项指定)或从属继电器中的给定点为止日志,以RELAY_LOG_POS和 RELAY_LOG_FILE选项表示。对于压缩的交易有效负载,位置必须基于压缩的Transaction_payload_event。当SQL线程达到指定点时,它将停止。如果SQL_THREAD在语句中指定了该 选项,则它仅启动SQL线程。否则,它将启动两个从属线程。如果SQL线程正在运行,则 UNTIL子句将被忽略,并发出警告。您不能UNTIL在IO_THREAD选项中使用子句。
如本节前面START SLAVE UNTIL所述,使用选项SQL_BEFORE_GTIDS或 指定相对于给定GTID或一组GTID的停止点 也是可能的SQL_AFTER_GTIDS。当使用其中的一个选项,您可以指定 SQL_THREAD,IO_THREAD,这两个,或者两者都不是的。如果仅指定 SQL_THREAD,则该语句仅影响从SQL线程;否则,仅影响从SQL线程。如果仅IO_THREAD 使用,则仅影响从属I / O。如果同时使用 SQL_THREAD和IO_THREAD ,或者都不使用,则该语句会影响SQL和I / O线程。
对于UNTIL子句,必须指定以下任意一项:
这两种日志文件名,并在文件中的位置
无论是中 SQL_BEFORE_GTIDS或 SQL_AFTER_GTIDS
SQL_AFTER_MTS_GAPS
请勿混用主日志和中继日志选项。请勿将日志文件选项与GTID选项混合使用。
UNTIL多线程从站不支持 该子句,除非也使用 SQL_AFTER_MTS_GAPS。如果UNTIL在不带的多线程从属服务器上使用 SQL_AFTER_MTS_GAPS,则从属服务器将以单线程(顺序)模式运行以进行复制,直到UNTIL到达该子句指定的点为止 。
任何UNTIL条件都可以通过后续STOP SLAVE语句,START SLAVE不包含任何UNTIL子句的 语句或服务器重新启动来重置 。
指定日志文件和位置时,即使只有SQL线程受此语句影响,也可以使用该 IO_THREAD选项START SLAVE ... UNTIL。IO_THREAD在这种情况下,该选项将被忽略。当使用其中一个GTID选项(SQL_BEFORE_GTIDS和 SQL_AFTER_GTIDS)时,上述限制不适用;GTID选项同时支持SQL_THREAD和 IO_THREAD,如本节前面所述。
该UNTIL子句可用于调试复制,或使复制继续进行,直到要避免从属复制事件之前。例如,如果DROP TABLE在主服务器上执行了一个不明智的语句,则 可以使用该UNTIL命令告诉从服务器执行到此为止,但不能执行得更远。要查找事件是什么,请将mysqlbinlog与主二进制日志或从属中继日志一起使用,或使用一条 SHOW BINLOG EVENTS语句。
如果您UNTIL习惯于在各个部分中使从属进程复制查询,则建议您使用 --skip-slave-start选项启动从属服务器,以防止在从属服务器启动时运行SQL线程。最好在选项文件中而不是在命令行中使用此选项,以免服务器意外重启不会导致该选项被遗忘。
该SHOW SLAVE STATUS语句包括显示UNTIL条件的当前值的输出字段 。
在非常旧的MySQL版本(4.0.5之前)中,此语句称为SLAVE START。该语法现在会产生错误。