MySQL腾讯云(Ubuntu系统)安装失败解决方案–记录一种罕见的安装启动失败案例
目前我尝试时,不能正常按照sudo apt-get mysql-sever 语句安装,应该是腾讯云提供的源的问题。可行的安装方式为:
sudo apt install mysql-client-core-5.7
sudo apt-get install mysql-server-5.7
或
sudo apt install mysql-client-core-8.0
sudo apt-get install mysql-server-8.0
顺利的情况下,可以成功安装并运行起来,没有报错。(未出现红字)
然而,遇到报错就麻烦:
出现E: Sub-process /usr/bin/dpkg returned an error code (1),说明安装过程出现错误,我尝试了一些可以查询到的方法,如【链接1】【链接2】。但对于我这个问题并没有效果,问题还没解决。
我了解到 /var/log/mysql/error.log
记录着mysql安装的log,于是通过nano /var/log/mysql/error.log
查看。
发现由于权限问题,mysqld无法再/tmp中创建文件夹,导致mysql无法启动。(其实此时mysql已经完成了安装,但是无法正常启动。使用sudo systemctl start mysql.service
就会出现Fig.1的错误)。
权限问题一般也不是太复杂,可能是由于/tmp的读写权限没有给到当前用户?不过我用的sudo,应该也不会出现这种问题。然后我查询了/tmp的读写权限,已经给到最高了rwxrwxrwx
,所有用户可读写。那也不是这个问题啊!
然后我在此折腾了半天,反复remove、install 无济于事。
终于,我在咨询人工智能Kimi时,获得了一丝线索,在此感谢Kimi足够详细的回答。
在反复询问Kimi以及不断尝试,我注意到两个未尝试过的信息:
由于mysql的log只提示了权限问题,并不能帮助我解决问题,只能考虑是其他原因。SELinux和AppArmor我不知道是什么东西,然后我先试了一下dmesg
。
一试刚好发现了这个熟悉的东西,然后我直接把报错发给了人工智能解读,人工智能的回答让我茅塞顿开,终于找到了问题的根源。以下为人工智能对错误的解答:
这些日志条目是AppArmor安全模块生成的审计日志,它们记录了AppArmor阻止的某些操作。下面是对这些日志条目的逐条解读:
-
日志格式:每条日志都包含了时间戳、审计类型(type=1400表示AppArmor的DENIED事件)、操作类型、涉及的程序、文件名、进程ID(pid)、命令名称(comm)、以及其他一些详细信息。
-
AppArmor=“DENIED”:这表明AppArmor阻止了某个操作。
-
operation=“open” 或 operation=“mknod”:
open
表示尝试打开一个文件,但被拒绝。mknod
表示尝试创建一个文件系统节点,比如创建一个设备文件,但被拒绝。
-
profile=“/usr/sbin/mysqld”:这指定了被AppArmor用于
mysqld
(MySQL服务器守护进程)的配置文件路径。 -
name:被尝试访问或创建的文件或文件系统节点的路径。
-
pid:发起请求的进程的进程ID。
-
comm=“boot”:尝试执行操作的命令名称,这里是
boot
,这可能是一个脚本或程序,用于在系统启动时执行某些任务。 -
requested_mask=“wr” 或 requested_mask=“c”:请求的权限掩码,
wr
表示写入权限,c
表示创建权限。 -
denied_mask=“wr” 或 denied_mask=“c”:被拒绝的权限掩码,与请求的权限相同。
-
fsuid=116 ouid=116:尝试执行操作的有效用户ID和所有者用户ID。
根据这些日志条目,可以看出MySQL服务器在尝试访问或创建位于/www/cosfs_temp/mysql_temp/
目录下的文件时,被AppArmor拒绝了写入和创建文件系统节点的权限。这通常是因为AppArmor的配置文件没有为mysqld
进程提供足够的权限来执行这些操作。
解决这个问题通常需要以下步骤:
-
查看AppArmor配置文件:检查
/etc/apparmor.d/
目录下与mysqld
相关的AppArmor配置文件。 -
编辑AppArmor配置文件:如果需要,编辑配置文件以允许对
/www/cosfs_temp/mysql_temp/
目录的写入和创建操作。 -
重新加载AppArmor配置:修改配置文件后,重新加载AppArmor以应用更改:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
-
检查MySQL配置:确保MySQL的配置文件(如
my.cnf
或my.ini
)中的相关设置正确。 -
重启MySQL服务:应用更改后,重启MySQL服务以确保新的AppArmor设置生效:
sudo systemctl restart mysql
-
监控日志:在更改后,继续监控系统日志以确保问题已经解决。
人工智能解答了我的问题,我接着让他给出更信息详细的解决方案:
要编辑AppArmor配置文件以允许对/www/cosfs_temp/mysql_temp/
目录的写入和创建操作,你可以按照以下步骤操作:
-
定位AppArmor配置文件:
首先,需要找到控制mysqld
的AppArmor配置文件。通常这些文件位于/etc/apparmor.d/
目录下。可以使用以下命令查找可能的配置文件:sudo ls /etc/apparmor.d/ | grep mysql
-
查看配置文件内容:
使用文本编辑器查看配置文件的内容,例如:sudo nano /etc/apparmor.d/usr.sbin.mysqld
-
添加规则:
在配置文件中,你需要添加规则以允许对特定目录的写入访问。例如,你可以添加如下规则:/www/cosfs_temp/mysql_temp/ rwk, # your_path/* rwk
这条规则允许对
/www/cosfs_temp/mysql_temp/
目录及其内容进行读取(r)、写入(w)、创建(k)操作。 -
修改规则:
如果配置文件中已经有关于/tmp
的规则,可能需要修改它们以包括/www/cosfs_temp/mysql_temp/
目录。例如,如果规则是:/tmp/ r,
你可能需要修改为:
/tmp/* r, /www/cosfs_temp/mysql_temp/* rwk,
-
保存并关闭文件:
修改完成后,保存并关闭文件。 -
重新加载AppArmor配置:
为了使更改生效,需要重新加载AppArmor配置文件。可以使用以下命令:sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
-
重启MySQL服务:
重新加载配置后,重启MySQL服务以应用新的AppArmor设置:sudo systemctl restart mysql
-
测试更改:
更改完成后,应该测试以确保MySQL服务可以正常访问/www/cosfs_temp/mysql_temp/
目录。 -
监控日志:
监控系统日志以确保AppArmor没有再次拒绝MySQL的访问请求。
请注意,修改AppArmor配置可能会影响到系统的安全性。在修改配置之前,请确保你了解这些更改的后果,并且这些更改是必要的。如果你不确定,最好咨询有经验的系统管理员或者安全专家。
我按照他的解决方案,成功解决了我的问题,注意对应路径改成你的路径,切记路径后带(/path/* rw,)。感谢Kimi!谨以此记录。