上一篇
"老张!数据库挂了!线上服务全瘫了!"凌晨两点接到同事电话时,我正梦见自己成了SQL语句在索引森林里奔跑,揉着眼睛连上VPN,看到MySQL错误日志里赫然写着:
[ERROR] [MY-010784] [Server] Can't open directory './database_name/' (errno: 13 - Permission denied)
Error number: MY-010784; Symbol: ER_CANT_OPEN_DIR; SQLSTATE: HY000
这熟悉的报错让我瞬间清醒——又是文件权限惹的祸!去年处理过类似的案例,但这次情况更紧急,因为正值促销活动高峰期。
这个报错的核心是MySQL服务账号没有权限访问数据目录(通常位于/var/lib/mysql),常见诱因包括:
第一步:确认症状 通过SSH连上服务器(幸好SSH还能用),快速检查:
ls -ld /var/lib/mysql # 返回drwx------ 2 root root 4096 Jul 10 23:59 /var/lib/mysql
问题很明显——目录属主居然是root!MySQL默认应该用mysql用户运行。
第二步:紧急修复
# 停止MySQL服务(虽然可能已经挂了) sudo systemctl stop mysqld # 修正权限(注意保留原有权限模式) sudo chown -R mysql:mysql /var/lib/mysql sudo chmod 750 /var/lib/mysql # 特别处理SELinux环境 sudo restorecon -Rv /var/lib/mysql # 重新启动 sudo systemctl start mysqld
第三步:验证结果
sudo tail -n 50 /var/log/mysqld.log
看到"[Note] Server socket created on IP: '0.0.0.0'"的瞬间,整个运维间响起欢呼。
权限监控:部署inotify-tools监控关键目录变更
sudo apt install inotify-tools inotifywait -m /var/lib/mysql -e modify,attrib,move,create,delete
备份策略:除了常规备份,建议保存目录结构快照
# 记录权限信息 getfacl -R /var/lib/mysql > mysql_permissions_backup.acl
操作规范:
mysqladmin variables | grep datadir
确认路径这次事故让我们付出了15分钟服务中断的代价,事后分析发现,是某位同事在清理日志时误执行了sudo chown -R root:root /var/lib
,现在我们在跳板机上做了限制:
# 在/etc/sudoers中添加 Cmnd_Alias PROTECTED_DIRS = /bin/chown */var/lib*, /bin/chmod */var/lib* User_Alias DEVOPS = zhangsan,lisi DEVOPS ALL=(ALL) ALL, !PROTECTED_DIRS
在MySQL的世界里,权限就像数据库的免疫系统——平时感觉不到存在,一旦出问题就是大麻烦,凌晨三点的故障处理教会我们:预防永远比救火重要。
本文由 宋华池 于2025-07-31发表在【云服务器提供商】,文中图片由(宋华池)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/492453.html
发表评论