目前环境如下:

master server IP:172.17.61.131

slave server IP:172.17.61.132

mysql version: mysql-5.7.21-linux

目标:计划内的主从复制正常切换

1.切换之前需要检查slave的同步状态,对master进行锁表。

slave server: 确保Slave_IO_Running和Slave_SQL_Running都为YES

mysql> show slave status \G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 172.17.61.131

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql_bin.000036

Read_Master_Log_Pos: 154

Relay_Log_File: slave_relay_bin.000003

Relay_Log_Pos: 367

Relay_Master_Log_File: mysql_bin.000036

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

...

1 row in set (0.00 sec)

master server进行锁表操作,由于我是测试环境没有应用,所以锁表很快。

2.在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables with read lock就会被阻塞,直到所有的锁被释放。

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.01 sec)

3.接着要确保master所有的binlog已同步到slave,并且slave都已apply了所有的binlog。

maser server:

mysql> show processlist;

+----+------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+

| Id | User | Host                | db   | Command     | Time | State                                                         | Info             |

+----+------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+

|  2 | repl | 172.17.61.132:60079 | NULL | Binlog Dump | 1907 | Master has sent all binlog to slave; waiting for more updates | NULL             |

|  3 | root | localhost           | NULL | Query       |    0 | starting                                                      | show processlist |

+----+------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+

2 rows in set (0.00 sec)

slave server:

mysql> show processlist;

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

|  1 | system user |           | NULL | Connect | 1918 | Slave has read all relay log; waiting for more updates | NULL             |

|  2 | system user |           | NULL | Connect | 1918 | Waiting for master to send event                       | NULL             |

|  4 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

3 rows in set (0.00 sec)

4.停止slave的进程

slave sever:

mysql> STOP SLAVE IO_THREAD;

Query OK, 0 rows affected (0.02 sec)

mysql>  show processlist;

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

|  1 | system user |           | NULL | Connect | 2039 | Slave has read all relay log; waiting for more updates | NULL             |

|  4 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

2 rows in set (0.00 sec)

5.修改slave的my.cnf,重启mysql

[mysqld]

socket = /usr/local/mysql/mysql.sock

character_set_server= utf8

init_connect= 'SET NAMES utf8'

basedir= /usr/local/mysql

datadir= /u01/mysql

socket = /u01/mysql/mysql.sock

log-error= /u01/log/mysql/mysql_3306.err

pid-file= /u01/mysql/mysqld.pid

lower_case_table_names = 1

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

secure-file-priv = /u01/backup

server-id=10001

log_bin = /u01/mysql/mysql_bin

#skip-grant-tables

innodb_flush_log_at_trx_commit=1

sync_binlog=1

#relay-log=/u01/mysql/slave_relay_bin

expire_logs_days=10

read_only=0

#relay_log_recovery=on

#relay_log_info_repository=TABLE

max_binlog_size=1073741824

#autocommit=off

#long_query_time=15

#slow_query_log=on

[root@qht132 ~]# service mysql restart

Shutting down MySQL..                                      [  OK  ]

Starting MySQL.                                            [  OK  ]

需要开启原slave的bin_log,关闭relay_log*,关闭read_only

5.提升slave为master

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> reset master;

Query OK, 0 rows affected (0.00 sec)

mysql> reset slave all;

Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

mysql> show master status \G

*************************** 1. row ***************************

File: mysql_bin.000001

Position: 154

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

在新的master上建立同步帐户并赋予同步权限(由于我为了省事,之前主从配置的时候将61网段的权限都赋予给了repl,所以这一步我也可以不做)

mysql> grant replication slave on *.* to 'repl'@'172.17.61.%';

Query OK, 0 rows affected (0.01 sec)

6.修改原master的my.cnf,重启mysql

[mysqld]

socket = /usr/local/mysql/mysql.sock

character_set_server= utf8

init_connect= 'SET NAMES utf8'

basedir= /usr/local/mysql

datadir= /u01/mysql

socket = /u01/mysql/mysql.sock

log-error= /u01/log/mysql/mysql_3306.err

pid-file= /u01/mysql/mysqld.pid

lower_case_table_names = 1

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

secure-file-priv = /u01/backup

server-id=10000

#log_bin = /u01/mysql/mysql_bin

#skip-grant-tables

#innodb_flush_log_at_trx_commit=1

#sync_binlog=1

expire_logs_days=10

read_only=1

relay_log_recovery=on

relay_log_info_repository=TABLE

#max_binlog_size=1073741824

#autocommit=off

#long_query_time=15

#slow_query_log=on

关闭原master的binlog,开启relay_log*,打开read_only状态

[root@qht131 ~]# service mysql restart

Shutting down MySQL..                                      [  OK  ]

Starting MySQL.                                            [  OK  ]

7.将master切换为slave

mysql> reset master;

Query OK, 0 rows affected (0.00 sec)

mysql> change master to

-> master_host='172.17.61.132',

->  master_user='repl',

->  master_password='repl',

-> master_log_file='mysql_bin.000001',

-> master_log_pos=154;

Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

master_log_file和master_log_pos需指定为新master切换后显示的起始位置

检查一下新slave的状态,确保slave_io_running和slave_sql_running都为YES。

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 172.17.61.132

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql_bin.000001

Read_Master_Log_Pos: 360

Relay_Log_File: qht131-relay-bin.000002

Relay_Log_Pos: 526

Relay_Master_Log_File: mysql_bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 360

Relay_Log_Space: 734

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 10001

Master_UUID: 744cfcde-3a9b-11e8-b299-000c2900d025

Master_Info_File: /u01/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

8.最后进行测试

新master:

mysql> create table t3 ( c1 int);

Query OK, 0 rows affected (0.05 sec)

新slave:

mysql> use l5m

Database changed

mysql> show tables;

+---------------+

| Tables_in_l5m |

+---------------+

| t1            |

| t2            |

| t3            |

| test_emp      |

| tt            |

+---------------+

5 rows in set (0.00 sec)

mysql> show create table t3\G

*************************** 1. row ***************************

Table: t3

Create Table: CREATE TABLE `t3` (

`c1` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

至此测试完毕!

转自

mysql5.7 主从复制的正常切换 - CSDN博客

https://blog.csdn.net/jolly10/article/details/79877564

mysql 5.7 主从切换_mysql5.7 主从复制的正常切换【转】相关推荐

  1. mysql主从代替技术_mysql主从复制及失败切换

    软件环境: mysql软件包:mysql-5.6.17.tar.gz cmake软件包:cmake-2.8.12.2.tar.gz @  wget http://www.cmake.org/files ...

  2. mysql 5.5主从同步_MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库

    This browser does not support music or audio playback. Please play it in WeChat or another browser. ...

  3. MYSQL数据库的主从切换

    一.MHA简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于 Facebook公 ...

  4. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  5. 关于Linux下MySql集群同步(主从、一主多从、主从从)部署及同步策略的一些笔记

    写在前面 和小伙们分享一些Mysql集群主从同步相关的笔记 博文内容涉及: 为什么需要mysql集群主从同步 主从同步原理 部署不同主从结构的Mysql集群 同步使用的复制模式介绍配置 理解不足小伙伴 ...

  6. mysql基于传统的log_file及log_pos主从复制

    2019独角兽企业重金招聘Python工程师标准>>>                                                 mysql基于传统的log_f ...

  7. 【mysql】mysql的数据库主从(一主一从)

    在搭建mysql的数据库主从之前,我们在两台不同的服务器上搭建mysql数据库,安装的步骤在下面的博客中: linux安装mysql :https://blog.csdn.net/wangyunzha ...

  8. mysql pos点是什么,MySQL 5.6 主从报错一例

    原标题:MySQL 5.6 主从报错一例 作者:八怪(高鹏) 中亦科技数据库专家 1. 问题现象 版本:MySQL 5.6,采用传统 binlog file & pos 方式配置的主从复制结构 ...

  9. mysql connect by_Mysql主从库搭建

    点击上方蓝字关注我们! 基于Docker的Mysql主从复制搭建 首先安装docker 拉取mysql镜像:5.7版本 启动主从数据库容器 docker run -p 3339:3306 --name ...

最新文章

  1. Spark运行模式(local standalond,yarn-client,yarn-cluster,mesos-client,mesos-cluster)
  2. 禁止Chrome浏览器缓存
  3. graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpdf', '-O', 'Digraph.gv']
  4. 硬盘FAT32转NTFN格式的命令
  5. 2017c语言考核册答案,2017年最新C语言考题带答案
  6. fopen、_wfopen临时
  7. 【NLP】保姆级教程:手把手带你CNN文本分类(附代码)
  8. java.lang.IllegalArgumentException: Can't find a no-arg constructor for class com.xiayiye.takeout.mo
  9. 如何安装mysql 匹配_学习笔记----安装MySQL
  10. 2.3物理层下面的传输媒体
  11. treelist 判断父子节点_DOM(4)-节点
  12. python 知乎 合并 pdf_32.使用selenium爬取知乎,并实现多页保存为一个PDF文件
  13. 干货 | 120 道机器学习面试题!备战春招
  14. 笔记6:Django基础
  15. build.gradle文件介绍
  16. 虚拟机怎么制作镜像文件
  17. MaterialDesign+MovePicImageView实现漂亮的登陆界面
  18. Flutter Text控件在不同手机上不居中的问题
  19. 复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)
  20. js之按键控制div移动

热门文章

  1. ASP.NET Core和json请求这样用真简单,axios、微信小程序得救了
  2. ASP.NET Core Cookie SameSite
  3. 如何在Windows上使用Git创建一个可执行脚本?
  4. 重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用
  5. .NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...
  6. 使用Kubeadm创建k8s集群之节点部署(三十二)
  7. Docker最全教程——数据库容器化之持久保存数据(十二)
  8. C#:在Task中使用依赖注入的Service/EFContext
  9. ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
  10. asp.net core 中间件详解及项目实战