AppArmor拒绝mysqld访问目录时,直接查看journalctl -xe输出中含apparmor="DENIED"的行,重点分析operation和name字段;需检查/etc/apparmor.d/usr.sbin.mysqld是否包含对应路径的显式权限规则(如/your/path/ r, /your/path/** rwk,),修改后执行sudo apparmor_parser -r重载并用sudo aa-status确认enforce状态。

AppArmor拒绝mysqld访问目录时怎么查原因
直接看 journalctl -xe 输出里带 apparmor="DENIED" 的行,重点抓 operation 和 name 字段。比如出现:
audit[1234]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/mysql_data/mysql/ibdata1" pid=1234
说明 AppArmor 拦截了对 /mysql_data/mysql/ibdata1 的打开操作,而当前 profile 里没放行这个路径。
常见被拦的操作包括:mknod(建临时文件)、open(读数据文件)、write(写日志)、connect(连 socket)——这些都得在 profile 里显式声明。
/etc/apparmor.d/usr.sbin.mysqld 配置要点
Ubuntu 自带的默认 profile 仅允许 /var/lib/mysql/**,一旦你改了 datadir、log_error 或 socket 路径,就必须同步更新 profile。
-
/your/new/datadir/ r,—— 目录可读(必须,否则 mysqld 启动失败) -
/your/new/datadir/** rwk,—— 文件可读写+创建节点(k表示允许mknod,InnoDB 日志、临时表依赖它) -
/your/new/log/error.log rw,—— 错误日志需可写,但注意不能只写/your/new/log/,否则会因缺少r权限无法遍历目录 -
/run/mysqld/mysqld.sock w,—— socket 文件需可写(如果用了非默认 socket 路径) - 插件目录如
/usr/lib/mysql/plugin/** mr,——m表示可映射(加载 so),r表示可读
所有路径末尾的斜杠不能省:/path/ 是目录,/path 是文件,AppArmor 区分严格。
加载新规则后MySQL仍启动失败怎么办
不是改完文件就生效,必须用 apparmor_parser 重新加载,且要确认 profile 状态是 Enforced 而非 Complaining。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 重载配置:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld - 检查是否生效:
sudo aa-status | grep mysqld,输出应含enforce和路径 - 若仍报错,临时切到
Complaining模式收集完整行为:sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld,再启 mysqld,然后看journalctl -t kernel | grep mysqld补漏 - 别用
service apparmor restart—— 它会 reload 所有 profile,可能误杀其他服务策略
多实例场景下AppArmor怎么配
每个 mysqld 实例进程名仍是 /usr/sbin/mysqld,AppArmor 不区分端口或配置文件,只认二进制路径。所以多个实例共用同一 profile,必须把所有实例用到的路径全列进去。
例如两个实例分别用 /data/mysql/3307 和 /data/mysql/3308:
/data/mysql/3307/ r,<br>/data/mysql/3307/** rwk,<br>/data/mysql/3308/ r,<br>/data/mysql/3308/** rwk,
注意:rwk 中的 k 很关键——没有它,InnoDB 初始化阶段创建 ibtmp1 会失败;r 对父目录不可少,否则连 chdir 都被拦。
真正容易被忽略的是:AppArmor 规则不支持变量或通配符匹配路径层级,/data/mysql/*/ 这种写法无效,必须逐个实例硬编码路径。










