MySQL : utilisation du répertoire /tmp
Voici quelques notes sur l'utilisation de /tmp pour MySQL (sous OpenBSD 4.3).
Le client mysql présent dans toutes les versions du fameux SGBD permet de contrôler les variables du démon à l'œuvre. Ainsi, on peut connaître la version du moteur :
mysql> SHOW VARIABLES LIKE "version"; +---------------+-------------+ | Variable_name | Value | +---------------+-------------+ | version | 5.0.51a-log | +---------------+-------------+ 1 row in set (0.00 sec)ou encore, le répertoire temporaire utilisé, notamment, par MySQL au démarrage :
mysql> SHOW VARIABLES LIKE "tmpdir"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | tmpdir | /tmp | +---------------+-------+ 1 row in set (0.00 sec)
Ces variables figurent dans le fichier de configuration de MySQL, localisé sous ma version d'OpenBSD dans : /etc/my.cnf.
Il y aurait bien une commande pour les modifier en mode runtime, tout simplement SET (comme en shell), ce qui donne :
mysql> SET tmpdir="/var/www/tmp"; ERROR 1238 (HY000): Variable 'tmpdir' is a read only variableoù l'on s'aperçoit que cette variable est en lecture seule (ce qui se comprend : il vaut mieux ne pas modifier l'emplacement du répertoire temporaire en pleine action…).
Mais pourquoi ne plus utiliser /tmp ? Eh bien parce que pas mal de packages sous PHP / MySQL ont pris l'habitude d'écrire dans ce répertoire et comme le user est _mysql (sous OpenBSD), on se retrouve à devoir faire un chmod 777 sur /tmp ce qui n'est pas sans poser des problèmes de sécurité, à tout le moins de commodité. C'est même carrément impossible dans le cas d'un hébergement partagé ou mutualisé (si certains ont un accès ssh à la machine, qu'ils me fassent signe).
À tel point que mon script de lancement de MySQL sous OpenBSD ressemble à ça :
chmod 777 /tmp
sleep 2
if [ X"${mysql}" == X"YES" -a -x /usr/local/bin/mysqld_safe ]; then
echo -n " mysqld"; /usr/local/bin/mysqld_safe &
for i in 1 2 3 4 5 6; do
if [ -S /var/run/mysql/mysql.sock ]; then
break
else
sleep 1
echo -n "."
fi
done
chmod 755 /tmp
Donc, si on peut mettre tout ça dans /var/www/tmp (en raison du chroot natif d'Apache sous OpenBSD), c'est pas mal.
Seulement, voilà, il faut modifier my.cnf et redémarrer le démon, première solution : c'est vers la ligne 100 du fichier, là on on trouve "tmpdir = /tmp". Ou passer les arguments en ligne de commande comme suit :
/usr/local/libexec/mysqld --basedir=/usr/local --datadir=/var/mysql --user=_mysql --tmpdir="/var/www/tmp" &
Le problème, c'est que les requêtes ne fonctionnent plus (j'ai testé directement à partir des scripts php, et il me faudrait déboguer plus avant). Je pense que c'est tout simplement incompatible avec l'architecture du chroot.
La solution (à tester), est peut-être simplement de monter un media en mémoire flash (une bonne vieille clé USB) et de l'utiliser comme répertoire temporaire (ne serait-ce qu'une partitition).
Voilà, je ne manquerai pas de le tester. Et d'ores et déjà, si ça peut en aider certains.
tags : MySQL
mis en ligne : Wed Oct 21 21:46:43 CEST 2009