change master mysql_【MySQL】MySQL主从之change master语法

前言:在我们配置主从复制的时候,在从库上会用到change master语句,该语句用于确定主库的IP、用户名、密码、binlog文件、binlog位置等信息。

语法

change master基本语法以及参数如下:

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 = 'master_log_name'

| MASTER_LOG_POS = master_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语句前如果从机上slave io及sql线程已经启动,需要先停止(执行stop slave)。

change master to后面不指定某个参数的话,该参数保留原值或默认值。所以后续如果某些参数没有更改的话,change master to后无需带该参数,例如我们只改变了用于复制的用户密码,那么change master to只需针对MASTER_PASSWORD选项作出修改即可,例如:

mysql> stop slave;

mysql> change master to master_password='new_password';

mysql> start slave;

参数解释

MASTER_HOST, MASTER_USER, MASTER_PASSWORD,MASTER_PORT四个选项提供了slave从机连接到master主机的信息。

MASTER_HOST 与 MASTER_PORT:

分别代表master主机名(或IP地址)及mysql实例端口号。

注意: 复制不能使用unix socet文件,必须使用tcp/ip 连接到master。

如果我们指定MASTER_HOST 与 MASTER_PORT参数,slave会认为master与之前的不是同一个(即便MASTER_HOST 与 MASTER_PORT所带的参数与之前相同),之前指定的master的binlog文件名及位置将不再适用。所以如果我们在后面不明确指定MASTER_LOG_FILE 和 MASTER_LOG_POS 的参数值,那么MASTER_LOG_FILE='' 以及 MASTER_LOG_POS=4 将会默认的追加到后面。

设置MASTER_HOST为空(MASTER_HOST=' ')与不设置该参数是不同的,mysql5.5开始,将MASTER_HOST设为空将会失败并报错【验证】

MASTER_USER 与 MASTER_PASSWORD:

连接到master主机复制账户所对应的用户名及密码。

mysql5.6.4及其后续版本,MASTER_USER不能设置为空;当明确设置MASTER_PASSWORD参数时,MASTER_USER 不能设置为空或不进行设置【验证2.1实例】。

MASTER_PASSWORD参数对应的密码长度最大为32位字符【验证】,如果字符超长(超过32位),语句会执行成功,但超出的长度会被截取掉,mysql复制的这个问题在mysql5.7版本中得到了修复。

###### MASTER_LOG_FILE 与 MASTER_LOG_POS:

这两项确定slave的io线程下次开始执行时从master开始读取的位置坐标,RELAY_LOG_FILE 与 RELAY_LOG_POS这两项确定slave的sql线程下次开始执行时从relay log开始读取的位置坐标。如果我们指定了MASTER_LOG_FILE 或 MASTER_LOG_POS中的任意一项,就不能再指定RELAY_LOG_FILE 或 RELAY_LOG_POS,也不能指定MASTER_AUTO_POSITION = 1 (mysql5.6.5及其后续版本)。如果二者都没有指定,slave使用上次slave sql线程保存的位置。

RELAY_LOG_FILE 与 RELAY_LOG_POS:

change master to操作删除所有relay log文件并创建一个新的,除非我们指定RELAY_LOG_FILE 或 RELAY_LOG_POS。如果全局变量relay_log_purge设置为0(默认为ON),relay log也将会保持。

mysql5.6.2之前,RELAY_LOG_FILE需要配置绝对路径,mysql5.6.2及其后续版本,可以配置相对路径(相对mysql的data目录)。

MASTER_AUTO_POSITION:

该参数在mysql5.6.5版本引入,如果进行change master to时使用MASTER_AUTO_POSITION = 1,slave连接master将使用基于GTID的复制协议。

使用基于GTID协议的复制,slave会告诉master它已经接收到或执行了哪些事务。计算这个集,slave需要读取全局参数gtid_executed以及通过show slave status获取的参数Retrieved_gtid_set。

结果集作为初次握手的一部分,发送到master,master发回它已经执行的且不在结果集这部分的所有事务。如果这些事务在master的binlog文件中已经被清除,master将会发送一个ER_MASTER_HAS_PURGED_REQUIRED_GTIDS错误信息到slave,复制将不会开启。

使用基于GTID的复制时(MASTER_AUTO_POSITION = 1),首先要开启gtid_mode(在my.cnf中设置gtid-mode = ON),MASTER_LOG_FILE 与 MASTER_LOG_POS也不能使用,否则会报错。

使用GTID后想要恢复到老的基于文件的复制协议,在change master to时需要指定MASTER_AUTO_POSITION = 0以及MASTER_LOG_FILE 或 MASTER_LOG_POSITION中至少一项。

MASTER_CONNECT_RETRY:

重连到master时的超时等待时间,默认为60秒。

MASTER_RETRY_COUNT:

mysql5.6.1引入该参数,限制重连次数以及更新show slave status输出的Master_Retry_Count列。默认值是24 * 3600 = 86400。MASTER_RETRY_COUNT主要用于替代mysqld服务器参数 --master-retry-count(该参数在mysql5.6.1及其后续版本废除)。MASTER_RETRY_COUNT = 0表示重连次数无限制。

MASTER_HEARTBEAT_PERIOD:

设置复制心跳的周期,取值范围为0 到 4294967秒。精确度可以达到毫秒,最小的非0值是0.001秒。心跳信息由master在主机binlog日志文件在设定的间隔时间内没有收到新的事件时发出,以便slave知道master是否正常。

slave连接到master后,该参数可通过mysql.slave_master_info表查看。默认值为slave_net_timeout的值除以2,设置为0表示完全的禁用心跳。

MASTER_DELAY:

默认值为0,取值范围为0至2^31–1,表示slave至少落后master的复制时间。来自master的事件不直接执行,而是至少等到master执行完该该事件MASTER_DELAY所指定的时间间隔后才执行。

MASTER_BIND:

在slave复制从机多网络接口的情况下使用,以确定用哪一个slave网络接口连接到master。该参数在mysql5.6.2版本加入,同时也支持MySQL Cluster NDB 7.3.1及其后续版本。

该参数可通过show slave status的Master_Bind列进行查看,如果启动mysql时指定了--master-info-repository=TABLE,也可通过mysql.slave_master_info表查看(Bind列)。

IGNORE_SERVER_IDS = (server_id_list):

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

后面接以逗号分隔的0个或多个server-id,主要用于多主复制或环形复制的情况,处于复制链条中间的服务器异常,可以通过以下语句跳过出问题的MySQL实例。

mysql> CHANGE MASTER TO MASTER_HOST=xxx IGNORE_SERVER_IDS= [server_id [, server_id] ... ]

清除忽略的主机列表使用如下命令:

mysql> CHANGE MASTER TO IGNORE_SERVER_IDS = ();

MASTER_SSL*:

该选项提供使用ssl连接的信息。它们保存在master的信息表,即使slave没有使用SSL选项编译,这些参数依然可以更改,只不过会被忽略。MASTER_SSL_CRL 与 MASTER_SSL_CRLPATH 在 MySQL 5.6.3版本加入。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过Dockerfile手动创建MySQL 5.7主从镜像,以下是一个示例Dockerfile: ``` # 基础镜像 FROM mysql:5.7 # 设置MySQL的root用户密码 ENV MYSQL_ROOT_PASSWORD=yourpassword # 复制MySQL配置文件到镜像中 COPY ./my.cnf /etc/mysql/my.cnf # 设置容器启动时执行的命令 CMD ["mysqld"] # 在容器中创建一个新的MySQL用户 RUN mysql -e "CREATE USER 'replication'@'%' IDENTIFIED BY 'yourpassword';" # 授权主从复制权限 RUN mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';" # 开放MySQL默认端口 EXPOSE 3306 ``` 在上面的Dockerfile中,我们通过`ENV`命令设置了MySQL的root用户密码,通过`COPY`命令复制了MySQL配置文件到镜像中,通过`RUN`命令创建了一个新的MySQL用户,并授权主从复制权限。 在构建镜像时,可以使用以下命令: ``` docker build -t mysql57 . ``` 其中,`.`表示当前目录中的Dockerfile。 构建完成后,可以使用以下命令启动MySQL主从容器: ``` docker run -d --name mysql-master -p 3306:3306 mysql57 docker run -d --name mysql-slave -p 3307:3306 mysql57 ``` 其中,`--name`指定容器名称,`-p`指定端口映射。 启动容器后,可以使用以下命令进入MySQL主容器: ``` docker exec -it mysql-master mysql -uroot -p ``` 其中,`-it`表示交互式终端,`-uroot`表示以root用户身份登录MySQL,`-p`表示输入密码。 进入MySQL后,可以创建数据库和表,并进行数据操作。在主容器中,还需要执行以下命令,获取binlog信息: ``` mysql> show master status; ``` 在从容器中,可以使用以下命令配置主从复制: ``` CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='replication', MASTER_PASSWORD='yourpassword', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', # 这里的值根据主容器中的binlog信息修改 MASTER_LOG_POS=154; # 这里的值根据主容器中的binlog信息修改 ``` 其中,`MASTER_HOST`指定主容器的主机名或IP地址,`MASTER_USER`指定主从复制用户,`MASTER_PASSWORD`指定主从复制用户密码,`MASTER_PORT`指定主容器的端口号,`MASTER_LOG_FILE`和`MASTER_LOG_POS`指定从容器应该从哪个binlog位置开始复制数据。 最后,可以使用以下命令启动从容器的MySQL服务: ``` mysql> start slave; ``` 这样,就完成了MySQL 5.7主从复制镜像的构建和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值