您的位置:首页 > 数据库 > MySQL

MySQL的SQL语句 -复制语句(7)- 控制副本服务器的 SQL 语句 - RESET SLAV

2020-12-03 21:24 941 查看

RESET SLAVE | REPLICA 语句

1. RESET {SLAVE | REPLICA} [ALL] [channel_option]
2.
3. channel_option:
4.     FOR CHANNEL channel
5.

该语句使副本忘记其在源的二进制日志中的位置。从 MySQL 8.0.22 开始,RESET SLAVE 被弃用,应该使用它的别名 RESET REPLICA。在 MySQL 8.0.22 之前的版本中使用 RESET SLAVE。语句的工作方式与以前相同,只是用于语句及其输出的术语发生了更改。两个版本的语句在使用时更新相同的状态变量。

START REPLICA | SLAVE 语句

1. START {REPLICA | SLAVE} [thread_types] [until_option] [connection_options] [channel_option]
2.
3. thread_types:
4.     [thread_type [, thread_type] ... ]
5.
6. thread_type:
7.     IO_THREAD | SQL_THREAD
8.
9. until_option:
10.     UNTIL {   {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
11.           |   MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
12.           |   RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
13.           |   SQL_AFTER_MTS_GAPS  }
14.
15. connection_options:
16.     [USER='user_name'] [PASSWORD='user_pass'] [DEFAULT_AUTH='plugin_name'] [PLUGIN_DIR='plugin_dir']
17.
18.
19. channel_option:
20.     FOR CHANNEL channel
21.
22. gtid_set:
23.     uuid_set [, uuid_set] ...
24.     | ''
25.
26. uuid_set:
27.     uuid:interval[:interval]...
28.
29. uuid:
30.     hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
31.
32. h:
33.     [0-9,A-F]
34.
35. interval:
36.     n[-n]
37.
38.     (n >= 1)

START REPLICA | SLAVE 启动一个或全部两个复制线程。从 MySQL 8.0.22 开始,使用 START REPLICA 代替 START SLAVE,后者在该版本中已被弃用。在 MySQL 8.0.22 之前的版本使用 START SLAVE。

START REPLICA | SLAVE 如果不带 thread_type 选项,则启动两个复制线程。复制 I/O 线程从源服务器读取事件并将其存储在中继日志中。复制 SQL 线程从中继日志中读取事件并执行它们。START REPLICA | SLAVE 需要 REPLICATION_SLAVE_ADMIN 权限(或不推荐使用的 SUPER 权限)。

如果 START REPLICA | SLAVE 成功地启动了复制线程,它不会返回任何错误。但是,这种情况也可能是复制线程启动,然后停止(例如,因为它们无法连接到源或读取其二进制日志,或其他问题)。START REPLICA | SLAVE 不会对此发出警告。必须检查复制副本的错误日志中,才能获取复制线程生成的错误消息,或者使用 SHOW REPLICA | SLAVE STATUS 检查它们是否正常运行。

START REPLICA | SLAVE 会引起正在进行的事务隐式提交。

在执行此语句之前,gtid_next 必须设置为 AUTOMATIC。

能够使用可选的 FOR CHANNEL channel 子句命名该语句应用于哪个复制通道。提供 FOR CHANNEL channel 子句将 START REPLICA | SLAVE 语句应用于特定的复制通道。如果没有命名子句并且不存在额外的通道,则该语句将应用于默认通道。如果 START REPLICA | SLAVE 语句在使用多个通道时没有定义通道,则此语句将为所有通道启动指定的线程。不允许对 group_replication_recovery 通道使用此语句。

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

START REPLICA | SLAVE 支持使用 USER、PASSWORD、DEFAULT_AUTH 和 PLUGIN_DIR 选项进行可插拔的用户密码验证,如下列所述:

● USER:用户名。不能设置为空字符串或 null,如果使用密码,则不设置。(?)

● PASSWORD:密码。

● DEFAULT_AUTH:插件的名称,默认为 MySQL 本地认证。

● PLUGIN_DIR:插件的位置。

指定 USER、PASSWORD、DEFAULT_AUTH 或 PLUGIN_DIR 时,不能单独使用 SQL_THREAD 选项,除非还提供了 IO_THREAD 选项。

如果这些选项使用了不安全的连接,服务器将发出警告:Sending passwords in plain text without SSL/TLS is extremely insecure。

START REPLICA | SLAVE ... UNTIL 支持两个额外的选项来与全局事务标识符(GTID)一起使用。其中每个都以一组(一个或多个)全局事务标识符 gtid_set 作为参数。

当没有指定 thread_type 时,START REPLICA | SLAVE UNTIL SQL_BEFORE_GTIDS 会引起复制 SQL 线程处理事务,直到它到达 gtid_set 中列出的第一个事务为止。START REPLICA | SLAVE UNTIL SQL_AFTER_GTIDS 会导致复制线程处理所有事务,直到 gtid_set 中的最后一个事务被两个线程处理完。也就是说,START REPLICA | SLAVE UNTIL SQL_BEFORE_GTIDS 导致复制 SQL 线程处理在到达 gtid_set 中的第一个 GTID 之前发生的所有事务,而 START REPLICA | SLAVE UNTIL SQL_AFTER_GTIDS 导致复制线程处理所有事务,包括那些 GTID 在 gtid_set 中的事务,直到它们遇到 GTID 不属于集合的事务。SQL_BEFORE_GTIDS 和 SQL_AFTER_GTIDS 都支持 SQL_THREAD 和 IO_THREAD 选项,尽管目前对它们使用 IO_THREAD 没有效果。

例如,START REPLICA | 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 REPLICA | SLAVE SQL_THREAD UNTIL SQL_AFTER_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56,会导致复制 SQL 线程从源获取刚刚提到的所有事务,包括序列号为11到56的所有事务,然后停止而不处理任何其他事务;也就是说,序列号为56的事务将是复制 SQL 线程获取的最后一个事务。

当使用设置了 slave_preserve_commit_order=0 的多线程副本时,在以下情况下,从中继日志执行的事务序列中可能存在差距:

● 终止协调线程

● 应用线程中发生错误后

● mysqld 意外关闭

使用 START REPLICA | SLAVE UNTIL SQL_AFTER_MTS_GAPS 语句,使多线程副本的工作线程运行到在中继日志中找不到更多的间断,然后停止。此语句可以使用 SQL_THREAD 选项,但语句的效果保持不变。它对复制 I/O 线程没有影响(并且不能与 IO_THREAD 选项一起使用)。

在多线程副本上执行 START REPLICA | SLAVE 时,如果从中继日志执行的事务序列中存在间断,则会生成一个警告。在这种情况下,解决方案是使用 START REPLICA | SLAVE UNTIL SQL_AFTER_MTS_GAPS,然后执行 RESET REPLICA | SLAVE 删除任何剩余的中继日志。

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

1. START {REPLICA | SLAVE} UNTIL SQL_AFTER_MTS_GAPS;
2.
3. SET @@GLOBAL.slave_parallel_workers = 0;
4.
5. START {REPLICA | SLAVE} SQL_THREAD;

注意

可以在 SHOW PROCESSLIST 的输出中查看正在运行的 START REPLICA | SLAVE 语句的整个文本,包括使用的 USER 或 PASSWORD 值。对于正在运行的 CHANGE MASTER TO 语句的文本也是如此,包括它为 MASTER_USER 或 MASTER_PASSWORD 使用的任何值。

START REPLICA | SLAVE 在复制 I/O 线程和复制 SQL 线程启动后向用户发送一个确认。但是,复制 I/O 线程可能尚未连接。因此,REPLICA | SLAVE 如果成功,则 SHOW REPLICA | SLAVE STATUS 显示 Replica_SQL_Running=Yes,但这并不保证 Replica_IO_Running=Yes(因为只有在 I/O 线程正在运行并连接时,Replica_IO_Running=Yes)。

可以添加一个 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 选项一起使用。

对于 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 REPLICA | SLAVE 语句、不包含 UNTIL 子句的 START REPLICA | SLAVE 语句或服务器重新启动所重置。

在指定日志文件和位置时,可以将 IO_THREAD 选项与 START REPLICA | SLAVE ... UNTIL 一起使用,尽管只有 SQL 线程受此语句影响。在这种情况下,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 REPLICA | SLAVE STATUS 语句包含显示 UNTIL 条件当前值的输出字段。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/reset-slave.html
https://dev.mysql.com/doc/refman/8.0/en/start-replica.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: