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
特权。
在 MySQL 5.7.4 之前,复制线程必须停止,STOP SLAVE
必要时在发出此语句之前使用。在 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
channel
FOR CHANNEL
channel
CHANGE 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_HOST
, MASTER_USER
,
MASTER_PASSWORD
,
MASTER_PORT
并向副本提供有关如何连接到其复制源服务器的信息:
MASTER_HOST
是主控主机的MASTER_PORT
主机名(或 IP 地址)及其 TCP/IP 端口。笔记复制不能使用 Unix 套接字文件。您必须能够使用 TCP/IP 连接到复制源服务器。
如果您指定
MASTER_HOST
或MASTER_PORT
选项,则副本假定源与以前不同(即使选项值与其当前值相同。)在这种情况下,源的二进制日志文件名和位置的旧值被认为是不再适用,因此如果您不在声明中 指定MASTER_LOG_FILE
and , 则会默默地附加到它。MASTER_LOG_POS
MASTER_LOG_FILE=''
MASTER_LOG_POS=4
设置
MASTER_HOST=''
(即,将其值显式设置为空字符串) 与根本不设置MASTER_HOST
不同。从 MySQL 5.5 开始,尝试设置MASTER_HOST
为空字符串失败并出现错误。以前,设置MASTER_HOST
为空字符串会导致START SLAVE
随后失败。(漏洞 #28796)检查用于
MASTER_HOST
和其他CHANGE MASTER TO
选项的值是否有换行符(\n
或0x0A
);这些值中存在此类字符会导致语句失败并显示ER_MASTER_INFO
。(缺陷 #11758581,缺陷 #50801)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=REQUIRED
MASTER_SSL=1
--ssl-mode=PREFERRED
MASTER_SSL=0
--ssl-mode=DISABLED
为了帮助防止复杂的中间人攻击,副本验证服务器的身份很重要。您可以指定其他
选项以对应于设置
和
MASTER_SSL_
xxx
--ssl-mode=VERIFY_CA
--ssl-mode=VERIFY_IDENTITY
,这是比默认设置更好的选择,有助于防止此类攻击。使用这些设置,副本检查服务器证书是否有效,并检查副本使用的主机名是否与服务器证书中的身份匹配。要实施其中一种验证级别,您必须首先确保服务器的 CA 证书对副本可靠可用,否则会导致可用性问题。因此,它们不是默认设置。
选项和选项指定副本如何
使用加密和密码来保护复制连接。即使在没有 SSL 支持的情况下编译的副本,也可以更改这些选项。它们保存到源元数据存储库,但如果副本未启用 SSL 支持,则会被忽略。和
选项执行与
加密连接的命令选项中描述
的和
客户端选项相同的功能
。两组选项的对应关系,以及和的
使用MASTER_SSL_
xxx
MASTER_TLS_VERSION
MASTER_SSL_
xxx
MASTER_TLS_VERSION
--ssl-
xxx
--tls-version
MASTER_SSL_
xxx
MASTER_TLS_VERSION
设置安全连接的选项,在
第 16.3.8 节,“设置复制以使用加密连接”中进行了解释。
、MASTER_HEARTBEAT_PERIOD
和
选项控制副本如何识别MASTER_CONNECT_RETRY
与
MASTER_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
性能模式表中。发出RESET SLAVE
将心跳间隔重置为默认值。在 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 31 −1interval
范围内的非负整数,则会发生错误
。有关详细信息,请参阅第 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
如果or
均未
MASTER_LOG_POS
指定,则副本使用之前复制 SQL 线程的最后一个坐标CHANGE MASTER
TO
发出。这确保了复制没有中断,即使复制 SQL 线程比复制 I/O 线程晚了,当您只想更改,比方说,要使用的密码时。
从 MySQL 5.7 开始,当复制 SQL 线程停止时,可以在正在运行的副本上执行使用 、 或这两个选项的
CHANGE MASTER TO
语句。在 MySQL 5.7.4 之前,删除所有中继日志文件并启动一个新文件,除非您指定或
。在这种情况下,会保留中继日志文件;全局变量静默设置为
0。在 MySQL 5.7.4 及更高版本中,如果复制 SQL 线程和复制 I/O 线程中至少有一个正在运行,则会保留中继日志。如果两个线程都停止,则删除所有中继日志文件,除非至少有一个或
RELAY_LOG_FILE
RELAY_LOG_POS
CHANGE MASTER
TO
RELAY_LOG_FILE
RELAY_LOG_POS
relay_log_purge
RELAY_LOG_FILE
RELAY_LOG_POS
被指定。对于只有一个 SQL 线程而没有 I/O 线程的 Group Replication applier 通道 ( group_replication_applier
),如果 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
set,在初始连接握手中,副本发送一个 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 的复制来弥合差距时,您可以IGNORE_SERVER_IDS =
(3)
在CHANGE MASTER
TO
您在服务器 4 上发出的语句中包含告诉它使用服务器 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_HOST
MASTER_PORT
MASTER_LOG_FILE
MASTER_LOG_POS
CHANGE MASTER TO
导致正在进行的事务的隐式提交。请参阅第 13.3.3 节,“导致隐式提交的语句”。
在 MySQL 5.7.4 及更高版本中,删除了STOP SLAVE
在发出任何
CHANGE MASTER TO
语句之前(以及
之后)
执行的严格要求
。START SLAVE
的行为不依赖于副本是否停止,而是依赖于CHANGE MASTER TO
(在 MySQL 5.7.4 及更高版本中)复制 SQL 线程和复制 I/O 线程的状态;现在停止或运行这些线程中的哪一个决定了在给定时间点可以或不能与CHANGE MASTER TO
语句一起使用的选项。此处列出了做出此决定的规则:
如果 SQL 线程停止,您可以使用 、 和 选项允许的任何组合执行 , 即使
CHANGE MASTER TO
复制 I/O 线程正在运行。当 I/O 线程运行时,此语句不能使用其他选项。RELAY_LOG_FILE
RELAY_LOG_POS
MASTER_DELAY
如果 I/O 线程停止,您可以
CHANGE MASTER TO
使用此语句的任何选项(在任何允许的组合中) 执行,除了RELAY_LOG_FILE
、RELAY_LOG_POS
、MASTER_DELAY
,MASTER_AUTO_POSITION = 1
甚至当 SQL 线程正在运行时。Both the SQL thread and the I/O thread must be stopped before issuing a
CHANGE MASTER TO
statement that employsMASTER_AUTO_POSITION = 1
.
You can check the current state of the replication SQL thread
and the replication I/O thread using SHOW
SLAVE STATUS
. Note that the Group Replication applier
channel (group_replication_applier
) has no
I/O thread, only an SQL thread.
For more information, see Section 16.3.7, “Switching Sources During Failover”.
If you are using statement-based replication and temporary
tables, it is possible for a CHANGE MASTER TO
statement following a STOP SLAVE
statement to
leave behind temporary tables on the replica. From MySQL 5.7, a
warning
(ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
)
is issued whenever this occurs. You can avoid this in such cases
by making sure that the value of the
Slave_open_temp_tables
system
status variable is equal to 0 prior to executing such a
CHANGE MASTER TO
statement.
CHANGE MASTER TO
is useful for
setting up a replica when you have the snapshot of the
replication source server and have recorded the source's binary
log coordinates corresponding to the time of the snapshot. After
loading the snapshot into the replica to synchronize it with the
source, you can run CHANGE MASTER TO
MASTER_LOG_FILE='
on
the replica to specify the coordinates at which the replica
should begin reading the source's binary log.
log_name
',
MASTER_LOG_POS=log_pos
The following example changes the replication source server the replica uses and establishes the source's binary log coordinates from which the replica begins reading. This is used when you want to set up the replica to replicate the source:
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 |