MySQL5.7用于控制副本服务器的 SQL 语句

  官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.4.2 SQL Statements for Controlling Replica Servers

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

MySQL 5.7 参考手册  /  ...  /  CHANGE MASTER TO 语句
13.4.2.1 将 MASTER 更改为语句
CHANGE MASTER TO option [, option] ... [ channel_option ]

option: {
    MASTER_BIND = 'interface_name'
  | MASTER_HOST = 'host_name'
  | MASTER_USER = 'user_name'
  | MASTER_PASSWORD = 'password'
  | MASTER_PORT = port_num
  | MASTER_CONNECT_RETRY = interval
  | MASTER_RETRY_COUNT = count
  | MASTER_DELAY = interval
  | MASTER_HEARTBEAT_PERIOD = interval
  | MASTER_LOG_FILE = 'source_log_name'
  | MASTER_LOG_POS = source_log_pos
  | MASTER_AUTO_POSITION = {0|1}
  | RELAY_LOG_FILE = 'relay_log_name'
  | RELAY_LOG_POS = relay_log_pos
  | MASTER_SSL = {0|1}
  | MASTER_SSL_CA = 'ca_file_name'
  | MASTER_SSL_CAPATH = 'ca_directory_name'
  | MASTER_SSL_CERT = 'cert_file_name'
  | MASTER_SSL_CRL = 'crl_file_name'
  | MASTER_SSL_CRLPATH = 'crl_directory_name'
  | MASTER_SSL_KEY = 'key_file_name'
  | MASTER_SSL_CIPHER = 'cipher_list'
  | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
  | MASTER_TLS_VERSION = 'protocol_list'
  | IGNORE_SERVER_IDS = (server_id_list)
}

channel_option:
    FOR CHANNEL channel

server_id_list:
    [server_id [, server_id] ... ]

CHANGE MASTER TO更改副本用于连接到复制源服务器、读取源的二进制日志以及读取副本的中继日志的参数。它还更新复制元数据存储库的内容(请参见 第 16.2.4 节“中继日志和复制元数据存储库”)。CHANGE MASTER TO需要 SUPER特权。

STOP SLAVE在 MySQL 5.7.4 之前,必须在发出此语句之前 停止复制线程(如有必要)。在 MySQL 5.7.4 及更高版本中,您可以CHANGE MASTER TO在运行的副本上发出语句,而无需执行此操作,具体取决于复制 SQL 线程和复制 I/O 线程的状态。本节稍后提供管理此类使用的规则。

当使用多线程副本(换句话说 slave_parallel_workers大于 0)时,停止副本可能会导致 从中继日志执行的事务序列中出现“间隙”,无论副本是有意停止还是其他原因。当存在这种差距时,发行就会CHANGE MASTER TO 失败。在这种情况下的解决方案是发出 START SLAVE UNTIL SQL_AFTER_MTS_GAPS确保弥补差距的问题。

可选子句使您能够指定该语句适用于哪个复制通道。提供子句将语句应用于 特定的复制通道,并用于添加新通道或修改现有通道。例如,要添加一个名为channel2的新通道: FOR CHANNEL channelFOR CHANNEL channelCHANGE MASTER TO

CHANGE MASTER TO MASTER_HOST=host1, MASTER_PORT=3002 FOR CHANNEL 'channel2'

如果未指定子句且不存在额外通道,则该语句适用于默认通道。

使用多个复制通道时,如果CHANGE MASTER TO语句未使用子句命名通道 ,则会发生错误。有关更多信息 ,请参见第 16.2.2 节 “复制通道” 。FOR CHANNEL channel

未指定的选项保留其值,除非以下讨论中指出。因此,在大多数情况下,无需指定不更改的选项。例如,如果连接到复制源服务器的密码已更改,请发出以下语句以告知副本新密码:

CHANGE MASTER TO MASTER_PASSWORD='new3cret';

MASTER_HOSTMASTER_USER、 MASTER_PASSWORD、 并向 MASTER_PORT副本提供有关如何连接到其复制源服务器的信息:

  • MASTER_HOST和 MASTER_PORT是主控主机的主机名(或 IP 地址)及其 TCP/IP 端口。

    笔记

    复制不能使用 Unix 套接字文件。您必须能够使用 TCP/IP 连接到复制源服务器。

    如果指定MASTER_HOST或 MASTER_PORT选项,副本将假定源与之前不同(即使选项值与其当前值相同。)在这种情况下,将考虑源二进制日志文件名和位置的旧值不再适用,因此如果您不在声明中 指定MASTER_LOG_FILEand ,则 and 会默默地附加到它后面。 MASTER_LOG_POSMASTER_LOG_FILE=''MASTER_LOG_POS=4

    设置MASTER_HOST=''(即将其值显式设置为空字符串)与 根本设置不同 。MASTER_HOST从 MySQL 5.5 开始,尝试设置MASTER_HOST为空字符串会失败并出现错误。以前,设置 MASTER_HOST为空字符串会导致 START SLAVE随后失败。(错误#28796)

    检查 用于的值MASTER_HOST和其他 选项的换行符(或);这些值中存在此类字符会导致语句失败并显示 。(错误#11758581,错误#50801) CHANGE MASTER TO\n0x0AER_MASTER_INFO

  • MASTER_USER和 MASTER_PASSWORD是用于连接到源的帐户的用户名和密码。如果您指定MASTER_PASSWORD, MASTER_USER也是必需的。语句中用于复制用户帐户的密码 CHANGE MASTER TO长度限制为 32 个字符;在 MySQL 5.7.5 之前,如果密码较长,语句会成功,但任何多余的字符都会被静默截断。在 MySQL 5.7.5 及更高版本中,尝试使用超过 32 个字符的密码会导致CHANGE MASTER TO失败。(错误#11752299,错误#43439)

    可以通过指定 来设置空用户名 MASTER_USER='',但不能使用空用户名启动复制通道。MASTER_USER仅当您出于安全目的需要从副本存储库中清除以前使用的凭据时,才 设置空用户名,并且之后不要尝试使用该通道。

    正在运行的语句的文本CHANGE MASTER TO(包括 MASTER_USER和 的 值MASTER_PASSWORD)可以在并发语句的输出中看到SHOW PROCESSLIST。(声明的完整文本 START SLAVE也可见SHOW PROCESSLIST。)

设置MASTER_SSL=1复制连接,然后不设置其他 选项对应于 客户端的设置,如 加密连接的命令选项中所述。使用 时 ,仅当可以建立加密连接时,连接尝试才会成功。复制连接不会回退到未加密的连接,因此没有与 复制设置相对应的设置。如果设置,则对应于 。 MASTER_SSL_xxx--ssl-mode=REQUIREDMASTER_SSL=1--ssl-mode=PREFERREDMASTER_SSL=0--ssl-mode=DISABLED

重要的

为了帮助防止复杂的中间人攻击,副本验证服务器的身份非常重要。您可以指定 与 设置相对应的附加选项 MASTER_SSL_xxx--ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY,这是比默认设置更好的选择,有助于防止此类攻击。通过这些设置,副本会检查服务器的证书是否有效,并检查副本所使用的主机名是否与服务器证书中的标识相匹配。要实现这些级别的验证之一,您必须首先确保服务器的 CA 证书可供副本可靠地使用,否则将导致可用性问题。因此,它们不是默认设置。

选项 和选项指定副本如何使用加密和密码来保护复制连接。即使在不支持 SSL 的情况下编译的副本上,也可以更改这些选项。它们会保存到源元数据存储库,但如果副本未启用 SSL 支持,则会被忽略。和 选项执行的功能与 加密连接的命令选项中描述的 和 客户端选项 相同。两组选项的对应关系以及 和的使用MASTER_SSL_xxxMASTER_TLS_VERSIONMASTER_SSL_xxxMASTER_TLS_VERSION--ssl-xxx--tls-versionMASTER_SSL_xxxMASTER_TLS_VERSION设置安全连接的选项,在 第 16.3.8 节 “设置复制以使用加密连接”中进行了解释。

、和 选项控制副本如何识别与源的连接已丢失MASTER_HEARTBEAT_PERIOD并 尝试重新连接。 MASTER_CONNECT_RETRYMASTER_RETRY_COUNT

  • 该slave_net_timeout 系统变量指定在副本认为连接已断开、中止读取并尝试重新连接之前,副本等待来自源的更多数据或心跳信号的秒数。默认值为 60 秒(一分钟)。在 MySQL 5.7.7 之前,默认值为 3600 秒(一小时)。

  • 心跳间隔是由该选项控制的,它可以在连接仍然良好的情况下停止在没有数据的情况下发生连接超时 MASTER_HEARTBEAT_PERIOD。在该秒数后,将向副本发送心跳信号,并且只要源的二进制日志随事件更新,等待时间就会重置。因此,仅当二进制日志文件中没有未发送事件的时间长于此时间时,源才会发送心跳。心跳间隔interval 是一个十进制值,范围为0到4294967秒,分辨率为毫秒;最小的非零值为 0.001。环境interval设为 0 会完全禁用心跳。心跳间隔默认为系统变量值的一半 slave_net_timeout。它记录在源元数据存储库中并显示在 replication_connection_configuration 性能架构表中。

  • 在 MySQL 5.7.4 之前,不包括 MASTER_HEARTBEAT_PERIOD导致 CHANGE MASTER TO将心跳间隔重置为默认值( slave_net_timeout系统变量值的一半)和 Slave_received_heartbeats 0。除了 之外,现在不会重置心跳间隔 RESET SLAVE。(错误#18185490)

  • 请注意,更改 的值或默认设置 slave_net_timeout不会自动更改心跳间隔,无论是已明确设置还是使用先前计算的默认值。@@GLOBAL.slave_net_timeout如果您设置的值小于当前心跳间隔的值,则会发出警告 。如果 slave_net_timeout发生更改,您还必须发出CHANGE MASTER TO将心跳间隔调整为合适的值,使心跳信号在连接超时之前发生。如果不这样做,心跳信号将不起作用,并且如果没有从源接收到数据,副本可能会重复尝试重新连接,从而创建僵尸转储线程。

  • 如果副本确实需要重新连接,则第一次重试会在超时后立即发生。 MASTER_CONNECT_RETRY指定重新连接尝试的时间间隔,并 MASTER_RETRY_COUNT限制重新连接尝试的次数。如果使用这两种默认设置,副本将在两次重新连接尝试之间等待 60 秒 ( MASTER_CONNECT_RETRY=60),并在 60 天内继续尝试以此速率重新连接 ( MASTER_RETRY_COUNT=86400)。设置为 0MASTER_RETRY_COUNT意味着对重新连接尝试的次数没有限制,因此副本会无限期地不断尝试重新连接。这些值记录在源元数据存储库中并显示在 replication_connection_configuration 性能架构表。 MASTER_RETRY_COUNT取代 --master-retry-count服务器启动选项。

MASTER_DELAY指定副本必须落后于源多少秒。interval从源接收到的事件直到在源上执行后至少几秒后才会执行 。默认值为 0。如果 不是 0 到 2 31interval -1范围内的非负整数,则会发生错误。有关更多信息,请参见第 16.3.10 节 “延迟复制”。

从 MySQL 5.7 开始,当复制 SQL 线程停止时,可以在正在运行的副本上执行使用 CHANGE MASTER TO该选项的语句。MASTER_DELAY

MASTER_BIND用于具有多个网络接口的副本,并确定选择副本的哪个网络接口来连接到源。

使用此选项配置的地址(如果有)可以在Master_Bind输出的列 中看到SHOW SLAVE STATUS。如果您使用源元数据存储库(服务器以 开头)的表 master_info_repository=TABLE,则该值也可以视为表Master_bind 的列mysql.slave_master_info

NDB Cluster 还支持将副本绑定到特定网络接口的功能。

MASTER_LOG_FILE和 MASTER_LOG_POS是复制 I/O 线程下次启动时应开始从源读取的坐标。 RELAY_LOG_FILE和 RELAY_LOG_POS是复制 SQL 线程下次启动时应开始从中继日志读取的坐标。如果您指定了这些选项中的任何一个,则无法指定MASTER_AUTO_POSITION = 1(本节稍后将介绍)。如果两者均未 MASTER_LOG_FILE指定 MASTER_LOG_POS,则副本将使用之前复制 SQL 线程的最后一个坐标CHANGE MASTER TO发出。这可以确保复制不会中断,即使复制 SQL 线程比复制 I/O 线程晚,当您只想更改(例如要使用的密码)时也是如此。

从 MySQL 5.7 开始,当复制 SQL 线程停止时,可以在正在运行的副本上执行CHANGE MASTER TO使用RELAY_LOG_FILE、 或这两个选项的语句。RELAY_LOG_POS在 MySQL 5.7.4 之前,CHANGE MASTER TO删除所有中继日志文件并启动新的中继日志文件,除非您指定RELAY_LOG_FILE或 RELAY_LOG_POS。在这种情况下,中继日志文件将被保留;全局relay_log_purge 变量静默设置为 0。在 MySQL 5.7.4 及更高版本中,如果复制 SQL 线程和复制 I/O 线程中至少之一正在运行,则会保留中继日志。如果两个线程都停止,则所有中继日志文件都将被删除,除非至少有以下之一RELAY_LOG_FILE: RELAY_LOG_POS已指定。对于组复制应用程序通道 ( group_replication_applier),它只有一个 SQL 线程而没有 I/O 线程,如果 SQL 线程停止,就会出现这种情况,但对于该通道,您不能使用 和 RELAY_LOG_FILE选项 RELAY_LOG_POS

RELAY_LOG_FILE可以使用绝对路径或相对路径,并使用与 相同的基本名称 MASTER_LOG_FILE。(错误#12190)

MASTER_AUTO_POSITION = 1与 一起使用 CHANGE MASTER TO时,副本尝试使用基于 GTID 的复制的自动定位功能(而不是基于二进制日志文件的位置)连接到源。CHANGE MASTER TO从 MySQL 5.7 开始,仅当复制 SQL 线程和复制 I/O 线程都停止时才能使用此选项 。副本和源都必须启用 GTID(GTID_MODE=ON, ON_PERMISSIVE,或 OFF_PERMISSIVE在副本和 GTID_MODE=ON源上)。 MASTER_LOG_FILE、 MASTER_LOG_POS、 RELAY_LOG_FILE、 和 RELAY_LOG_POS不能与 一起指定MASTER_AUTO_POSITION = 1。如果副本上启用了多源复制,则需要设置MASTER_AUTO_POSITION = 1每个适用的复制通道的选项。

通过MASTER_AUTO_POSITION = 1设置,在初始连接握手中,副本会发送一个 GTID 集,其中包含它已接收、提交或两者的事务。源通过发送其二进制日志中记录的所有事务进行响应,这些事务的 GTID 不包含在副本发送的 GTID 集中。此交换确保源仅发送具有副本尚未记录或提交的 GTID 的事务。如果副本从多个源接收事务(如钻石拓扑的情况),自动跳过功能可确保事务不会应用两次。有关如何计算副本发送的 GTID 集的详细信息,请参阅 第 16.1.3.3 节 “GTID 自动定位”。

如果源应发送的任何事务已从源的二进制日志中清除,或gtid_purged 通过其他方法添加到系统变量中的 GTID 集中,则源会将错误发送 ER_MASTER_HAS_PURGED_REQUIRED_GTIDS 到副本,并且复制不会启动。此外,如果在事务交换期间发现副本已记录或提交了 GTID 中源 UUID 的事务,但源本身尚未提交这些事务,则源会将错误发送到 ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER 副本,并且复制不会启动。有关如何处理这些情况的信息,请参阅 第 16.1.3.3 节“GTID 自动定位”。

IGNORE_SERVER_IDS采用 0 个或多个服务器 ID 的逗号分隔列表。源自相应服务器的事件将被忽略,但日志轮转和删除事件除外,这些事件仍记录在中继日志中。

在循环复制中,原始服务器通常充当其自身事件的终结者,因此它们不会被多次应用。因此,当删除循环中的一台服务器时,此选项在循环复制中非常有用。假设您有一个包含 4 台服务器的循环复制设置,服务器 ID 为 1、2、3 和 4,并且服务器 3 发生故障。通过启动从服务器 2 到服务器 4 的复制来弥补差距时,您可以在服务器 4 上发出的语句中包含IGNORE_SERVER_IDS = (3)该CHANGE MASTER TO语句,以告诉它使用服务器 2 而不是服务器 3 作为源。这样做会导致它忽略而不是传播源自不再使用的服务器的任何语句。

如果CHANGE MASTER TO发出的语句没有任何IGNORE_SERVER_IDS 选项,则保留任何现有列表。要清除被忽略的服务器列表,需要使用带有空列表的选项:

CHANGE MASTER TO IGNORE_SERVER_IDS = ();

MySQL 5.7.5 之前, RESET SLAVE ALL对服务器 ID 列表没有影响。在 MySQL 5.7.5 及更高版本中,RESET SLAVE ALL清除 IGNORE_SERVER_IDS. (错误#18816897)

如果IGNORE_SERVER_IDS包含服务器自己的 ID 并且服务器是在 --replicate-same-server-id启用该选项的情况下启动的,则会产生错误。

源元数据存储库和 的输出 SHOW SLAVE STATUS提供当前被忽略的服务器列表。有关更多信息,请参阅第 16.2.4.2 节“复制元数据存储库”和 第 13.7.5.34 节“SHOW SLAVE STATUS 语句”。

调用会导致、 、 和 CHANGE MASTER TO的先前值以及执行前有关副本状态的其他信息写入错误日志。 MASTER_HOSTMASTER_PORTMASTER_LOG_FILEMASTER_LOG_POS

CHANGE MASTER TO导致正在进行的事务的隐式提交。请参见第 13.3.3 节“导致隐式提交的语句”。

在 MySQL 5.7.4 及更高版本中,删除了在发出任何语句 STOP SLAVE之前 (以及之后) 执行的严格要求 。的行为不取决于副本是否停止,而是取决于(在 MySQL 5.7.4 及更高版本中)复制 SQL 线程和复制 I/O 线程的状态;现在停止或运行这些线程中的哪一个决定了在给定时间点可以或不能与语句一起使用的选项。做出此决定的规则如下: CHANGE MASTER TOSTART SLAVECHANGE MASTER TOCHANGE MASTER TO

  • 如果 SQL 线程停止,您可以 使用、 和 选项CHANGE MASTER TO允许的任意组合 执行,即使复制 I/O 线程正在运行也是如此。当 I/O 线程运行时,此语句不能使用其他选项。 RELAY_LOG_FILERELAY_LOG_POSMASTER_DELAY

  • 如果 I/O 线程停止,您可以 CHANGE MASTER TO使用此语句的任何选项(以任何允许的组合) 执行,除了 RELAY_LOG_FILE、 RELAY_LOG_POS、 MASTER_DELAY, MASTER_AUTO_POSITION = 1甚至当 SQL 线程正在运行时。

  • CHANGE MASTER TO 在发出使用 的语句 之前,必须停止 SQL 线程和 I/O 线程MASTER_AUTO_POSITION = 1

您可以使用 检查复制 SQL 线程和复制 I/O 线程的当前状态SHOW SLAVE STATUS。请注意,组复制应用程序通道 ( group_replication_applier) 没有 I/O 线程,只有 SQL 线程。

有关更多信息,请参阅 第 16.3.7 节 “故障转移期间切换源”。

CHANGE MASTER TO 如果您使用基于语句的复制和临时表,则语句后面的语句 可能会STOP SLAVE在副本上留下临时表。ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO从 MySQL 5.7 开始,每当发生这种情况时都会发出警告 ( )。在这种情况下,您可以通过在执行此类语句之前确保 Slave_open_temp_tables系统状态变量的值等于 0 来 避免这种情况CHANGE MASTER TO

CHANGE MASTER TO当您拥有复制源服务器的快照并记录了与快照时间相对应的源二进制日志坐标时,这对于设置副本非常有用。将快照加载到副本以将其与源同步后,您可以在副本上运行以指定副本应开始读取源二进制日志的坐标。 CHANGE MASTER TO MASTER_LOG_FILE='log_name', MASTER_LOG_POS=log_pos

以下示例更改副本使用的复制源服务器,并建立副本开始读取的源二进制日志坐标。当您想要设置副本来复制源时,可以使用此选项:

CHANGE MASTER TO
  MASTER_HOST='source2.example.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='source2-bin.001',
  MASTER_LOG_POS=4,
  MASTER_CONNECT_RETRY=10;

下一个示例显示了不太常用的操作。当副本具有中继日志文件且您因某种原因希望其再次执行时使用它。为此,源不需要可达。您只需要使用 CHANGE MASTER TO并启动 SQL 线程 ( START SLAVE SQL_THREAD):

CHANGE MASTER TO
  RELAY_LOG_FILE='replica-relay-bin.006',
  RELAY_LOG_POS=4025;

下表显示了字符串值选项的最大允许长度。

选项 最大长度
MASTER_HOST 60
MASTER_USER 96
MASTER_PASSWORD 32
MASTER_LOG_FILE 511
RELAY_LOG_FILE 511
MASTER_SSL_CA 511
MASTER_SSL_CAPATH 511
MASTER_SSL_CERT 511
MASTER_SSL_CRL 511
MASTER_SSL_CRLPATH 511
MASTER_SSL_KEY 511
MASTER_SSL_CIPHER 511
MASTER_TLS_VERSION 511

 

MySQL 5.7 参考手册  /  ...  /  CHANGE REPLICATION FILTER 语句
13.4.2.2 更改复制过滤器语句
CHANGE REPLICATION FILTER filter[, filter][, ...]

filter: {
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)
}

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_table_name][, ...]
wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db

CHANGE REPLICATION FILTER在副本上设置一个或多个复制过滤规则,其方式与使用复制过滤选项(例如 或 ) 启动副本mysqld相同。使用此语句设置的过滤器与使用服务器选项设置的过滤器在两个关键方面有所不同: --replicate-do-db--replicate-wild-ignore-table

  1. 该语句不需要重新启动服务器即可生效,只需STOP SLAVE SQL_THREAD先停止使用复制SQL线程(然后重新启动 START SLAVE SQL_THREAD)即可。

  2. 该声明的影响不是持久的;CHANGE REPLICATION FILTER重新启动副本 mysqld后,使用的任何过滤器设置都会丢失。

CHANGE REPLICATION FILTER 需要SUPER特权。

笔记

无法在配置为组复制的 MySQL 服务器实例上设置复制过滤器,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。

以下列表显示了这些选项以及它们与服务器选项 CHANGE REPLICATION FILTER的关系 :--replicate-*

  • REPLICATE_DO_DB:包括基于数据库名称的更新。相当于 --replicate-do-db。

  • REPLICATE_IGNORE_DB:根据数据库名称排除更新。相当于 --replicate-ignore-db。

  • REPLICATE_DO_TABLE:包括基于表名的更新。相当于 --replicate-do-table。

  • REPLICATE_IGNORE_TABLE:根据表名排除更新。相当于 --replicate-ignore-table。

  • REPLICATE_WILD_DO_TABLE:包括基于通配符模式匹配表名称的更新。相当于 --replicate-wild-do-table。

  • REPLICATE_WILD_IGNORE_TABLE:排除基于通配符模式匹配表名的更新。相当于 --replicate-wild-ignore-table。

  • REPLICATE_REWRITE_DB:将副本上的新名称替换为源上的指定数据库后,对副本执行更新。相当于 --replicate-rewrite-db。

REPLICATE_DO_DB和 过滤器 的精确效果REPLICATE_IGNORE_DB取决于基于语句的复制还是基于行的复制有效。有关更多信息,请参阅第 16.2.5 节“服务器如何评估复制过滤规则”。

可以通过用逗号分隔规则来在单个语句中创建多个复制过滤规则 CHANGE REPLICATION FILTER,如下所示:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);

发出刚才显示的语句相当于使用 options 启动副本mysqld。 --replicate-do-db=d1 --replicate-ignore-db=d2

如果多次指定相同的过滤规则,则仅 实际使用最后一个过滤规则。例如,此处显示的两个语句具有完全相同的效果,因为REPLICATE_DO_DB 第一个语句中的第一个规则被忽略:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3,db4);
警告

此行为与 --replicate-*筛选选项的行为不同,多次指定同一选项会导致创建多个筛选规则。

不包含任何特殊字符的表和数据库的名称不需要加引号。REPLICATION_WILD_TABLE与一起 使用的值 REPLICATION_WILD_IGNORE_TABLE是字符串表达式,可能包含(特殊)通配符,因此必须用引号引起来。以下示例语句显示了这一点:

CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('db1.old%');

CHANGE REPLICATION FILTER
    REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');

与一起 使用的值REPLICATE_REWRITE_DB 表示数据库名称对;每个这样的值都必须括在括号中。以下语句将 源 数据库上发生的语句重写为副本数据库上的语句: db1db2

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

刚刚显示的语句包含两组括号,一组括着一对数据库名称,另一组括着整个列表。这在以下示例中可能更容易看出,该示例创建了两条 rewrite-db规则,一条将数据库重写 dbAdbB,一条将数据库重写dbC为 dbD

CHANGE REPLICATION FILTER
  REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));

该语句使任何现有的复制过滤规则保持不变;要取消设置给定类型的所有过滤器,请将过滤器的值设置为显式空列表,如此例所示,这将删除所有现有的 REPLICATE_DO_DB和 REPLICATE_IGNORE_DB规则:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

以这种方式将过滤器设置为空会删除所有现有规则,不会创建任何新规则,并且不会使用--replicate-* 命令行或配置文件中的选项恢复 mysqld 启动时设置的任何规则。

REPLICATE_WILD_DO_TABLE 与一起 使用的值REPLICATE_WILD_IGNORE_TABLE必须采用以下格式 。在 MySQL 5.7.5 之前,这并没有严格执行,尽管在这些选项中使用不合格的值可能会导致错误的结果(Bug #18095449)。 db_name.tbl_name

有关更多信息,请参见第 16.2.5 节 “服务器如何评估复制过滤规则”。

MySQL 5.7 参考手册  /  ...  /  RESET SLAVE 语句
13.4.2.3 RESET SLAVE 语句
RESET SLAVE [ALL] [channel_option]

channel_option:
    FOR CHANNEL channel

RESET SLAVE使副本忘记其在源二进制日志中的复制位置。该语句旨在用于干净启动:它清除复制元数据存储库,删除所有中继日志文件,并启动新的中继日志文件。MASTER_DELAY它还会将选项指定的复制延迟重置为 0 CHANGE MASTER TO

笔记

所有中继日志文件都将被删除,即使它们尚未被复制 SQL 线程完全执行。STOP SLAVE(如果您已发出语句或副本负载较高,则 副本上可能存在这种情况 。)

对于正在使用 GTID 的服务器(gtid_modeis ON),发出RESET SLAVE对 GTID 执行历史记录没有影响。gtid_executed该语句不会更改或 gtid_purged或 表的值 mysql.gtid_executed。如果需要重置 GTID 执行历史记录,请使用RESET MASTER,即使启用 GTID 的服务器是禁用二进制日志记录的副本。

RESET SLAVE需要 RELOAD特权。

要使用RESET SLAVE,必须停止复制线程,因此 STOP SLAVE在发出 之前 在运行的副本上使用RESET SLAVE。要在组复制组成员上使用 RESET SLAVE,成员状态必须为 OFFLINE,这意味着插件已加载,但该成员当前不属于任何组。可以通过语句使群组成员下线STOP GROUP REPLICATION。

可选子句使您能够指定该语句适用于哪个复制通道。提供子句将该 语句应用于特定的复制通道。将子句与 选项组合可删除指定的通道。如果未指定通道且不存在额外通道,则该语句适用于默认通道。当存在多个复制通道时 发出 不带子句的语句会删除所有复制通道并仅重新创建默认通道。 有关更多信息 ,请参见第 16.2.2 节 “复制通道” 。FOR CHANNEL channelFOR CHANNEL channelRESET SLAVEFOR CHANNEL channelALLRESET SLAVE ALLFOR CHANNEL channel

RESET SLAVE不会更改任何复制连接参数,例如源的主机名和端口,或者复制用户帐户名及其密码。

  • 从 MySQL 5.7.24 开始,当 master_info_repository=TABLE 在服务器上设置 时,复制连接参数将作为操作的一部分 保留在崩溃安全InnoDB表 中。它们也被保留在记忆中。如果在发出之后 但在发出之前服务器意外退出或故意重新启动,将从表中检索复制连接参数并将其重新用于新连接。 mysql.slave_master_infoRESET SLAVERESET SLAVESTART SLAVE

  • 当 master_info_repository=FILE 在服务器上设置(这是MySQL 5.7中的默认值)时,复制连接参数仅保留在内存中。如果由于服务器意外退出或故意重启而导致副本mysqld在发出后立即重新启动 RESET SLAVE,则连接参数会丢失。在这种情况下,您必须 CHANGE MASTER TO在服务器启动后发出一条语句,重新指定连接参数,然后再发出START SLAVE。

如果您想有意重置连接参数,则需要使用 RESET SLAVE ALL,它会清除连接参数。在这种情况下,您必须CHANGE MASTER TO在服务器启动后发出一条语句来指定新的连接参数。

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

如果复制 SQL 线程在停止并 RESET SLAVE发出时正在复制临时表,则这些复制的临时表将在副本上删除。

在 MySQL 5.7.5 之前,还具有重置心跳周期 ( ) 和 RESET SLAVE的效果。此问题在 MySQL 5.7.5 及更高版本中已修复。(错误#18777899、错误#18778485) Slave_heartbeat_periodSSL_VERIFY_SERVER_CERT

MySQL 5.7.5之前,RESET SLAVE ALL没有清除 .setIGNORE_SERVER_IDS设置的列表 CHANGE MASTER TO。在 MySQL 5.7.5 及更高版本中,该语句会清除列表。(错误#18816897)

笔记

在 NDB Cluster 副本 SQL 节点上使用时,RESET SLAVE清除 mysql.ndb_apply_status表。在使用此语句时应记住,该语句 ndb_apply_status使用 NDB存储引擎,因此由附加到副本集群的所有 SQL 节点共享。

您可以通过在执行之前 发出来覆盖此行为 ,这可以防止副本 在这种情况下清除表。 SET GLOBAL @@ndb_clear_apply_status=OFFRESET SLAVEndb_apply_status

MySQL 5.7 参考手册  /  ...  /  SET GLOBAL sql_slave_skip_counter 语法
13.4.2.4 SET GLOBAL sql_slave_skip_counter 语法
SET GLOBAL sql_slave_skip_counter = N

N 该语句跳过主设备的下 一个事件。这对于从语句引起的复制停止中恢复非常有用。

该语句仅在从属线程未运行时有效。否则,会产生错误。

使用此语句时,重要的是要了解二进制日志实际上是组织为称为事件组的组序列。每个事件组由一系列事件组成。

  • 对于事务表,一个事件组对应一个事务。

  • 对于非事务表,事件组对应于单个 SQL 语句。

笔记

单个事务可以包含对事务性表和非事务性表的更改。

当您使用SET GLOBAL sql_slave_skip_counter跳过事件并且结果位于组的中间时,从属设备将继续跳过事件,直到到达组的末尾。然后从下一个事件组开始执行。

MySQL 5.7 参考手册  /  ...  /  START SLAVE 语句
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)

START SLAVE一起或单独启动复制线程。该声明需要 SUPER特权。START SLAVE导致正在进行的事务的隐式提交(请参见第 13.3.3 节,“导致隐式提交的语句”)。

对于螺纹类型选项,您可以指定 IO_THREADSQL_THREAD、两者都指定,或都不指定。只有启动的线程才会受到该语句的影响。

  • START SLAVE如果没有线程类型选项,则会启动所有复制线程,同时 START SLAVE使用两个线程类型选项也会启动所有复制线程。

  • IO_THREAD启动复制接收器线程,该线程从源服务器读取事件并将它们存储在中继日志中。

  • SQL_THREAD启动复制应用程序线程,该线程从中继日志中读取事件并执行它们。多线程副本( slave_parallel_workers> 0)使用协调器线程和多个应用程序线程应用事务,并SQL_THREAD启动所有这些线程。

重要的

START SLAVE所有复制线程启动后向用户发送确认。但是,复制接收器线程可能尚未成功连接到源,或者应用程序线程在启动后立即应用事件时可能会停止。START SLAVE线程启动后不会继续监视线程,因此如果线程随后停止或无法连接,它不会向您发出警告。您必须检查副本的错误日志中是否有复制线程生成的错误消息,或者检查它们是否与 SHOW SLAVE STATUS. 成功的 START SLAVE语句会导致 SHOW SLAVE STATUS显示 Slave_SQL_Running=Yes,但它可能会也可能不会显示Slave_IO_Running=Yes,因为Slave_IO_Running=Yes仅当接收器线程正在运行且已连接时才显示。有关更多信息,请参阅 第 16.1.7.1 节 “检查复制状态”。

可选子句使您能够指定该语句适用于哪个复制通道。提供子句将该 语句应用于特定的复制通道。如果未指定子句且不存在额外通道,则该语句适用于默认通道。使用多个通道时,如果 语句没有定义通道,则该语句为所有通道启动指定线程。有关更多信息 ,请参见 第 16.2.2 节 “复制通道” 。FOR CHANNEL channelFOR CHANNEL channelSTART SLAVESTART SLAVE

group_replication_applier组复制(和 ) 的复制通道group_replication_recovery由服务器实例自动管理。您可以与之交互的唯一组复制通道是 group_replication_applier通道。该通道只有applier线程,没有receiver线程,因此可以使用SQL_THREAD 不带IO_THREAD选项的选项来启动。 START SLAVE根本不能与通道一起使用 group_replication_recovery

START SLAVE支持使用、和 选项进行可插入用户密码身份验证(请参见第 6.2.13 节 “可插入身份验证”) ,如下列表中所述。使用这些选项时,必须启动接收线程(选项)或所有复制线程;您不能单独启动复制应用程序线程(选项)。 USERPASSWORDDEFAULT_AUTHPLUGIN_DIRIO_THREADSQL_THREAD

USER

帐户的用户名。PASSWORD如果使用则必须设置此项 。该选项不能设置为空或空字符串。

PASSWORD

指定用户帐户的密码。

DEFAULT_AUTH

身份验证插件的名称。默认是 MySQL 本机身份验证。

PLUGIN_DIR

身份验证插件的位置。

重要的

您设置的密码START SLAVE 在写入 MySQL 服务器的日志、性能模式表和SHOW PROCESSLIST语句时会被屏蔽。但是,它通过连接以纯文本形式发送到副本服务器实例。要保护传输中的密码,请对副本服务器实例与您用来发出 的客户端之间的连接使用 SSL/TLS 加密、SSH 隧道或其他保护连接免遭未经授权查看的方法 START SLAVE

UNTIL子句使副本开始复制,然后处理事务直到您在UNTIL子句中指定的点,然后再次停止。该UNTIL子句可用于使副本继续进行,直到您想要跳过不需要的事务的点之前,然后跳过该事务,如第 16.1.7.3 节 “跳过事务”中所述。要识别事务,可以将mysqlbinlog与源的二进制日志或副本的中继日志一起使用,或者使用 SHOW BINLOG EVENTS语句。

您还可以使用该UNTIL子句通过一次处理一个事务或分段处理事务来调试复制。如果您使用UNTIL 该子句来执行此操作,请使用选项启动副本 --skip-slave-start以防止在副本服务器启动时运行 SQL 线程。该过程完成后删除该选项,以便在服务器意外重启时不会忘记该选项。

该SHOW SLAVE STATUS语句包括显示条件当前值的输出字段 UNTILUNTIL 只要受影响的线程仍在运行, 该情况就会持续,并在线程停止时被删除。

UNTIL子句在复制应用程序线程(SQL_THREAD选项)上运行。您可以使用该SQL_THREAD选项或让副本默认启动两个线程。如果单独使用该 IO_THREAD选项,该 UNTIL子句将被忽略,因为应用程序线程未启动。

您在子句中指定的点UNTIL 可以是以下选项中的任何一个(且只能是一个):

SOURCE_LOG_FILE和 SOURCE_LOG_POS

这些选项使复制应用程序将事务处理到其中继日志中的某个位置,该位置由源服务器上二进制日志中相应点的文件名和文件位置标识。应用程序线程在指定位置或指定位置之后找到最近的事务边界,完成应用事务,并在那里停止。

RELAY_LOG_FILE和 RELAY_LOG_POS

这些选项使复制应用程序将事务处理到副本中继日志中的某个位置,该位置由中继日志文件名和该文件中的位置标识。应用程序线程在指定位置或指定位置之后找到最近的事务边界,完成应用事务,并在那里停止。

SQL_BEFORE_GTIDS

此选项使复制应用程序开始处理事务,并在遇到指定 GTID 集中的任何事务时停止。不应用 GTID 集中遇到的事务,也不应用 GTID 集中的任何其他事务。该选项采用包含一个或多个全局事务标识符的 GTID 集作为参数(请参阅 GTID 集)。GTID集中的事务不一定按照其GTID的顺序出现在复制流中,因此应用程序停止之前的事务不一定是最早的。

SQL_AFTER_GTIDS

此选项使复制应用程序开始处理事务,并在处理完指定 GTID 集中的所有事务后停止。该选项采用包含一个或多个全局事务标识符的 GTID 集作为参数(请参阅 GTID 集)。

使用 时SQL_AFTER_GTIDS,复制线程在处理完 GTID 集中的所有事务后停止。事务按照接收到的顺序进行处理,因此这些事务可能不属于 GTID 集,但在提交该集中的所有事务之前接收(并处理)这些事务。例如,执行 START SLAVE UNTIL SQL_AFTER_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56 会导致副本从源获取(并处理)所有事务,直到处理完具有序列号 11 到 56 的所有事务,然后在到达该点后停止而不处理任何其他事务。

SQL_AFTER_GTIDS与多线程从站不兼容。如果此选项与多线程从属设备一起使用,则会发出警告,并且从属设备切换到单线程模式。根据使用情况,可以使用START SLAVE UNTIL MASTER_LOG_POSSTART SLAVE UNTIL SQL_BEFORE_GTIDS来代替。您还可以使用 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(),它会等待直到到达正确的位置,但不会停止从属线程。

SQL_AFTER_MTS_GAPS

仅对于多线程副本( slave_parallel_workers> 0),此选项使副本处理事务直到从中继日志执行的事务序列中不再有间隙。使用多线程副本时,在以下情况下可能会出现间隙:

  • 协调器线程已停止。

  • 应用程序线程中发生错误。

  • mysqld意外关闭。

当复制通道存在间隙时,副本的数据库将处于源上可能从未存在过的状态。副本在内部跟踪间隙,并不允许CHANGE MASTER TO 执行会删除间隙信息的语句。

START SLAVE在从中继日志执行的事务序列中存在间隙的多线程副本上发出会生成警告 。要纠正这种情况,解决方案是使用START SLAVE UNTIL SQL_AFTER_MTS_GAPS. 有关更多信息,请参阅 第 16.4.1.32 节“复制和事务不一致” 。

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

START SLAVE UNTIL SQL_AFTER_MTS_GAPS;
SET @@GLOBAL.slave_parallel_workers = 0;
START SLAVE SQL_THREAD;
MySQL 5.7 参考手册  /  ...  /  STOP SLAVE 语句
13.4.2.6 停止从属语句
STOP SLAVE [thread_types] [channel_option]

thread_types:
    [thread_type [, thread_type] ... ]

thread_type: IO_THREAD | SQL_THREAD

channel_option:
    FOR CHANNEL channel

停止复制线程。STOP SLAVE需要 SUPER特权。STOP SLAVE建议的最佳实践是在停止副本服务器之前在副本上 执行(有关更多信息,请参阅第 5.1.16 节 “服务器关闭过程”)。

使用基于行的日志记录格式时:如果要复制任何使用非事务性存储引擎的表,则应在关闭副本服务器之前在副本上 STOP SLAVE或 (请参阅本节后面的注释)。 STOP SLAVE SQL_THREAD

与 一样,该语句可以与和 选项START SLAVE一起使用来命名要停止的一个或多个线程。请注意,组复制应用程序通道 ( ) 没有复制 I/O 线程,只有复制 SQL 线程。因此,使用该 选项可以完全停止该通道。 IO_THREADSQL_THREADgroup_replication_applierSQL_THREAD

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

gtid_nextAUTOMATIC必须在发出此语句之前 设置为 。

STOP SLAVE您可以通过设置 系统变量来 控制超时之前等待的时间rpl_stop_slave_timeout。这可用于避免 STOP SLAVE使用与副本的不同客户端连接的其他 SQL 语句之间的死锁。当达到超时值时,发出请求的客户端返回错误消息并停止等待,但STOP SLAVE 指令仍然有效。一旦复制线程不再繁忙,STOP SLAVE就会执行该语句并且副本会停止。

CHANGE MASTER TO副本运行时允许使用 某些语句,具体取决于复制 SQL 线程和复制 I/O 线程的状态。但是,在这种情况下,仍然支持STOP SLAVE在执行之前 使用。有关更多信息, CHANGE MASTER TO请参阅第 13.4.2.1 节“CHANGE MASTER TO 语句”和 第 16.3.7 节“故障转移期间切换源” 。

可选子句使您能够指定该语句适用于哪个复制通道。提供子句将该 语句应用于特定的复制通道。如果未指定通道且不存在额外通道,则该语句适用于默认通道。如果在使用多个通道时语句未命名通道,则该语句将停止所有通道的指定线程。该语句不能与通道一起使用 。有关更多信息 ,请参见第 16.2.2 节 “复制通道” 。FOR CHANNEL channelFOR CHANNEL channelSTOP SLAVESTOP SLAVEgroup_replication_recovery

使用基于语句的复制时:在源打开临时表时更改源可能不安全。这是不建议基于语句的临时表复制的原因之一。Slave_open_temp_tables您可以通过检查;的值来了解副本上是否有临时表。 当使用基于语句的复制时,执行前该值应为 0CHANGE MASTER TO。如果副本上打开了任何临时表,则CHANGE MASTER TO在发出一条语句后发出一条语句STOP SLAVE会导致 ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO 警告。

使用多线程副本(slave_parallel_workers是非零值)时,从中继日志执行的事务序列中的任何间隙都会作为停止工作线程的一部分而被关闭。如果在执行语句时副本意外停止(例如,由于工作线程中的错误或另一个线程发出KILL) STOP SLAVE,中继日志中执行的事务的顺序可能会变得不一致。有关更多信息,请参阅 第 16.4.1.32 节“复制和事务不一致”。

如果当前复制事件组已修改一个或多个非事务表,则 STOP SLAVE 将等待最多 60 秒以等待事件组完成,除非您 为复制 SQL 线程发出KILL QUERYor 语句。KILL CONNECTION如果超时后事件组仍然不完整,则会记录一条错误消息。

你可能感兴趣的:(服务器,运维,mysql,数据库)