CHANGE MASTER TO option [, 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}
| IGNORE_SERVER_IDS = (server_id_list)
}
server_id_list:
[server_id [, server_id] ... ]
CHANGE MASTER TO
更改副本用于连接到复制源服务器、读取源的二进制日志和读取副本的中继日志的参数。它还更新复制元数据存储库的内容(请参阅
第 17.2.2 节,“中继日志和复制元数据存储库”)。CHANGE
MASTER TO
需要
SUPER
特权。
要使用CHANGE MASTER TO
,必须停止复制线程(
STOP SLAVE
必要时使用)。在 MySQL 5.6.11 及更高版本中,
gtid_next
还必须设置为
AUTOMATIC
(错误 #16062608)。
未指定的选项保留其值,除非在以下讨论中指出。因此,在大多数情况下,无需指定不会更改的选项。例如,如果连接到 MySQL 源的密码已更改,请发出以下语句以将新密码告知副本:
STOP SLAVE; -- if replication was running
CHANGE MASTER TO MASTER_PASSWORD='new3cret';
START SLAVE; -- if you want to restart replication
MASTER_HOST
, MASTER_USER
,
MASTER_PASSWORD
,
MASTER_PORT
并向副本提供有关如何连接到其源的信息:
MASTER_HOST
是源主机的MASTER_PORT
主机名(或 IP 地址)及其 TCP/IP 端口。笔记复制不能使用 Unix 套接字文件。您必须能够使用 TCP/IP 连接到源 MySQL 服务器。
如果您指定
MASTER_HOST
或MASTER_PORT
选项,则副本假定源服务器与以前不同(即使选项值与其当前值相同)。在这种情况下,源的二进制日志文件名和位置的旧值被认为不再适用,因此如果您没有在语句中 指定MASTER_LOG_FILE
和 ,并且 会默默地附加到它。MASTER_LOG_POS
MASTER_LOG_FILE=''
MASTER_LOG_POS=4
设置
MASTER_HOST=''
(即,将其值显式设置为空字符串) 与根本不设置MASTER_HOST
不同。从 MySQL 5.5 开始,尝试设置MASTER_HOST
为空字符串失败并出现错误。以前,设置MASTER_HOST
为空字符串会导致START SLAVE
随后失败。(漏洞 #28796)在 MySQL 5.6.5 及更高版本中,检查用于
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 复制特有的问题,已在 MySQL 5.7 中修复。(缺陷 #11752299,缺陷 #43439)可以通过指定来设置一个空的用户名
MASTER_USER=''
,但是不能用一个空的用户名来启动复制通道。MASTER_USER
如果您出于安全目的需要从副本的存储库中清除以前使用的凭据,并且之后不要尝试使用该通道,则仅设置一个空的用户名。(漏洞 #13427949)运行
CHANGE MASTER TO
语句的文本,包括 和 的值MASTER_USER
,MASTER_PASSWORD
可以在并发SHOW PROCESSLIST
语句的输出中看到。(START SLAVE
声明的完整文本也对 可见SHOW PROCESSLIST
。)
这些
选项提供有关使用 SSL 进行连接的信息。它们对应
于加密连接的命令选项和
第 17.3.8 节“设置复制以使用加密连接”中描述的选项。即使在没有 SSL 支持的情况下编译的副本,也可以更改这些选项。它们被保存到连接元数据存储库中,但如果副本未启用 SSL 支持,则会被忽略。并
在 MySQL 5.6.3 中添加。
MASTER_SSL_
xxx
--ssl-
xxx
MASTER_SSL_CRL
MASTER_SSL_CRLPATH
为了帮助防止复杂的中间人攻击,副本验证服务器的身份很重要。使用附加
设置,副本检查服务器的证书是否有效。要实施此级别的验证,您必须首先确保服务器的 CA 证书对副本可靠可用,否则会导致可用性问题。
MASTER_SSL_
xxx
MASTER_CONNECT_RETRY
指定连接重试之间等待的秒数。默认值为 60。
MASTER_RETRY_COUNT
, 在 MySQL 5.6.1 中添加,限制重新连接尝试的次数并更新
Master_Retry_Count
输出中列
的值SHOW SLAVE STATUS
(也在 MySQL 5.6.1 中添加)。默认值为 24 * 3600 = 86400。
MASTER_RETRY_COUNT
旨在取代较旧的--master-retry-count
服务器选项,现在是设置此限制的首选方法。我们鼓励您不要依赖
--master-retry-count
新的应用程序,并且在从早期版本的 MySQL 升级到 MySQL 5.6.1 或更高版本时,更新任何依赖它的现有应用程序,以便它们使用CHANGE MASTER TO ...
MASTER_RETRY_COUNT
。
MASTER_DELAY
指定副本必须落后于源多少秒。从源接收到的事件至少
interval
比它在源上的执行晚几秒才执行。默认值为 0。如果不是 0 到 2 31 −1interval
范围内的非负整数,则会发生错误
。有关详细信息,请参阅第 17.3.10 节,“延迟复制”。这个选项是在 MySQL 5.6.0 中添加的。
MASTER_BIND
用于具有多个网络接口的副本,并确定选择哪个副本的网络接口来连接到源。
使用此选项配置的地址(如果有)可以在Master_Bind
输出的列中
看到SHOW SLAVE STATUS
。如果您将表用于复制元数据存储库(服务器以 启动
master_info_repository=TABLE
),则该值也可以视为表的Master_bind
列mysql.slave_master_info
。
MySQL 5.6.2 中添加了将副本绑定到特定网络接口的功能。这在 MySQL NDB Cluster 7.3 及更高版本中也受支持。
MASTER_HEARTBEAT_PERIOD
设置复制心跳之间的间隔(以秒为单位)。每当源的二进制日志更新为事件时,下一次心跳的等待时间就会重置。interval
是一个十进制值,范围从 0 到 4294967 秒,分辨率以毫秒为单位;最小的非零值是 0.001。仅当二进制日志文件中的时间超过
interval
.
如果将源连接信息记录到表中,
MASTER_HEARTBEAT_PERIOD
可以看作是表的Heartbeat
列的
值mysql.slave_master_info
。
设置interval
为 0 将完全禁用心跳。的默认值
interval
等于
slave_net_timeout
除以 2 的值。
设置@@GLOBAL.slave_net_timeout
为小于当前心跳间隔的值会导致发出警告。对心跳间隔发出的效果
RESET SLAVE
是将其重置为默认值。
MASTER_LOG_FILE
MASTER_LOG_POS
是复制 I/O 线程在下次线程启动时应开始从源读取的坐标
。
RELAY_LOG_FILE
并且
RELAY_LOG_POS
是复制 SQL 线程在下次线程启动时应该开始从中继日志读取的坐标。如果您指定 或 之一
MASTER_LOG_FILE
,
MASTER_LOG_POS
则不能指定
RELAY_LOG_FILE
或
RELAY_LOG_POS
。在 MySQL 5.6.5 及更高版本中,如果指定 或 中的任何一个MASTER_LOG_FILE
,
则MASTER_LOG_POS
也不能指定
MASTER_AUTO_POSITION = 1
(本节稍后介绍)。MASTER_LOG_FILE
如果or均未MASTER_LOG_POS
指定,则副本使用CHANGE MASTER
TO
发出之前的复制 SQL 线程。这确保了复制没有中断,即使复制 SQL 线程比复制 I/O 线程晚了,当您只想更改,比方说,要使用的密码时。
MASTER_AUTO_POSITION
是在 MySQL 5.6.5 中添加的。如果MASTER_AUTO_POSITION = 1
与 一起使用CHANGE MASTER TO
,则副本尝试使用基于 GTID 的复制协议连接到源。
使用 GTID 时,副本会告诉源它已经接收、执行或同时接收和执行了哪些事务。为了计算这个集合,它从 中读取 的全局值
gtid_executed
和Retrieved_gtid_set
列
的值SHOW SLAVE STATUS
。由于上次传输的事务的 GTID 包含在
Retrieved_gtid_set
即使事务仅部分传输的情况下,因此从该集合中减去最后接收到的 GTID。因此,副本计算以下集合:
UNION(@@GLOBAL.gtid_executed, Retrieved_gtid_set - last_received_GTID)
这个集合作为初始握手的一部分被发送到源,并且源发回它已经执行的所有不属于该集合的事务。如果这些事务中的任何一个已经从源的二进制日志中清除,则源将错误发送
ER_MASTER_HAS_PURGED_REQUIRED_GTIDS
到副本,并且复制不会开始。
当采用基于 GTID 的复制时,不使用 和 表示的坐标,MASTER_LOG_FILE
而是
MASTER_LOG_POS
使用全局事务标识符。因此,将这些选项中的一个或两个一起使用
MASTER_AUTO_POSITION
会导致错误。
从 MySQL 5.6.10 开始,您可以通过检查 的输出来查看复制是否在启用自动定位的情况下运行
SHOW SLAVE STATUS
。(漏洞 #15992220)
gtid_mode
也必须在发布之前启用CHANGE MASTER TO ...
MASTER_AUTO_POSITION = 1
。否则,该语句会因错误而失败。
要在使用 GTID 后恢复到旧的基于文件的复制协议,您可以发出一条新CHANGE MASTER
TO
语句,指定
MASTER_AUTO_POSITION = 0
, 以及MASTER_LOG_FILE
或
中的至少一个MASTER_LOG_POS
。
CHANGE MASTER TO
删除所有中继日志文件并启动一个新文件,除非您指定RELAY_LOG_FILE
或
RELAY_LOG_POS
。在这种情况下,会保留中继日志文件;relay_log_purge
全局变量静默设置为 0
。
在 MySQL 5.6.2 之前,RELAY_LOG_FILE
需要一个绝对路径。从 MySQL 5.6.2 开始,路径可以是相对的,在这种情况下,它被假定为相对于副本的数据目录。(漏洞 #12190)
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 = ();
RESET SLAVE
ALL
对服务器 ID 列表没有影响。此问题已在 MySQL 5.7 中修复。(漏洞#18816897)
如果IGNORE_SERVER_IDS
包含服务器自己的 ID 并且服务器是在
--replicate-same-server-id
启用该选项的情况下启动的,则会产生错误。
在 MySQL 5.6 中,连接元数据存储库和输出SHOW SLAVE
STATUS
提供了当前被忽略的服务器列表。有关详细信息,请参阅
第 17.2.2.2 节,“复制元数据存储库”和
第 13.7.5.35 节,“SHOW SLAVE STATUS 语句”。
在 MySQL 5.6 中,调用会导致、、
和
CHANGE
MASTER TO
的先前值
连同有关执行前副本状态的其他信息一起写入错误日志。
MASTER_HOST
MASTER_PORT
MASTER_LOG_FILE
MASTER_LOG_POS
在 MySQL 5.6.7 及更高版本中,CHANGE MASTER TO
导致正在进行的事务的隐式提交。请参阅
第 13.3.3 节,“导致隐式提交的语句”。
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='bigs3cret',
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 |
16 |
MASTER_PASSWORD |
32 |
MASTER_LOG_FILE |
255 |
RELAY_LOG_FILE |
255 |
MASTER_SSL_CA |
255 |
MASTER_SSL_CAPATH |
255 |
MASTER_SSL_CERT |
255 |
MASTER_SSL_CRL |
255 |
MASTER_SSL_CRLPATH |
255 |
MASTER_SSL_KEY |
255 |
MASTER_SSL_CIPHER |
511 |