预先声明:我基本是小白状态,刚刚开始折腾,如有问题还请多多指教,望以下内容或许能为您解决问题提供参考
我用一台小米6X通过Linux deploy实现Ubuntu 18.04的安装,安装了宝塔面板,在启动MySQL5.7.44的时候遇到了报错无法启动的问题,在此我尝试了如下三种办法最终解决了问题:
- 开放3306端口
- 更改MySQL目录的所属用户
- 下载官方提供的检查脚本,并检查,上网搜索发现“网络权限不足”的说法并成功解决
其中,前两个方法受宝塔面板Mysql无法正常启动的解决方法 - Linux面板 - 宝塔面板论坛 (bt.cn)与宝塔面板Mysql 5.6版本无法正常启动的解决方法-腾讯云开发者社区-腾讯云 (tencent.com)二文启发
开放3306端口
这里由于我是Linux deploy实现的Linux,正常通过宝塔面板的“安全”页开放端口会遇到无法打开防火墙的问题,事实上用终端打开也是这样的问题。
宝塔面板的报错我没有仔细看,但是在终端里的报错是Running in chroot, ignoring request.
,最终我的解决方法是使用servicectl开启firewalld.service
这里我遇到很多问题但在此不多赘述(主要是servicectl各种报错),如果大家遇不到这些问题,那么可以正常遵循参考文章:解决chroot运行的系统无法使用systemd服务 - 兮陌 (simaek.com)
最终,在终端里打开了firewall之后,再在宝塔面板的“安全”页中添加3306端口
(我输入servicectl start firewalld
后终端会卡住,cmd和powershell在ssh连接下都是,但是此时另开一个终端并用firewall-cmd --state
命令检查,显示running,即firewall正在运行,若是终止servicectl start firewalld
firewall会停止运行,我还没找到解决方法,不过虽然之后防火墙会下线,但是再次正常开启也是可以的,并且防火墙下线不会影响已经成功启动的MySQL)
虽然但是,我开放3306端口后并没有解决问题
更改MySQL的所有用户
这个参考之前的两篇文章就行,我是完全按照文章的操作执行的:宝塔面板Mysql无法正常启动的解决方法 - Linux面板 - 宝塔面板论坛 (bt.cn)与宝塔面板Mysql 5.6版本无法正常启动的解决方法-腾讯云开发者社区-腾讯云 (tencent.com)
完成以上操作仍没有解决问题
脚本检查并发现问题
具体使用检查脚本的方法在开头提到的两篇文章里,并注意:
复制文章里的代码时候,我是遇到了sh: sql-repair.shwget: No such file or directory
的报错,不过无妨,把sh的那段命令重新敲一遍就好了(不过我也不知道为什么我这里脚本文件运行一遍就没了)
不同于两篇文章中作者遇到的问题,我的报错大概有(截取):
2024-08-06T07:48:52.363247Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
2024-08-06T07:48:52.363835Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2024-08-06T07:48:52.364258Z 0 [Note] IPv6 is not available.
2024-08-06T07:48:52.364360Z 0 [Note] - '0.0.0.0' resolves to '0.0.0.0';
2024-08-06T07:48:52.364432Z 0 [ERROR] Failed to create a socket for IPv4 '0.0.0.0': errno: 13.
2024-08-06T07:48:52.364489Z 0 [ERROR] Can't create IP socket: Permission denied
2024-08-06T07:48:52.364541Z 0 [ERROR] Aborting
我根据以上截取的内容的倒数第三个报错搜索到这篇文章:Failed to create a socket for IPv4 ‘0.0.0.0’: errno: 13并根据其中提出的方法成功解决问题,MySQL成功启动
补充:
虽然并不知道有没有用,但是我把面板里MySQL管理的“性能调整”一项的“优化方案”这一项设成了“1-2G”,在开放端口成功之前就已经设置了。
关于检查脚本:(这部分是我突发奇想写上的,应该对各位没什么用)
其内容如下:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
DATA_PATH=$(cat /etc/my.cnf|grep datadir|awk '{print $3}')
echo "=========================================================================================="
cat /www/server/data/*.err|grep -i -C 10 error
echo $DATA_PATH
echo "=========================================================================================="
echo "请将以上错误信息截图发至论坛寻求帮助"
rm -f sql-repair.sh
通过分析这个脚本可以发现,它先是读取了my.cnf(这是MySQL在Linux系统下的配置文件),找到了其中datadir = xxxxxx
,我的电脑上是datadir = /www/server/data
这一行并将DATA_PATH
赋为——以我的为例——/www/server/data
接着其在输出一行=
后,输出/www/server/data/*.err
,我猜是MySQL的报错文件但我不知道grep命令的-C 10
参数是为什么
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
参考:Linux grep 命令
这样脚本也就是从大量内容中找出了包含error的行。并注意,每行前的日期和时间应该是UTC时间,注意转化成北京时间
望以上内容或许能为您提供一定的解决问题的参考
如有错误还请多指教