当前位置: 首页 > news >正文

【Day 35】Linux-主从复制的维护

一、主、从库故障

(一) 从库宕机恢复机制

从库重启后会自动读取复制信息并连接主库继续同步:

  • >SELECT * FROM slave_master_info\G;         // 查看主库连接信息
  • >SELECT * FROM slave_relay_log_info\G;      // 查看中继日志信息

(二)主从复制故障处理

1、 IO 线程故障排查

示例 1:Access denied for user 'repl'@'从库IP' → 主库给从库的复制账号密码错误,需重新在主库授权并更新从库配置。

SELECT user, host, replication_slave_priv FROM mysql.user WHERE user = 'repl';

  • CREATE USER 'repl'@'从库IP' IDENTIFIED BY '你的密码';
  • GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP';
  • FLUSH PRIVILEGES;

SHOW SLAVE STATUS\G       //确认Master_User是 'repl',Master_Host是主库 IP,且密码正确。

  • STOP SLAVE;
  • CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='你的密码', MASTER_LOG_FILE='主库当前日志文件', MASTER_LOG_POS=主库当前日志位置; START SLAVE;

示例 2:Can't connect to MySQL server on '主库IP' (113) → 主从网络不通,检查防火墙、主库绑定地址(bind-address 是否允许从库访问)。

① ping 主库ip

② 防火墙:二选其一

③ traceroute 主库IP     //检查网络路由

④ 验证主库 MySQL 服务状态

  • systemctl status mysql   // 检查服务状态
  • netstat -tulpn | grep 3306    //确认MySQL监听地址,确保 MySQL 监听所有地址(0.0.0.0)

⑤ grep bind-address /etc/my.cnf     //bind-address = 0.0.0.0,并重启

检查 SELinux 设置

  • getenforce      //# 查看SELinux状态 ,
  • setenforce 0   //临时关闭,如果关闭后可以连接,需要配置 SELinux 允许 MySQL 网络连接

2、 SQL 线程故障排查

示例 1:Duplicate entry '123' for key 'PRIMARY' → 主从数据不一致,从库已有相同主键 / 唯一键的数据,与主库同步过来的记录冲突。可能是从库手动写入了数据,或主从数据初始不一致。需手动同步不一致的数据后重启复制。

  • STOP SLAVE SQL_THREAD;    //跳过当前错误(仅临时应急,生产慎用)
  • SET GLOBAL sql_slave_skip_counter = 1;      //跳过1个事务
  • START SLAVE SQL_THREAD;

示例 2:Table 'test.t1' doesn't exist → 主库有表 test.t1 但从库没有,需先在从库创建相同表结构。

  • SHOW CREATE TABLE 库名.表名;       //主库导出表结构
  • ALTER TABLE 库名.表名 ...;      //从库执行相同的表结构变更语句,与主库保持一致
  • START SLAVE SQL_THREAD;        //重启 SQL 线程

示例3:

二、主从角色切换

(一)常规

0、准备阶段:锁定原主库(防止数据写入)

  • FLUSH TABLES WITH READ LOCK    //在原主库执行 全局只读锁,禁止写入
  • SHOW MASTER STATUS;      //此时记录的 binlog 位置是旧主库的 “最终数据节点”

1、将原从库提升为新主库

① 确认从库数据与旧主库完全一致

  • >SHOW MASTER STATUS;
  • >SHOW SLAVE STATUS\G    //确认原从库数据完整性,此语句仅用于从库查询自身复制状态

        ①Seconds_Behind_Master = 0 ;        

        ②Relay_Master_Log_File 和 Read_Master_Log_Pos 与上文原主库执行结果一致。

② 停止复制并清除旧主库关联

  • >STOP SLAVE;     //停止复制线程
  • >RESET SLAVE ALL;      // 清除主服务器连接信息

    // 逻辑上应先切断与旧主库的关联,再确认自身的 binlog 位置。

③ 获取旧主库的binlog位置,作为新主库的binlog起点

  • SHOW MASTER STATUS;   //记录新主库 binlog 位置
  • // 新主库(原从库)停止复制并清除旧配置后,会以 “主库” 身份开始生成自己的 binlog(之前作为从库时可能未开启或使用不同的 binlog 序列)。此时记录的 binlog 位置是新主库的 “初始数据节点”(从这一刻起,新主库的写入会记录到自己的 binlog 中)。旧主库后续降为从库时,必须通过 CHANGE MASTER TO 指向这个位置,才能从新主库的最新状态开始同步(否则会同步旧数据或报错)。

修改只读配置,重启mysql

  • # sed -i '/read_only/d' /etc/my.cnf       //移除只读配置
  • # sed -i '/super_read_only/d' /etc/my.cnf
  • # sed -i 's/#log_bin/log_bin/' /etc/my.cnf      // 确保新主库开启binlog
  • # systemctl restart mysqld

检查

  • >SHOW VARIABLES LIKE 'read_only';    // 应显示OFF
  • >SHOW VARIABLES LIKE 'super_read_only'  // 应显示OFF
  • >SHOW VARIABLES LIKE 'log_bin';     //确认ON(binlog已开启)

2、切换业务连接到新主

    ① 修改应用配置指向新主库

    • # vim wp-config.php          //修改应用配置,修改为新主库

    ② 在新主库创建应用用户(与旧主库权限一致)

    • CREATE USER IF NOT EXISTS 'xxxxx'@'应用服务器IP' IDENTIFIED BY '密码';   
    • GRANT ALL ON blog.* TO 'xxxxx'@'应用服务器IP';
    • FLUSH PRIVILEGES;
    • //修改后测试应用是否能正常连接新主库,确保读写正常。

    3、原主库修复后作为从库连接新主

    ① 解锁原主库(若业务已完全切换,可解锁允许临时读取)

    • >UNLOCK TABLES

    ② 清理原主库的旧复制信息(若该 “原主库” 在当前主从架构调整前,曾经作为过 “从库” )

    • >STOP SLAVE;     //停止复制线程
    • >RESET SLAVE ALL;      // 清除旧的主从配置

    ③ 在新主库创建复制用户(若不存在)

    • CREATE USER IF NOT EXISTS 'xxx'@'原主库IP' IDENTIFIED WITH mysql_native_password BY '密码';   
    • GRANT REPLICATION SLAVE ON *.* TO 'xxx'@'原主库IP';
    • FLUSH PRIVILEGES;

    ④ 原主库配置同步新主库

            

            //注意,posotion是数字,(无需引号)

    4、在新从库上验证同步状态

    • >SHOW SLAVE STATUS\G 

            ① Slave_IO_Running = Yes

            ② Slave_SQL_Running = Yes

            ③ Seconds_Behind_Master = 0(无延迟)

      (二)主从切换(基于 GTID 的快速切换)

      1、在新主库(原从库)执行

      • STOP SLAVE;     //停止原复制线程
      • RESET SLAVE ALL;       //清除旧主库信息
      • SET GLOBAL read_only = OFF;     // 解除只读,允许业务写入
      • SET GLOBAL super_read_only = OFF;

      2、在其他从库(如原主库修复后)执行

      • >CHANGE MASTER TO MASTER_HOST = '新主库IP', MASTER_USER = '复制用户名', MASTER_PASSWORD = '密码', MASTER_AUTO_POSITION = 1;
      • >START SLAVE;

      http://www.xdnf.cn/news/1375165.html

      相关文章:

    • (LeetCode 面试经典 150 题 ) 637. 二叉树的层平均值(深度优先搜索dfs)
    • 亚马逊广告关键词排名提升的五大核心策略解析
    • java简单ssm(spring+springmvc+mybatis)框架结构demo
    • 大模型重构建筑“能耗基因“:企业如何用物联中台打响能源革命?
    • 手写MyBatis第36弹:MyBatis执行流程中SQL命令类型解析
    • 登录业务——密码重置与强制修改初始密码实现思路
    • 【微信小程序】分别解决H5的跨域代理问题 和小程序正常不需要代理问题
    • Coze用户账号设置修改用户名-后端源码
    • map|math
    • 腾讯位置商业授权微信小程序路线规划
    • 【开源工具】基于Flask与Socket.IO的跨平台屏幕监控系统实战(附完整源码)
    • 前端性能优化:从指标监控到全链路落地(2024最新实战指南)
    • 论文阅读:Gorilla: Large Language Model Connected with Massive APIs
    • 深度学习入门:神经网络基础知识
    • lesson47:Linux常用软件使用指南:远程连接、远程拷贝、Vim与Nginx
    • VESA时序检测模块设计verilog实现
    • Ubuntu 24 Server 如何设置无线网络
    • imx6ull-驱动开发篇45——Linux 下 SPI 驱动框架简介
    • d435i相机读取镜头内参和相对之间的外参
    • 艾体宝新闻 | 98%好评率!KnowBe4 连续5年蝉联第一,现开放免费钓鱼测试等你解锁
    • 内网应用如何实现外网访问?外地通过公网地址访问内网服务器的设置方法
    • 遗传算法:模拟自然选择的优化智慧
    • Spring Boot项目集成日志系统使用完整指南
    • 欧洲数字化养殖平台 Herdwatch 借力 Iceberg + StarRocks 提升分析能力
    • 嵌入式开发学习 C++:day01
    • 动态规划:硬币兑换(有趣)
    • LeetCode - 739. 每日温度
    • 线性回归原理推导与应用(十一):多重共线性
    • 获取服务器指标的信息
    • bin log 和 redo log有什么区别