Lors de l'logging de INTO OUTFILE à partir de mysql sur un système basé sur systemd, le file de sortie est saisi par systemd – pourquoi?

Je cours régulièrement des rapports simples à partir d'une database mysql (en fait, mariaDB):

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

Récemment j'ai mis à jour le server DB vers un système basé sur linux 3.19 en utilisant la version 218-2 de systemd et j'ai été surpris de constater que le file de sortie ne va pas directement dans le directory / tmp comme je le pensais mais plutôt dans un dossier systemd privé dans / tmp :

 [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/ 

Bien que cela ne soit pas tragique, il est peu pratique, car seul l'user root peut accéder à ce directory, ce qui oblige l'administrateur mysql à avoir également un access root sur le système, ce qui n'est pas forcément ce que vous voulez.

Quelqu'un peut-il expliquer pourquoi systemd attrape le file, et y at-il un moyen de contourner ce comportement?

Vous pouvez modifier ce comportement si vous modifiez l'option tmp sécurisée dans /lib/systemd/system/mariadb.service.

 systemctl stop mariadb 

next edit /lib/systemd/system/mariadb.service lorsque vous changez PrivateTmp en false:

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

et enfin:

 systemctl daemon-reload systemctl start mariadb 

Comme indiqué dans les commentaires, une meilleure solution n'est pas de faire des changements dans le file mariadb.service, mais de choisir un directory différent, de donner des droits afin que l'user exécutant mariadb puisse y accéder et pointer votre OUTFILE vers ce directory.

Si l'option PrivateTmp est activée, cela garantit que le directory / tmp que le service verra est privé et isolé du système / tmp de l'hôte.
Un bon sharepoint vue, vous pouvez find ici .