当 MySQL 服务无法启动时,通常是由于配置错误、端口占用、权限问题或数据损坏等原因导致的。可以按照以下步骤排查和解决:
MySQL 启动失败时,会在日志中记录具体原因,首先查看日志定位问题:
sudo cat /var/log/mysqld.log
sudo cat /var/log/mysql/error.log
sudo grep "log-error" /etc/my.cnf
日志中可能出现 Can't start server: Bind on TCP/IP port: Address already in use
解决:
-
查看占用 3306 端口的进程:
sudo netstat -tulpn | grep 3306
-
终止占用进程(替换 PID 为实际值):
-
若频繁被占用,可修改 MySQL 端口(在
my.cnf
中添加 port=3307
,重启服务)。
日志中可能出现 Permission denied
或 Can't create/write to file
解决:
-
确保 MySQL 数据目录和日志目录权限正确(所有者为
mysql
用户):
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql
日志中可能出现 InnoDB: Database page corruption on disk or a failed
解决:
-
尝试修复 InnoDB 表(需谨慎操作,建议先备份数据):
-
停止服务:
sudo systemctl stop mysqld
-
在
my.cnf
中添加修复配置:
[mysqld]
innodb_force_recovery = 1 # 从 1 到 6 逐步尝试,数字越大修复力度越强
-
启动服务:
sudo systemctl start mysqld
-
导出数据后重建表,修复完成后删除
innodb_force_recovery
配置。
日志中可能出现 Unknown variable
或 mysqld: [ERROR] Found option without preceding group
解决:
-
检查
my.cnf
配置文件是否有语法错误(如拼写错误、参数位置错误):
mysqld --verbose --help | grep -A 1 "Default options"
-
注释或删除错误配置,重启服务。
日志中可能出现 Out of memory
或 Cannot allocate memory for the buffer pool
解决:
-
检查系统内存使用:
free -m
-
若内存不足,可减少 MySQL 缓存配置(如
innodb_buffer_pool_size
),或升级服务器内存。
若以上方法无效,可尝试重置 MySQL(会删除所有数据,谨慎操作!):
sudo systemctl stop mysqld
sudo cp -r /var/lib/mysql /var/lib/mysql_backup
sudo rm -rf /var/lib/mysql/*
sudo mysqld --initialize --user=mysql
sudo systemctl start mysqld
sudo grep 'temporary password' /var/log/mysqld.log
-
确保 SELinux 或 AppArmor 未阻止 MySQL 运行(可临时关闭测试:
sudo setenforce 0
)。
-
若使用自定义编译或第三方源安装,检查是否缺少依赖(如
libaio
):
sudo yum install libaio
sudo apt install libaio1
根据错误日志的具体信息,针对性解决即可。