MySQL主从切换

环境:
原主库:192.168.10.197 ---新从库
原从库:192.168.10.226 ---新主库

1、切换之前确保主从是同步的
原主库(192.168.10.197):
mysql> show processlist;
+----+-------------+----------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+----------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
| 2 | system user | | NULL | Connect | 1348 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 16 | repli | 192.168.10.226:50357 | NULL | Binlog Dump | 141 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 17 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-------------+----------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000009
Position: 319
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
原从库(192.168.10.226):
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 14 | root | localhost | NULL | Query | 0 | init | show processlist |
| 15 | system user | | NULL | Connect | 224 | Waiting for master to send event | NULL |
| 16 | system user | | NULL | Connect | 971 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.03 sec)
mysql>show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.197
Master_User: repli
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 319
.......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
Seconds_Behind_Master: 0

2、修改参数 vi /etc/my.cnf
原主库:
read-only=1
log_slave_updates=1
relay-log=/var/lib/mysql/mysql-relay-bin
relay-log-index=/var/lib/mysql/mysql-relay-bin.index
skip-slave-start=1
innodb_flush_log_at_trx_commit = 1
sync-binlog=1

原备库:
#read-only=1 ---注释掉只读模式

3、操作原从库
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.11 sec)
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 16 | system user | | NULL | Connect | 9728 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 17 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
2 rows in set (0.05 sec)
mysql> show slave status \G
.....
Slave_IO_Running: No ---这个已停掉
Slave_SQL_Running: Yes
原从库变新主库
mysql> stop slave;
Query OK, 0 rows affected (0.04 sec)
mysql> reset master;
Query OK, 0 rows affected (2.26 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.04 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.02 sec)

4、操作原主库
mysql> reset master;
Query OK, 0 rows affected (0.15 sec)
mysql> reset slave;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first
mysql> stop slave;
Query OK, 0 rows affected (0.07 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.09 sec)
原主库变新从库
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.10.226',
-> MASTER_USER='repli',
-> MASTER_PASSWORD='repli',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> start slave;
Query OK, 0 rows affected (0.13 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.226
Master_User: repli
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 120
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

5、删除新从库上的relay-log.info 文件,否则下次重启slave时会报如下错误。
/var/lib/mysql
-rw-rw---- 1 mysql mysql 127 Jan 5 22:31 master.info
-rw-rw---- 1 mysql mysql 62 Jan 5 22:31 relay-log.info
mv relay-log.info /tmp
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
由于新的slave改变了服务端口和文件路径,分析应该是由于mysql-relay-bin.index中仍然保存着旧relay日志文件的路径,而这些路径下又找不到合适的文件,因此报错。

出现这个这个问题解决方法:
先删掉文件,再重启mysql服务:service mysql restart
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
查看新从库/var/lib/mysql/master.info内容,从新change master
mysql> change master to
-> master_host='192.168.10.226',
-> master_port=3306,
-> master_user='repli',
-> master_password='repli',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)

6、重启新主从库,开启slave进程,检查是否正常
# service mysql restart
Shutting down MySQL... [ OK ]
Starting MySQL.... [ OK ]
新主库
mysql> show processlist;
+----+-------+----------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+----------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| 2 | root | localhost | NULL | Query | 0 | init | show processlist |
| 4 | repli | 192.168.10.197:56038 | NULL | Binlog Dump | 283 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
+----+-------+----------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
新从库
start slave;
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 1 | root | localhost | NULL | Query | 0 | init | show processlist |
| 2 | system user | | NULL | Connect | 67 | Waiting for master to send event | NULL |
| 3 | system user | | NULL | Connect | 67 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.226
Master_User: repli
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 120
Relay_Log_File: mysql-relay-bin.000005
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000002
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: 120
Relay_Log_Space: 456
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: 60
Master_UUID: c954f3a2-21d0-11e4-a4b2-000c2981e58a
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
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
1 row in set (0.00 sec)
新主从同步,切换完成!

# cat master.info --文件记录的信息
23
mysql-bin.000002
120
192.168.10.226
repli
repli
3306
60
.......
MySQL主从切换是指将原本的MySQL主服务器切换为从服务器,同时将原本的从服务器切换为新的主服务器。这种切换可以用于实现高可用性和故障恢复。 下面是一个示例的MySQL主从切换过程: 1. 停止应用程序与MySQL数据库的连接,确保所有数据传输已完成并且没有未完成的事务。 2. 在原主服务器上执行FLUSH TABLES WITH READ LOCK语句,以保证在备份期间没有写操作。 3. 使用mysqldump或其他备份工具对原主服务器进行全量备份。可以使用以下命令执行备份: ``` mysqldump -u <username> -p<password> --all-databases --master-data > backup.sql ``` 4. 将备份文件传输到新主服务器上。 5. 在新主服务器上还原备份文件。可以使用以下命令执行还原: ``` mysql -u <username> -p<password> < backup.sql ``` 6. 在新主服务器上打开binlog功能,并获取新的binlog文件名和位置。 7. 在原从服务器上执行CHANGE MASTER TO语句,将新主服务器配置为新的主服务器。可以使用以下命令执行配置: ``` CHANGE MASTER TO MASTER_HOST='<new_master_host>', MASTER_USER='<replication_user>', MASTER_PASSWORD='<replication_password>', MASTER_LOG_FILE='<new_master_log_file>', MASTER_LOG_POS=<new_master_log_pos>; ``` 8. 在原从服务器上启动复制过程: ``` START SLAVE; ``` 9. 等待一段时间,确保复制过程正常运行。 10. 在应用程序中更新连接配置,将主服务器地址改为新的主服务器。 11. 恢复原主服务器的正常操作,可以将其配置为新的从服务器或者禁用复制功能。 这是一个简单的MySQL主从切换过程示例,实际操作中可能会根据具体需求和环境进行调整。在进行主从切换前,建议先进行充分的备份并测试整个过程,以确保数据的完整性和可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值