pgo*_*etz 5 linux arch-linux mysql systemd
我经常从 mysql(实际上是 mariaDB)数据库运行简单的报告:
MariaDB [acts]> SELECT resolution, title FROM acts ORDER BY resolution INTO OUTFILE '/tmp/acts-titles.txt';
Run Code Online (Sandbox Code Playgroud)
最近我使用 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/
Run Code Online (Sandbox Code Playgroud)
虽然这不是悲剧,但很不方便,因为只有 root 用户可以访问这个目录,因此需要 mysql 管理员在系统上也有 root 访问权限,这不一定是你想要的。
任何人都可以解释为什么 systemd 正在抓取文件,有没有办法规避这种行为?
如果您编辑 /lib/systemd/system/mariadb.service 中的安全 tmp 选项,您可以更改此行为。
systemctl stop mariadb
Run Code Online (Sandbox Code Playgroud)
下一个编辑 /lib/systemd/system/mariadb.service 将 PrivateTmp 更改为 false:
# Place temp files in a secure directory, not /tmp
PrivateTmp=false # default is true
Run Code Online (Sandbox Code Playgroud)
最后:
systemctl daemon-reload
systemctl start mariadb
Run Code Online (Sandbox Code Playgroud)
如评论中所述,更好的解决方案不是在 mariadb.service 文件中进行更改,而是选择不同的目录,授予权限以便运行 mariadb 的用户可以访问它并将您的 OUTFILE 指向该目录。
如果启用了 PrivateTmp 选项,这将确保服务看到的 /tmp 目录是私有的,并且与主机的系统 /tmp 隔离。
你可以在这里找到一个很好的观点。