Linux
在基於 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 將 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 隔離。你可以在這裡
找到一個很好的觀點。