温馨提示×

Debian MariaDB故障排查技巧

小樊
32
2025-12-19 02:26:44
栏目: 云计算

Debian MariaDB故障排查技巧

一 快速定位与日志获取

  • 查看服务状态与最近错误:
    • 执行:systemctl status mariadb,关注 Active、Main PID、ExecStartPost 等行。
    • 执行:journalctl -u mariadb -xe,按时间定位首次报错位置。
  • 定位 MariaDB 错误日志:
    • 常见路径:/var/log/mariadb/error.log/var/log/mysql/error.log
    • 若自定义了配置,可在 /etc/my.cnf/etc/mysql/my.cnf[mysqld] 段查看 log_error 项。
  • 日志快速筛选:
    • 查看尾部:tail -n 50 /var/log/mariadb/error.log
    • 关键词:grep -i “failed|error|access denied” /var/log/mariadb/error.log
    • 时间段:journalctl -u mariadb --since “2025-12-19 10:00:00” --until “2025-12-19 12:00:00”

二 常见故障与修复

  • 无法启动且提示 “ExecStartPost=/etc/mysql/debian-start … code=exited, status=2/203”

    • 现象:安装或升级后 debian-start 脚本缺失或被误删,导致启动脚本退出异常。
    • 修复:
      • 检查是否存在 /etc/mysql/debian-start/etc/mysql/debian-start.dpkg-dist,若存在后者可重命名为前者。
      • 若均不存在,从对应版本的 mariadb-server-*.deb 包中提取:
        • 下载:apt download mariadb-server-<版本>
        • 解压:dpkg-deb --extract mariadb-server-<版本>.deb /tmp/mariadb
        • 复制:cp /tmp/mariadb/etc/mysql/debian-start /etc/mysql/
      • 重启:systemctl start mariadb
  • dpkg 配置失败:update-alternatives: alternative path /etc/mysql/mariadb.cnf doesn’t exist

    • 现象:安装 mariadb-common 时因缺失配置文件导致 dpkg 中断。
    • 修复:
      • 建立占位文件:sudo mkdir -p /etc/mysql && sudo touch /etc/mysql/mariadb.cnf
      • 继续配置:sudo dpkg --configure -a
      • 必要时修复依赖:sudo apt-get install -f
      • 仍异常时可选清理重装相关包。
  • 目录缺失导致启动失败(如 /var/log/mariadb 不存在)

    • 现象:日志目录缺失或权限不当,服务启动自检失败。
    • 修复:
      • 创建目录并设权:sudo mkdir -p /var/log/mariadb && sudo chown mysql:mysql /var/log/mariadb
      • 重启:systemctl restart mariadb
  • InnoDB 日志损坏或异常导致无法启动

    • 现象:错误日志含 InnoDB: Corrupted file-level record / Plugin ‘InnoDB’ init function returned error
    • 修复(只读导出优先):
      • 编辑配置 /etc/mysql/mariadb.conf.d/50-server.cnf(或 /etc/my.cnf.d/server.cnf),在 [mysdb] 加入:
        • innodb_force_recovery=1(从 1 开始逐步尝试,最高到 6;达到可启动即停)
      • 重启后立刻逻辑备份:mysqldump -A --single-transaction --routines --triggers --hex-blob > backup.sql
      • 备份完成,移除 innodb_force_recovery 并正常重启;如仍失败,用备份重建实例。
  • 套接字连接失败 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket

    • 现象:服务未运行或 socket 路径不一致。
    • 排查:
      • 确认运行状态:systemctl is-active mariadb
      • 查看 /etc/mysql/my.cnf[mysqld] socket 与客户端 [client] socket 是否一致
      • 检查目录与权限:ls -ld /var/run/mysqld && sudo systemctl restart mariadb
      • 临时直连测试:mysql -u root -p -h 127.0.0.1 --protocol=tcp(绕开 socket)。

三 安全加固与远程访问

  • 首次加固:
    • 执行:sudo mysql_secure_installation,设置 root 密码、移除匿名用户、禁止远程 root 登录、删除测试库。
  • 启用远程访问(按需):
    • 编辑:sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
    • 设置:bind-address = 0.0.0.0(或指定内网网段)
    • 重启:sudo systemctl restart mariadb
    • 授权示例(仅示例,生产环境请使用强密码与最小权限):
      • GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ IDENTIFIED BY ‘YourStrongPassword’ WITH GRANT OPTION;
      • FLUSH PRIVILEGES;

四 主从复制场景的排查要点

  • 提升从库为主库:
    • 选择复制最接近主的从库(比较 Exec_Master_Log_Posrelay-log.info 位置)。
    • 在候选从库启用二进制日志:server-id=唯一值;log-bin,重启。
    • 其他从库执行:STOP SLAVE; RESET SLAVE ALL;CHANGE MASTER TO … 指向新主,最后 START SLAVE; 检查 Slave_IO_Running/Slave_SQL_Running=YES
  • 复制中断跳过错误(谨慎):
    • 临时跳过单个事件:STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
    • 批量跳过特定错误码:在配置加入 slave_skip_errors=1007(静态变量,需重启)。

五 最小化排查清单

  • 服务状态:systemctl status mariadb;实时日志:journalctl -u mariadb -f
  • 错误日志:/var/log/mariadb/error.log/var/log/mysql/error.log
  • 配置核对:/etc/mysql/my.cnf/etc/mysql/mariadb.conf.d/*.cnfdatadir、socket、log_error、bind-address
  • 目录与权限:/var/lib/mysql(属主 mysql:mysql)、/var/run/mysqld/var/log/mariadb
  • 套接字与端口:本地用 mysql -h 127.0.0.1 --protocol=tcp 测试;远程用 telnet 主机 3306
  • 强制恢复:仅在备份优先前提下用 innodb_force_recovery=1→6 逐级尝试并尽快导出数据

注意:涉及数据删除、强制恢复与权限变更的操作存在数据丢失与安全风险,务必先做好完整备份,并在非生产环境验证后再实施。

0