前情提要:服务器上的系统盘快满了,所以准备将mysql的数据迁移到另一个硬盘上去,具体来讲,需要将/var/lib/mysql整个copy到/ssda/mysql_data下去
踩坑过程:
我首先使用了cp -a命令,将文件夹迁移过去:
sudo cp -a /var/lib/mysql /ssda/mysql_data
使用ls -l查看迁移后的mysql文件夹的权限
可以看到mysql文件夹是有权限,而且用户组也是没有问题的。
然后再修改mysql的配置文件,将datadir指向迁移后的文件夹
修改完成,保存重启mysql。
sudo systemctl restart mysql.service
OK,大功告成,迁移数据完毕........本来应该是这样的.......
但当我执行重启mysql的命令后,系统却提示mysql启动错误!!!瞬间汗流浃背了,让我看看mysql的报错情况
Error: 13 (Permission denied)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
居然提示我们没有权限,但如我之前所展示的,文件夹的权限已经是修改过的,按理来说没有问题才对。于是我翻看网上的解决办法以及向ChatGPT求助。得到的答案无外乎是:检查目录是否存在,检查mysql文件夹权限是否设置,检查SeLinux,检查Apparmor。
我顺着网上的思路一路检查,前两项是没有问题的,Ubuntu2204也没有装SeLinux,至于Apparmor确实有,网上的解决办法一个是修改/etc/apparmor.d/tunables/alias,在文件底部加入
alias alias /var/lib/mysql/ -> /ssda/mysql_data/mysql/,
当然,我也按照方法添加了语句,但重启mysql依旧报错。另一个解决办法是修改/etc/apparmor.d/usr.sbin.mysqld,将Allow data dir access的值替换为迁移的mysql目录,然后保存退出,重新加载apparmor。
# Allow data dir access
# /var/lib/mysql/ r,
# /var/lib/mysql/** rwk,
/ssda/mysql_data/mysql/ r,
/ssda/mysql_data/mysql/** rwk,
但当我试过以后,还是一样的权限问题。
最终解决办法
实在搞不明白了,百度到的方法都用了个遍还是不行,还花费了我一个下午的时间。然后我抱着试一试的心态,去外网搜搜看,结果真被我找到了!!!在askubuntu.com里看到一个老哥和我一样的问题,一样的尝试了各种办法,仍然无法解决,顿感欣慰,居然有同命之人。然后!英雄出现在了评论区!
直接说结论:修改/ssda/mysql_data的权限!
居然忘了修改父级目录的权限了,气死了都,浪费一下午时间