MySQL主从切换:计划内与计划外切换的详细指南
在MySQL数据库的高可用架构中,主从复制是一种常见的技术手段。通过主从复制,可以实现数据的冗余备份、读写分离以及故障切换等功能。然而,当主库出现故障时,如何快速、安全地将从库切换为主库,是一个需要仔细规划和测试的过程。本文将详细介绍MySQL主从切换的两种场景:计划内切换和计划外切换,并提供相应的操作步骤。
一、计划内的主从切换
计划内的主从切换通常发生在系统维护、硬件升级等场景下。这种情况下,我们有充足的时间进行准备和测试,确保切换过程平稳进行。
1. 停止当前主库的写操作
在进行主从切换之前,首先需要停止主库的写操作,以确保数据的一致性。可以通过以下方式实现:
-
设置主库为只读模式:
SET GLOBAL read_only = ON;这将阻止所有写操作,但允许读操作继续。
-
使用
FLUSH TABLES WITH READ LOCK:FLUSH TABLES WITH READ LOCK;该命令会锁定所有表,阻止写操作,直到显式地解锁。
-
强制断开所有连接(生产环境慎用):
可以通过脚本强制断开所有连接到主库的会话:#!/bin/bash source ~/.bashrc rm -rf /tmp/kill.sql mysql -u root -p123456 -P3306 -h127.0.0.1 -e "select * into outfile '/tmp/kill.sql' from (select 'set global read_only=on;' union all select concat('kill ',id,';') from information_schema.processlist where command='sleep' ) t; " mysql -u root -p123456 -P3306 -h127.0.0.1 < /tmp/kill.sql
2. 选择一个从库作为新的主库
选择一个从库作为新的主库,并确保它已经完全同步了主库的数据。可以通过以下步骤确保数据一致性:
-
检查从库的同步状态:
SHOW SLAVE STATUS\G;确保
Seconds_Behind_Master为0,表示从库已经完全追上主库。 -
确保新主库和旧主库数据一致:
可以通过mysqldump导出数据并比较校验和:mysqldump -uroot --skip-dump-date | md5sum
3. 在新主库上停止复制并重置配置
在新主库上执行以下操作:
-
停止复制:
STOP SLAVE; -
重置复制配置:
RESET SLAVE ALL;这将断开新主库与旧主库的连接。
4. 记录新主库的二进制日志坐标
在新主库上执行以下命令,记录当前的二进制日志坐标:
SHOW MASTER STATUS;
记下File和Position的值,后续将从库指向新主库时需要用到。
5. 确保其他从库已经追上旧主库
确保所有从库都已经执行完从旧主库获得的中继日志。
6. 关闭旧主库
在确认所有从库都已经同步后,可以安全地关闭旧主库。
7. 在新主库上取消只读模式
如果需要,可以将新主库设置为可写模式:
SET GLOBAL read_only = OFF;
8. 配置其他从库指向新主库
在每个从库上执行以下命令,将其指向新的主库:
CHANGE MASTER TO
MASTER_HOST='new_master_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='File',
MASTER_LOG_POS=Position;
其中,File和Position是之前记录的二进制日志坐标。
9. 启动从库复制
在每个从库上启动复制:
START SLAVE;
10. 将客户端连接到新主库
最后,将应用程序的数据库连接指向新的主库。
二、计划外的主从切换
计划外的主从切换通常发生在主库突然崩溃或不可用的情况下。这种情况下,我们需要快速提升一个从库作为新的主库,并确保其他从库能够继续同步数据。
1. 让所有从库执行完中继日志
在主库崩溃后,首先需要确保所有从库都已经执行完从旧主库获得的中继日志。可以通过以下命令检查从库的同步状态:
SHOW SLAVE STATUS\G;
确保Seconds_Behind_Master为0。
2. 选择并设置新主库
选择一个从库作为新的主库,并确保它已经完全同步了旧主库的数据。
3. 查找其他从库最后执行的事件
在新主库上,查找其他从库最后执行的事件对应的二进制日志坐标。可以通过以下命令查看:
SHOW MASTER STATUS;
4. 配置其他从库指向新主库
在每个从库上执行以下命令,将其指向新的主库:
CHANGE MASTER TO
MASTER_HOST='new_master_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='File',
MASTER_LOG_POS=Position;
其中,File和Position是之前记录的二进制日志坐标。
5. 启动从库复制
在每个从库上启动复制:
START SLAVE;
6. 验证数据一致性
确保所有从库都已经成功连接到新主库,并且数据同步正常。
三、GTID主从切换
如果使用了GTID(全局事务标识符)进行主从复制,切换过程会更加简单。GTID确保了每个事务在复制拓扑中的唯一性,避免了手动查找二进制日志坐标的麻烦。
1. 停止当前主库的写操作
与普通主从切换相同,首先停止主库的写操作。
2. 选择一个从库作为新的主库
确保该从库已经完全同步了主库的数据。
3. 在新主库上停止复制并重置配置
STOP SLAVE;
RESET SLAVE ALL;
4. 配置其他从库指向新主库
在每个从库上执行以下命令:
CHANGE MASTER TO
MASTER_HOST='new_master_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_AUTO_POSITION=1;
MASTER_AUTO_POSITION=1表示使用GTID自动定位复制位置。
5. 启动从库复制
START SLAVE;
四、总结
MySQL主从切换是确保数据库高可用性的重要手段。无论是计划内还是计划外的切换,都需要仔细规划和测试,以确保数据的一致性和系统的稳定性。通过GTID复制,可以简化切换过程,减少人为错误的发生。在实际生产环境中,建议定期进行主从切换的演练,以确保在真正发生故障时能够快速、安全地完成切换。




