MST

星途 面试题库

面试题:MariaDB中master.info与relay - log.info文件损坏后,如何进行修复与恢复复制?

假设在MariaDB复制过程中,master.info与relay - log.info文件同时出现损坏情况,详细说明如何逐步排查、修复这些文件,并使复制功能恢复正常,需要考虑不同版本MariaDB的兼容性以及数据完整性。
43.6万 热度难度
数据库MariaDB

知识考点

AI 面试

面试题答案

一键面试
  1. 停止MariaDB服务
    • 在不同版本的MariaDB中,停止服务的命令基本类似。例如在基于systemd的系统(如CentOS 7+、Ubuntu 16.04+等):
      sudo systemctl stop mariadb
      
    • 在基于SysV init的系统(如CentOS 6等):
      sudo service mariadb stop
      
  2. 备份损坏文件
    • master.inforelay - log.info文件移动到一个备份目录,以防修复过程中出现问题导致数据丢失。假设备份目录为/var/lib/mysql/backup
      sudo mkdir -p /var/lib/mysql/backup
      sudo mv /var/lib/mysql/master.info /var/lib/mysql/backup/master.info.bak
      sudo mv /var/lib/mysql/relay - log.info /var/lib/mysql/backup/relay - log.info.bak
      
  3. 从备份或主库获取必要信息
    • 如果有备份
      • 检查备份中的master.inforelay - log.info文件,获取主库的连接信息(如主库IP、端口、用户名、密码)、主库日志文件名及位置、从库中继日志相关信息等。
    • 如果没有备份,从主库获取信息
      • 在主库上执行SHOW MASTER STATUS;,记录下FilePosition字段的值,这将用于重新配置从库连接主库的起始位置。例如:
        mysql -u root -p
        SHOW MASTER STATUS;
        
  4. 修复master.info文件
    • 文件格式master.info文件在不同版本MariaDB中格式基本固定,每行一个配置项。典型格式如:
      master_host=192.168.1.100
      master_user=repl_user
      master_password=repl_password
      master_log_file=mysql - bin.000001
      master_log_pos=1234
      
    • 根据从备份或主库获取的信息,重新创建master.info文件。假设主库IP为192.168.1.100,复制用户为repl_user,密码为repl_password,主库日志文件为mysql - bin.000001,位置为1234
      sudo touch /var/lib/mysql/master.info
      sudo chown mysql:mysql /var/lib/mysql/master.info
      sudo chmod 600 /var/lib/mysql/master.info
      echo "master_host=192.168.1.100" | sudo tee -a /var/lib/mysql/master.info
      echo "master_user=repl_user" | sudo tee -a /var/lib/mysql/master.info
      echo "master_password=repl_password" | sudo tee -a /var/lib/mysql/master.info
      echo "master_log_file=mysql - bin.000001" | sudo tee -a /var/lib/mysql/master.info
      echo "master_log_pos=1234" | sudo tee -a /var/lib/mysql/master.info
      
  5. 修复relay - log.info文件
    • 文件格式relay - log.info文件记录从库中继日志相关信息,格式也较为固定,每行一个配置项。例如:
      relay_log_name=/var/lib/mysql/relay - log.000001
      relay_log_pos=5678
      master_log_name=mysql - bin.000001
      master_log_pos=1234
      
    • 根据备份信息或主库获取的信息以及从库当前状态,重新创建relay - log.info文件。假设从库中继日志名为/var/lib/mysql/relay - log.000001,中继日志位置为5678,主库日志文件及位置同上述master.info文件配置:
      sudo touch /var/lib/mysql/relay - log.info
      sudo chown mysql:mysql /var/lib/mysql/relay - log.info
      sudo chmod 600 /var/lib/mysql/relay - log.info
      echo "relay_log_name=/var/lib/mysql/relay - log.000001" | sudo tee -a /var/lib/mysql/relay - log.info
      echo "relay_log_pos=5678" | sudo tee -a /var/lib/mysql/relay - log.info
      echo "master_log_name=mysql - bin.000001" | sudo tee -a /var/lib/mysql/relay - log.info
      echo "master_log_pos=1234" | sudo tee -a /var/lib/mysql/relay - log.info
      
  6. 清理中继日志(可选但推荐)
    • 在重新配置复制前,建议清理从库现有的中继日志,避免可能的冲突。可以使用PURGE RELAY LOGS语句,但要注意不要误删除重要数据。
      mysql -u root -p
      RESET SLAVE;
      
  7. 启动MariaDB服务并重新配置复制
    • 启动MariaDB服务:
      • 在基于systemd的系统:
        sudo systemctl start mariadb
        
      • 在基于SysV init的系统:
        sudo service mariadb start
        
    • 登录到从库的MariaDB,重新配置复制:
      mysql -u root -p
      CHANGE MASTER TO
          MASTER_HOST='192.168.1.100',
          MASTER_USER='repl_user',
          MASTER_PASSWORD='repl_password',
          MASTER_LOG_FILE='mysql - bin.000001',
          MASTER_LOG_POS=1234;
      START SLAVE;
      
  8. 检查复制状态
    • 执行SHOW SLAVE STATUS \G;检查复制是否正常工作。关注以下关键字段:
      • Slave_IO_RunningSlave_SQL_Running都应该为Yes
      • Seconds_Behind_Master应该为0或者一个较小的值(表示从库落后主库的时间,在正常同步情况下不应过大)。
      SHOW SLAVE STATUS \G;
      

以上步骤可以在不同版本的MariaDB中通用,但要注意具体路径、命令语法等可能因操作系统和MariaDB版本略有差异,操作前最好查阅对应版本的官方文档进行确认。