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 variable
où 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