Ubuntu上MariaDB故障排查技巧
导读:Ubuntu 上 MariaDB 故障排查技巧 一 快速定位与日志检查 查看服务状态与系统日志,优先关注关键词:failed、error、InnoDB、Access denied、DENIED。 命令示例: 查看服务状态:sudo s...
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.cnf将bind-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;
- 防火墙放行 3306/tcp(UFW 示例):
- 客户端连接被拒或超时
- 现象:如 10061 类错误,常见于服务未运行、端口不对、仅本地监听或未放行防火墙。
- 处置要点:确认服务运行、端口为 3306、监听地址与防火墙策略正确。
四 维护与恢复的安全操作建议
- 变更前先备份配置与数据目录(例如:/etc/mysql/、/var/lib/mysql/),变更后逐步重启并观察日志。
- 需要临时进入实例进行修复时,优先使用
--skip-grant-tables(无密码模式)或设置innodb_force_recovery只读导出,完成数据抢救后再重建实例与权限。 - 远程授权遵循最小权限原则,避免使用 ‘%’ 与过宽权限;公网环境务必配合 TLS/SSL 与强口令策略。
- 生产环境不建议直接禁用 AppArmor;应通过策略细化(路径、权限、能力)来解决问题。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu上MariaDB故障排查技巧
本文地址: https://pptw.com/jishu/782339.html
