温馨提示×

Ubuntu上MariaDB故障排查技巧

小樊
32
2025-12-26 10:49:04
栏目: 云计算

Ubuntu 上 MariaDB 故障排查技巧

一 快速定位与日志检查

  • 查看服务状态与系统日志,优先关注关键词:failed、error、InnoDB、Access denied、DENIED
    • 命令示例:
      • 查看服务状态:sudo systemctl status mariadb
      • 查看详细日志:sudo journalctl -u mariadb -xe
      • 按时间过滤:sudo journalctl -u mariadb --since "2025-12-26 10:00:00" --until "2025-12-26 12:00:00"
  • 定位 MariaDB 错误日志与查询日志(若启用),常见路径:
    • 错误日志:/var/log/mariadb/error.log/var/log/mysql/error.log
    • 查询日志:/var/log/mariadb/mariadb.log(可能未启用)
    • 快速筛选:sudo grep -i "failed\|access denied" /var/log/mariadb/error.log
  • 若日志目录或文件缺失,先创建并修正属主属组(常见为 mysql:mysql),再重启服务。

二 服务无法启动的高频原因与修复

  • 目录与权限问题
    • 常见缺失目录:/var/log/mariadb//var/run/mysqld//var/lib/mysql/
    • 修复示例:
      • sudo mkdir -p /var/log/mariadb/ && sudo chown -R mysql:mysql /var/log/mariadb/
      • sudo mkdir -p /var/run/mysqld/ && sudo chown -R mysql:mysql /var/run/mysqld/
      • 数据目录为空后再初始化:sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql/ --force
      • 修正数据目录属主:sudo chown -R mysql:mysql /var/lib/mysql/
  • AppArmor 拒绝访问
    • 现象:日志出现 apparmor=“DENIED”
    • 处置思路:
      • 查看状态:sudo aa-status
      • 临时切为投诉模式:sudo aa-complain /usr/sbin/mysqld
      • 或按需调整策略(例如在 /etc/apparmor.d/usr.sbin.mysqld 为新的 datadir 增加读写执行权限),然后 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld 重载。
  • InnoDB 日志损坏导致无法启动
    • 现象:InnoDB 启动报错并提示 Corrupted file-level record,建议设置 innodb_force_recovery
    • 处置思路(只读导出优先):
      • 在配置 [mysqld] 中设置 innodb_force_recovery=1(从 1 开始逐步尝试,最高到 6),启动后尽快 mysqldump 全量备份,随后重建实例并恢复数据。
  • 安装/升级后启动失败且 ExecStartPost 报错
    • 现象:Process: ... ExecStartPost=/etc/mysql/debian-start (code=exited, status=2
    • 处置思路:从对应版本的 MariaDB 包中解压并恢复缺失的 /etc/mysql/debian-start 脚本,再启动服务。

三 连接与认证类错误的排查

  • 本地无法连接(socket 报错)
    • 现象:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket …
    • 排查要点:
      • 确认服务已启动:sudo systemctl is-active mariadb
      • 确认 socket 路径一致:ps -ef | grep mysqld 与客户端 --socket= 参数或 my.cnf 中的 socket 配置保持一致。
      • 若路径不一致,可创建软链(示例):ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
  • 远程连接被拒绝
    • 现象:ERROR 1130 (HY000): Host ‘x.x.x.x’ is not allowed to connect
    • 处置要点:
      • 防火墙放行 3306/tcp(UFW 示例):sudo ufw allow from x.x.x.x to any port 3306/tcp
      • 确认监听地址:在 /etc/mysql/mariadb.conf.d/50-server.cnfbind-address 设为 0.0.0.0(或指定内网接口),然后 sudo systemctl restart mariadb
      • 授权用户远程访问(按需最小化授权):
        • GRANT ALL PRIVILEGES ON db.* TO 'user'@'x.x.x.x' IDENTIFIED BY 'strong_password';
        • FLUSH PRIVILEGES;
  • 客户端连接被拒或超时
    • 现象:如 10061 类错误,常见于服务未运行、端口不对、仅本地监听或未放行防火墙。
    • 处置要点:确认服务运行、端口为 3306、监听地址与防火墙策略正确。

四 维护与恢复的安全操作建议

  • 变更前先备份配置与数据目录(例如:/etc/mysql//var/lib/mysql/),变更后逐步重启并观察日志。
  • 需要临时进入实例进行修复时,优先使用 --skip-grant-tables(无密码模式)或设置 innodb_force_recovery 只读导出,完成数据抢救后再重建实例与权限。
  • 远程授权遵循最小权限原则,避免使用 ‘%’ 与过宽权限;公网环境务必配合 TLS/SSL 与强口令策略。
  • 生产环境不建议直接禁用 AppArmor;应通过策略细化(路径、权限、能力)来解决问题。

0