一、基础状态检查
服务状态核查
使用systemctl命令确认MariaDB服务是否正在运行,若未运行则尝试启动并观察报错:
sudo systemctl status mariadb # 查看服务状态
sudo systemctl start mariadb # 启动服务(若未运行)
若启动失败,需结合后续日志分析具体原因。
错误日志分析
MariaDB的错误日志是故障排查的核心依据,通常位于/var/log/mysql/error.log(Ubuntu/Debian)或/var/log/mariadb/mariadb.log(CentOS/RHEL)。使用以下命令查看最新错误信息:
sudo tail -n 50 /var/log/mysql/error.log # Ubuntu/Debian
sudo tail -n 50 /var/log/mariadb/mariadb.log # CentOS/RHEL
日志中常见内容包括配置文件语法错误、权限不足、端口冲突、数据目录损坏等。
二、常见故障类型及解决方案
服务无法启动
/var/lib/mysql)必须属于mysql:mysql用户组,且权限为755。修复命令:sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql
/etc/mysql/my.cnf或/etc/mysql/mariadb.conf.d/*.cnf(如50-server.cnf),确保bind-address(绑定IP)、port(端口,默认3306)、datadir(数据目录)等配置项正确。修改后需重启服务:sudo systemctl restart mariadb
netstat或ss命令检查3306端口是否被占用:sudo netstat -tulnp | grep 3306 # 或 ss -tulnp | grep 3306
若端口被占用,需停止冲突进程或修改MariaDB的port配置。无法连接数据库
/var/run/mysqld/mysqld.sock)是否存在。若不存在,可创建符号链接指向正确路径:sudo ln -s /var/lib/mysql/mysql.sock /var/run/mysqld/mysqld.sock
bind-address配置为0.0.0.0(允许所有IP连接)或服务器实际IP(仅允许特定IP连接);ufw为例):sudo ufw allow 3306/tcp
sudo ufw reload
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;
unix_socket认证,若需用密码登录,需修改用户认证插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword';
FLUSH PRIVILEGES;
磁盘空间不足
使用df -h命令检查磁盘空间,若Use%接近100%,需清理日志、临时文件或扩容磁盘:
df -h # 查看磁盘空间使用情况
sudo du -sh /var/log/* # 查找大日志文件
sudo rm -rf /var/log/*.gz # 清理压缩的旧日志(谨慎操作)
性能瓶颈排查
top或htop查看MariaDB进程的CPU、内存占用:top -p $(pgrep -f mariadb) # 实时查看MariaDB进程资源使用
htop -p $(pgrep -f mariadb) # 更直观的监控界面(需安装htop)
SHOW STATUS;:查看服务器状态变量(如连接数、查询次数、缓冲池命中率);SHOW PROCESSLIST;:查看当前执行的查询,识别慢查询或锁等待;mysqladmin:快速获取服务器状态(如Uptime、Threads、Questions):mysqladmin -u root -p status
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
三、进阶排查技巧
配置文件验证
使用mysqld命令验证配置文件的正确性(不会启动服务):
sudo mysqld --validate-config --user=mysql
若配置文件有语法错误,命令会输出具体错误信息。
跳过权限启动(重置密码或修复权限)
若无法正常启动且需重置root密码,可使用--skip-grant-tables参数跳过权限检查:
sudo mysqld_safe --skip-grant-tables & # 启动MariaDB并跳过权限
mysql -u root # 无需密码登录
登录后执行密码重置(以MariaDB 10.4+为例):
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
exit;
重启服务恢复正常模式:
sudo systemctl restart mariadb
AppArmor/SELinux问题
若系统启用了AppArmor(Ubuntu)或SELinux(CentOS),可能会阻止MariaDB访问某些文件或端口。
sudo aa-disable /etc/apparmor.d/usr.sbin.mysqld
sudo systemctl restart mariadb
sudo setenforce 0 # 临时关闭SELinux
sudo restorecon -Rv /var/lib/mysql # 恢复MariaDB数据目录的SELinux上下文
通过以上步骤,可覆盖MariaDB在Linux环境下的常见故障场景。若问题仍未解决,建议结合错误日志中的具体信息查阅MariaDB官方文档或社区论坛。