Introduction
Je vais enfoncer des portes ouvertes, dire des évidences !
- MySQL travaille avec la mémoire vive, nous sommes tous d’accord avec cela.
- Mais avant qu’elle ne mettes ses résultats en RAM elle travaille sur /var/lib/mysql.
- Le répertoire /var/lib/mysql est la plupart du temps sur l’un de vos disques…
Et bien pourquoi ne pas mettre MySQL complètement en RAM lorsque elle calcule, trie, effectue des requêtes ? (Un intermédiaire est d’allouer de la RAM associée avec la variable tmpdir de MySQL)
Nous allons voir comment mettre /var/lib/mysql en RAM et ceci de manière excessivement simple !
- montage de /var/tmpfs préalablement créé en tmpfs
- copie de /var/lib/mysql dans le répertoire /var/tmpfs
Montage d’un répertoire en RAM
Création du répertoire qui va accueillir MySQL et montage de celui-ci en RAM.
mkdir /var/tmpfs mount -t tmpfs -o size=1G tmpfs /var/tmpfs chown -R mysql:mysql /var/tmpfs/mysql
Ce qui peut donner dans /etc/fstab
tmpfs /var/tmpfs tmpfs nodev,nosuid,noexec,noatime,size=1G 0 0Copie de MySQL
service mysql stop cp -Rfv /var/lib/mysql /var/ramfs/ chown -R mysql:mysql /var/tmpfs/mysqlvi /etc/my.cnfNous allons changer les indications /var/lib dans my.cnf en /var/tmpfs
datadir /var/tmpfs/mysqlLe souci qui va se présenter, est que si vous arrêtez ou redémarrez le serveur… La RAM est vidée et votre base de données avec !
![]()
Il faut donc prévoir à l’arrêt de la machine une copie sur disque (/var/lib/mysql) de la base de données qui est en RAM… Puis au démarrage une copie de ce qui est sur disque en RAM après le montage correct du tmpfs !
A l’arrêt :
cp -Rfv /var/tmpfs/mysql /var/lib/ chown -R mysql:mysql /var/tmpfs/mysqlAu démarrage :
cp -Rfv /var/lib/mysql /var/ramfs/ chown -R mysql:mysql /var/tmpfs/mysqlNous allons donc créer un script copie-bdd.sh
#!/bin/sh -e ### BEGIN INIT INFO # Provides: copie-bdd.sh # Required-Start: mysql # Required-Stop: mysql # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Copie BDD pour RAM # Description: Copie BDD pour RAM. ### END INIT INFO case "$1" in start) service mysql stop cp -Rfv /var/lib/mysql /var/ramfs/ chown -R mysql:mysql /var/tmpfs/mysql service mysql start ;; stop) service mysql stop cp -Rfv /var/tmpfs/mysql /var/lib/ chown -R mysql:mysql /var/tmpfs/mysql ;; *) echo "Usage: /etc/init.d/copie-bdd.sh {start|stop}" exit 1 ;; esac exit 0Enregistrer ce script dans /etc/init.d/
Rendre celui-ci executable :
>chmod +x /etc/init.d/copie-bdd.shNous allons activer ce script pour les niveaux 2 3 4 5.
chkconfig --level 2 3 4 5 copie-bdd.sh onVoilà !
![]()
Si votre base de données est trop importante en taille et que vous ne pouvez mettre celle-ci entièrement en RAM.
Il existe une solution plus adéquate. Voir mon prochain article http://monblog.system-linux.net/blog/2011/08/29/mettre-tmpdir-de-mysql-en-ram-grace-tmpfs/ !
- Fin -




4 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.
Mysql en RAM, ok, mais quid de la persistence ? Ce sera traité dans le prochain article ? Je pense surtout à une coupure éléctrique brutale pendant que mysql tourne, perte de données obligatoire ?
Bonjour,
Effectivement la coupure électrique est un souci, en dehors d’un onduleur qui lance alors l’arrêt doux de la machine…
Ou d’un démon synchronisant de manière régulière ou en cas de changement…
A voir !
A voir aussi les log binaires distants !
Continuing the Discussion