目前,MySQL 服务器使用 /tmp 作为临时目录,我想更改它,因为它遇到了存储问题。
继这篇文章之后:如何在 CentOS 上更改 MySQL tmp 位置因为我使用的是 Scientific Linux,而且一般 CentOS 作为模拟工具运行得很好,所以我做了以下操作,全部在sudo
:
mkdir /home/mysqltmp
chmod 1777 /home/mysqltmp
nano /etc/my.cnf
Add below line under the [mysqld] section and save the file
tmpdir=/home/mysqltmp
systemctl restart mysqld
这次重启失败。如果我在不进行更改的情况下恢复旧的 my.cnf,它会完美地工作,这对我来说表明配置文件本身存在问题,或者我设置权限的方式存在问题,并且考虑到我(有限的)Linux 经验,我我很确定这是一个权限问题。
更新:查看 mysqld.log,看来这确实是一个权限问题:
2018-05-16T00:01:05.211853Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.22) starting as process 5929 ...
2018-05-16T00:01:05.214159Z 0 [Note] InnoDB: PUNCH HOLE support available
2018-05-16T00:01:05.214186Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2018-05-16T00:01:05.214191Z 0 [Note] InnoDB: Uses event mutexes
2018-05-16T00:01:05.214194Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2018-05-16T00:01:05.214197Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2018-05-16T00:01:05.214202Z 0 [Note] InnoDB: Using Linux native AIO
2018-05-16T00:01:05.214382Z 0 [Note] InnoDB: Number of pools: 1
2018-05-16T00:01:05.214459Z 0 [Note] InnoDB: Using CPU crc32 instructions
mysqld: Can't create/write to file '/home/mysqltmp/ibAcknwl' (Errcode: 13 - Permission denied)
2018-05-16T00:01:05.214535Z 0 [ERROR] InnoDB: Unable to create temporary file; errno: 13
2018-05-16T00:01:05.214542Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2018-05-16T00:01:05.214548Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2018-05-16T00:01:05.214551Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2018-05-16T00:01:05.214554Z 0 [ERROR] Failed to initialize builtin plugins.
2018-05-16T00:01:05.214557Z 0 [ERROR] Aborting
有人看到我做错了什么吗?
更新2:这个做看起来是一个selinux的东西。chown
没有解决问题,并且在审核日志中存在许多该目录的 AVC 拒绝 {write} 消息。
selinux 对我来说完全是不可接受的 - 有解决这个问题的方法吗?
答案1
我今天遇到了同样的问题。它给了我足够的暗示,让我产生了谷歌搜索“selinux mysql 写权限“。这立即给了我答案,你可以阅读在这篇 Oracle 博客文章中。如果 Oracle 会像他们习惯的那样删除该链接,您还可以获取它从回程机器上,但请耐心等待并向下滚动以获取文本。
我在这里只给出一些提示:
- 使用(root shell)命令检查您的 selinux 状态
getenforce
- 如果它回复 '执行',尝试将其设置为 '宽容' 用命令
setenforce 0
- 然后尝试重新启动 mysqld 并检查它现在是否正常工作
- 使用命令将selinux重置回正常状态
setenforce 1
一旦你证明了 selinux 是 mysqld 无法工作的罪魁祸首,你就不能仅仅禁用它,因为那样不安全。您必须了解如何在其配置中添加特定于 mysqld 的异常。
对于这一部分,我将让您使用我提供的链接和 SELinux 文档自行弄清楚,因为我不是专家,因此不会尝试对我不完全理解的内容提供建议