作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
引言
AppArmor (Debian 系平台)是一款内核级别的安全机制,通过 AppArmor 来让 Linux 系统实现严格的资源访问控制,类似 SELinux(RedHat 系列平台)。
Enforced/Confined: 严格按照配置文件来限制对应的进程访问 OS 资源的行为,拒绝不在配置范围内的进程运行。 Complaining/Learning: 仅记录进程行为,不对其进行限制。
遇到的问题是:
我启动 MySQL ,未成功:
root@ytt-ubuntu:~# systemctl start mysql
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.复制
我摘出来几条核心的错误信息:
root@ytt-ubuntu:~# journalctl -xe
-- Defined-By: systemd
-- user-122.slice 单元已结束停止操作。
11月 16 16:14:00 ytt-ubuntu kernel: audit: type=1400 audit(1637050440.395:101): apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/op
11月 16 16:14:00 ytt-ubuntu audit[7237]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/opt/mysql/data/mysqld_tmp_file_case_i
11月 16 16:14:01 ytt-ubuntu audit[7270]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/opt/mysql/log/error.log" pid=7270 com
11月 16 16:14:01 ytt-ubuntu systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE
11月 16 16:14:01 ytt-ubuntu systemd[1]: mysql.service: Failed with result 'exit-code'.
11月 16 16:14:01 ytt-ubuntu systemd[1]: Failed to start MySQL Community Server.
-- Subject: mysql.service 单元已失败复制
由错误信息可以看到,AppArmor 阻止了 MySQL 服务启动,可能的原因是启动 MySQL 服务需要访问的目录在 AppArmor 里没有配置。
想起来我动过配置文件:
源配置内容:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log复制
我改后的配置内容:
[mysqld]
pid-file = /opt/mysql/mysqld.pid
socket = /opt/mysql/mysqld.sock
datadir = /opt/mysql/data
log-error = /opt/mysql/log/error.log复制
此时有两种方法来解决这个问题。
第一, 直接更改AppArmor 的配置文件:
给/etc/apparmor.d/user.sbin.mysqld里添加如下内容:(或者把原来MySQL相关的目录替换掉也行)
# pid,socket等文件目录
/opt/mysql/* rw,
# 数据目录内容
/opt/mysql/data/ r,
/opt/mysql/data/** rwk,
#日志文件内容
/opt/mysql/log/ r,
/opt/mysql/log** rw,复制
重载 AppArmor 服务
root@ytt-ubuntu:~# systemctl reload apparmor
复制
再次重启 MySQL ,启动成功。
root@ytt-ubuntu:/opt/mysql# systemctl start mysql
复制
查看状态
root@ytt-ubuntu:/home/ytt# systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; disabled; vendor preset: enabled)
Active: activating (start) since Tue 2021-11-16 16:49:12 CST; 40s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 3137 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 3191 (mysqld)
Status: "Server startup in progress"
Tasks: 24 (limit: 4915)
CGroup: /system.slice/mysql.service
└─3191 /usr/sbin/mysqld
11月 16 16:49:12 ytt-ubuntu systemd[1]: Starting MySQL Community Server...
11月 16 16:49:54 ytt-ubuntu systemd[1]: Started MySQL Community Server.复制
第二, 改变 AppArmor 的默认工作模式,由强制模式改为抱怨模式:
得先安装apparmor-utils包,里面包含了很多有用的程序来操作 AppArmor .
root@ytt-ubuntu:~# apt-get install apparmor-utils
复制
单独配置 MySQL 服务进入抱怨模式:
root@ytt-ubuntu:~# aa-complain /etc/apparmor.d/usr.sbin.mysqld
Setting /etc/apparmor.d/usr.sbin.mysqld to complain mode.复制
重载 AppArmor
root@ytt-ubuntu:~# systemctl reload apparmor
复制
启动 MySQL 服务
root@ytt-ubuntu:~# systemctl restart mysql
复制
查看状态
root@ytt-ubuntu:~# systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2021-11-16 17:11:12 CST; 12s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 3712 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 3767 (mysqld)
Status: "Server is operational"
Tasks: 41 (limit: 4915)
CGroup: /system.slice/mysql.service
└─3767 /usr/sbin/mysqld
11月 16 17:10:45 ytt-ubuntu systemd[1]: Starting MySQL Community Server...
11月 16 17:11:12 ytt-ubuntu systemd[1]: Started MySQL Community Server.复制
以上 MySQL 的行为基于 APT 包安装产生,如果采用 MySQL 二进制包安装,则可以规避这个问题。
新特性解读 | 来聊聊 MySQL8.0 的 json 模式校验
社区近期动态


文章转载自爱可生开源社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1250次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
469次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
448次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
441次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
382次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
329次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
318次阅读
2025-03-17 10:36:40
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
229次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
216次阅读
2025-03-21 15:30:53
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
194次阅读
2025-03-19 23:43:22