暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

mysql 主从切换

原创 www 2025-01-11
1156

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;

记下FilePosition的值,后续将从库指向新主库时需要用到。

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;

其中,FilePosition是之前记录的二进制日志坐标。

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;

其中,FilePosition是之前记录的二进制日志坐标。

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复制,可以简化切换过程,减少人为错误的发生。在实际生产环境中,建议定期进行主从切换的演练,以确保在真正发生故障时能够快速、安全地完成切换。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论