当在基于 systemd 的系统上从 mysql 保存 INTO OUTFILE 时,输出文件被 systemd 抓取 - 为什么?

当在基于 systemd 的系统上从 mysql 保存 INTO OUTFILE 时,输出文件被 systemd 抓取 - 为什么?

我定期从 mysql(实际上是 mariaDB)数据库运行简单的报告:

MariaDB [acts]> SELECT resolution, title FROM acts ORDER BY resolution INTO OUTFILE '/tmp/acts-titles.txt';

最近,我使用 systemd 版本 218-2 将数据库服务器升级到基于 linux 3.19 的系统,并惊讶地发现输出文件并没有像我怀疑的那样直接进入 /tmp 目录,而是进入 /tmp 中的私有 systemd 文件夹:

[root@www tmp]# pwd
/tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/tmp
[root@www tmp]# ls
acts-titles.txt
[root@www tmp]# ls -ld /tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/
drwx------ 3 root root 60 Mar 23 04:32 /tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/

虽然这并不悲惨,但很不方便,因为只有 root 用户可以访问这个目录,因此要求 mysql 管理员也拥有系统的 root 访问权限,这不一定是您想要的。

任何人都可以解释为什么 systemd 会抓取该文件,并且有什么方法可以避免这种行为吗?

答案1

如果您编辑 /lib/systemd/system/mariadb.service 中的 secure tmp 选项,则可以更改此行为。

systemctl stop mariadb

接下来编辑 /lib/systemd/system/mariadb.service 将 PrivateTmp 更改为 false:

# Place temp files in a secure directory, not /tmp
PrivateTmp=false  # default is true

最后:

systemctl daemon-reload
systemctl start mariadb

正如评论中所述,更好的解决方案是不要更改 mariadb.service 文件,而是选择不同的目录,授予权限,以便运行 mariadb 的用户可以访问它并将 OUTFILE 指向该目录。

如果启用 PrivateTmp 选项,这将确保服务将看到的 /tmp 目录是私有的,并且与主机系统 /tmp 隔离。
好观点你都能找到这里

相关内容