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)
START SLAVE
没有thread_type
选项,将启动两个从属线程。I / O线程从主服务器读取事件,并将其存储在中继日志中。SQL线程从中继日志中读取事件并执行它们。START SLAVE
需要REPLICATION_SLAVE_ADMIN
或SUPER
特权。
如果START SLAVE
成功启动从属线程,它将返回而没有任何错误。但是,即使在这种情况下,也可能是从属线程启动,然后又停止了(例如,因为它们无法管理连接到主线程或读取其二进制日志或其他问题)。START SLAVE
不会对此警告您。您必须检查从属服务器的错误日志中是否有从属线程生成的错误消息,或者使用来检查它们是否令人满意地运行SHOW SLAVE STATUS
。
START SLAVE
导致隐式提交正在进行的事务。请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。
gtid_next
必须AUTOMATIC
在发布此语句之前设置为。
可选的子句使您可以命名该语句应用于哪个复制通道。提供子句可将该语句应用于特定的复制通道。如果未命名任何子句且不存在其他通道,则该语句将应用于默认通道。如果在使用多个通道时没有定义通道的语句,则该语句将启动所有通道的指定线程。该语句不适用于该通道。有关更多信息,请参见“复制通道”。FOR CHANNEL channel
FOR CHANNEL channel
START SLAVE
START SLAVE
group_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
还提供了选项。
如果将不安全的连接与这些选项一起使用,则服务器会发出警告,以纯文本格式发送不带SSL / TLS的密码非常不安全。
START SLAVE ... UNTIL
支持两个用于全局事务标识符(GTID)的附加选项(请参见“使用全局事务标识符进行复制”)。这些中的每一个都采用一组一个或多个全局事务标识符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=0
set 的多线程从属服务器时,在以下情况下,从中继日志执行的事务序列中可能会有间隙:
- 杀死协调线程
- 在应用程序线程中发生错误后
- 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
以删除所有剩余的中继日志。有关更多信息,请参见“复制和事务不一致”。
要将发生故障的多线程从属设备更改为单线程模式,可以按所示顺序发出以下一系列语句:
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线程正在运行并已连接时)。有关更多信息,请参见“ SHOW SLAVE STATUS语句”和“检查复制状态”。
可以添加一个UNTIL
子句(until_option
,在前面的语法中),以指定从属服务器应启动并运行,直到SQL线程到达主二进制日志中的给定点(由MASTER_LOG_POS
和MASTER_LOG_FILE选项指定)或从属继电器中的给定点为止日志,以RELAY_LOG_POS
和RELAY_LOG_FILE
选项表示。当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
。该语法现在会产生错误。