Skip to content


Mettre entièrement MySQL en RAM grâce à ramfs ou tmpfs

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 -p
mount -t tmpfs -o size=1G tmpfs /var/tmpfs
chown -R mysql:mysql /var/tmpfs

 

Ce qui peut donner dans /etc/fstab

tmpfs  /var/tmpfs                         tmpfs  nodev,nosuid,noexec,noatime,size=1G              0 0

Copie de MySQL

service mysql stop
cp -Rfv /var/lib/mysql /var/tmpfs/
chown -R mysql:mysql /var/tmpfs/mysql
vi /etc/my.cnf

Nous allons changer les indications /var/lib dans my.cnf en /var/tmpfs

datadir /var/tmpfs/mysql

Le 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/mysql

Au démarrage :

cp -Rfv /var/lib/mysql /var/ramfs/
chown -R mysql:mysql /var/tmpfs/mysql

Nous 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 0

Enregistrer ce script dans /etc/init.d/

Rendre celui-ci executable :

>chmod +x /etc/init.d/copie-bdd.sh

Nous allons activer ce script pour les niveaux 2 3 4 5.

chkconfig --level 2 3 4 5 copie-bdd.sh on

Voilà ! 🙂

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 -

Print Friendly, PDF & Email

Posted in Debian, Important, Linux, Mandriva, Technique, Toutes. Tagged with , , , , , .

3 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. jems said

    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 ?

  2. Leo said

    Voila une idée qu'elle est bonne, surtout pour les utilisateurs de raspeberry pi comme moi. En effet la carte sd "s'use" très vite à cause des écritures fréquentes.

    Par contre une question, pour ne pas utiliser rsync à l'arret? Ca éviterait d'avoir à réécrire toute la base sur le disque, mais seulement les changements.

Continuing the Discussion

  1. Mettre mysql entièrement en RAM | Bux Blog linked to this post on 28 février 2012

    [...] la base de donnée entièrement en ram. Voici donc un petit tutoriel que j’ai trouvé chez Laurent Besson qui vous permettra de mettre mysql en [...]

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.

Time limit is exhausted. Please reload CAPTCHA.


/* */
Creative Commons License
Cette création par Laurent Besson est mise à disposition selon les termes de la licence Creative Commons Paternité-Partage des Conditions Initiales à l'Identique 2.0 France.