甲方公司意外停电,所有服务器重启后,发现部署在Linux上的mysql数据库启动失败.再加上老员工离职,新接手项目,对Linux系统了解不多,解决起来用时较多,特此记录。
1.启动及报错
1.1 启动语句1
启动语句1:service mysqld restart
报错1.Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
1.2启动语句2
启动语句2 service mysql start
报错2.Failed to restart mysqld.service: Unit not found
2.解决方案
2.1解决方案1
解决方案1:检查配置文件 cd /etc/ cat my.cnf
没有发现问题
2.2 解决方案2
解决方案2:备份数据库,重装mysql mysqldump -u 用户名 -p 密码 数据库名 > 备份文件名.sql
报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
但是查看已有备份文件
但是查看大小为0
2.3 解决方案3
开始搜到了此篇文章:https://www.cnblogs.com/ruiy/p/17610612.html
遇到的情况很类似,但查看日志,发现报错信息不同;
查看最近日志 sudo tail -n 100 /var/log/mysqld.log
定位到问题:Can’t start server: Bind on TCP/IP port: Permission denied
查找资料,发现此错误通常是因为 MySQL 或其他服务尝试绑定到 TCP/IP 端口时缺乏必要的权限
解决办法如下:
遇到 “Can’t start server: Bind on TCP/IP port: Permission denied” 错误,通常是因为 MySQL 或其他服务尝试绑定到 TCP/IP 端口时缺乏必要的权限。以下是一些常见的解决方法:
解决方法
检查端口使用情况: 使用以下命令检查端口是否已被其他进程占用(例如,MySQL 默认使用 3306 端口):
bash sudo netstat -tuln | grep 3306
使用超级用户权限启动服务: 如果你不是以 root 用户身份运行 MySQL,可以尝试使用
sudo
启动服务:bash sudo systemctl start mysql
或者:bash sudo service mysql start
检查 MySQL 配置文件: 确保 MySQL 的配置文件(通常是
/etc/my.cnf
或/etc/mysql/my.cnf
)中指定的端口和绑定地址是正确的。例如:ini [mysqld] bind-address = 127.0.0.1 port = 3306
检查 SELinux 设置: 如果你的系统启用了 SELinux,可能会阻止 MySQL 绑定端口。可以暂时禁用 SELinux 来检查是否是这个原因:
bash sudo setenforce 0
如果这样解决了问题,建议调整 SELinux 策略,而不是永久禁用。检查防火墙设置: 确保防火墙没有阻止 MySQL 的端口(默认是 3306),你可以使用以下命令来检查防火墙规则:
bash sudo iptables -L
或者,如果使用firewalld
:bash sudo firewall-cmd --list-all
更改 MySQL 数据目录权限: 如果 MySQL 需要访问特定目录(如数据目录),确保该目录的权限和拥有者是正确的:
bash sudo chown -R mysql:mysql /var/lib/mysql
重启 MySQL 服务 在进行上述修改后,不要忘记重启 MySQL 服务以应用更改:
bash sudo systemctl restart mysql
或:bash sudo service mysql restart
如果问题仍然存在,请查看 MySQL 的错误日志(通常位于
/var/log/mysql/error.log
或
/var/lib/mysql/hostname.err
),以获取更多信息。
3.问题解决
在检查到第5条时
执行 sudo setenforce 0
问题解决!
使用 sudo cat /var/log/audit/audit.log | grep denied
查看拒绝日志,果然看到将数据库端口限制了
在了解SELinux后,明白了必要性
SELinux共有三种模式:
- Disabled模式:SELinux被关闭,不执行任何安全策略。
- Permissive模式:SELinux被启用,但不强制执行安全策略。违反策略的操作会被记录,但不会被阻止。
- Enforcing模式:SELinux被启用,并强制执行所有安全策略。违反策略的操作会被拒绝并记录日志。
每种模式的特点和用途
- Disabled模式:适用于开发和测试阶段,可以避免SELinux的干扰,方便进行系统调试和开发。
- Permissive模式:适用于测试阶段,可以帮助管理员发现违反策略的操作,而不会中断系统的正常运行。
- Enforcing模式:适用于生产环境,确保系统的安全性,对违反策略的操作进行严格的控制和记录。
临时修改,使用setenforce 命令。一般调试的时候用的多
- setenforce 0 //设置为Permissive宽容模式
- setenforce 1 //设置为Enforcing强制模式
这里,暂时采用了临时修改的方式,启动前修改为宽容模式,启动成功后,修改为强制模式