Linux

在基於 systemd 的系統上從 mysql 保存 INTO OUTFILE 時,輸出文件被 systemd 抓取——為什麼?

  • March 25, 2015

我定期從 mysql(實際上是 mariaDB)數據庫執行簡單的報告:

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

最近我使用 systemd 版本 218-2 將 DB 伺服器升級到基於 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 正在抓取文件,有沒有辦法規避這種行為?

如果您在 /lib/systemd/system/mariadb.service 中編輯安全 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 隔離。你可以在這裡

找到一個很好的觀點。

引用自:https://unix.stackexchange.com/questions/192404