MST

星途 面试题库

面试题:MariaDB主从复制常见问题排查

假设你负责维护一个MariaDB主从复制架构,从库出现数据同步延迟,且偶尔会出现复制中断的情况。请详细描述你会采取哪些步骤来排查和解决这些问题,包括涉及到的关键参数和命令。
48.3万 热度难度
数据库MariaDB

知识考点

AI 面试

面试题答案

一键面试
  1. 查看从库状态
    • 使用命令 SHOW SLAVE STATUS \G。此命令可以获取从库复制的详细状态信息,关键参数如下:
      • Seconds_Behind_Master:表示从库延迟主库的秒数,若数值较大,说明存在明显延迟。
      • Slave_IO_RunningSlave_SQL_Running:这两个参数应该都为 Yes,若其中一个为 No,表示对应的线程出现问题,可能是复制中断的原因。
  2. 网络问题排查
    • 检查主从服务器之间的网络连接,可以使用 ping 命令测试网络连通性和延迟。如果网络不稳定,可能导致数据传输延迟或中断。
    • 查看防火墙设置,确保主从服务器之间用于数据库复制的端口(默认为3306)是开放的。在Linux系统中,可以使用 iptables -L 命令查看防火墙规则,必要时使用 iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 等命令开放端口。
  3. 主库负载排查
    • 在主库上使用 SHOW STATUS LIKE 'Threads_connected'; 查看当前连接数,连接数过高可能导致主库处理事务缓慢,间接影响从库同步。
    • 使用 SHOW FULL PROCESSLIST; 查看主库上正在执行的线程,若存在长时间运行的事务,可能是导致主库性能问题的原因,可考虑优化或终止这些事务。
  4. 从库负载排查
    • 在从库上使用 top 命令查看系统资源使用情况,如CPU、内存、磁盘I/O等。如果从库负载过高,可能无法及时处理主库发送过来的二进制日志。
    • 查看从库磁盘空间是否充足,可使用 df -h 命令。若磁盘空间不足,可能导致从库写入中继日志失败,进而导致复制中断。
  5. 中继日志相关排查
    • 查看从库中继日志的状态,关键参数 Relay_Log_SpaceSHOW SLAVE STATUS \G 输出中,若中继日志空间增长异常,可能是从库应用中继日志缓慢。
    • 可以尝试清理过期的中继日志,在从库上使用 PURGE BINARY LOGS BEFORE '2024 - 01 - 01 00:00:00'; (这里时间为示例,需根据实际情况调整),此命令会删除指定时间之前的二进制日志和中继日志,但要确保从库已经完全应用了这些日志。
  6. 主从复制配置参数排查
    • 主库上检查 log - bin 参数是否正确配置,确保二进制日志功能开启,一般在 my.cnf 配置文件中添加或确认 log - bin = /var/lib/mysql/mysql - bin (路径可根据实际情况调整)。
    • 从库上检查 server - id 参数,确保每个从库有唯一的 server - id,如在 my.cnf 中设置 server - id = 2 (不同从库 server - id 不同)。
    • 还可以考虑调整 sync - binlog 参数,它控制二进制日志刷新到磁盘的频率,若设置为1,每次事务都会刷新,安全性高但性能可能受影响,可根据实际情况调整,如设置为0(由操作系统控制刷新)或较大数值(如1000)。
  7. 解决复制中断问题
    • 如果 Slave_IO_RunningNo,可能是网络或主库连接相关问题,检查网络和主库配置后,在从库上使用 STOP SLAVE; 停止复制,然后使用 CHANGE MASTER TO 命令重新配置主库连接信息,例如:
      CHANGE MASTER TO
      MASTER_HOST='主库IP',
      MASTER_USER='复制用户',
      MASTER_PASSWORD='复制密码',
      MASTER_LOG_FILE='主库二进制日志文件名',
      MASTER_LOG_POS=主库二进制日志位置;
      
      配置完成后使用 START SLAVE; 重新启动复制。
    • 如果 Slave_SQL_RunningNo,可能是从库应用中继日志出现错误,查看 Last_SQL_Error 参数获取错误信息。常见错误如主从库表结构不一致等,根据错误信息修复问题后,在从库上使用 STOP SLAVE;,然后使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; 跳过当前导致错误的事务(谨慎使用,可能丢失数据一致性),最后使用 START SLAVE; 重新启动复制。