Archives pour la catégorie ‘Base de données’

MySQL : activer le mode lecture seule

Pour empêcher les modifications de vos bases de données lors des opérations de maintenance, il est utile d’activer le mode read only de MySQL :

mysql> set GLOBAL read_only=true;

A cet instant, toutes les requêtes d’écritures seront refusées et seul l’utilisateur root pourra effectuer des modifications. Une fois terminées, il faut réactiver le mode read/write :

mysql> set GLOBAL read_only=false;

A noter qu’il existe la méthode du verrou exclusif. Dans ce cas, la connexion client de l’utilisateur root ne doit pas être coupée (le verrou serait automatiquement relâché) et toutes les requêtes d’écriture des utilisateurs, y compris root, seront mises en attente puis exécutées à la libération du verrou :

mysql> FLUSH TABLES WITH READ LOCK;
mysql> [...]
mysql> UNLOCK TABLES

MySQL : gestion du cache de requêtes

Le cache de requêtes de MySQL permet d’optimiser le temps d’exécution des requêtes en lecture, à savoir les SELECT. Son efficacité est d’autant plus grande que les requêtes sont fréquentes et les résultats invariants, ce qui est majoritairement le cas pour les sites Web. Son fonctionnement est simple : la sortie texte de la requête et des résultats des requêtes est mise en cache et le serveur les récupère en cas de requête identique (comparaison caractère à caractère). En cas de modification des données,  tous les résultats associés aux tables cache sont nettoyés, ce qui entraîne sur le long terme une fragmentation des blocs mémoire du cache.

Pour vérifier que le cache est activé et ses différents paramètres de configuration :

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

Ainsi, il est parfois utile de désactiver la mise en cache :

  • pour une requête spécifique :
mysql> SELECT SQL_CACHE id, name FROM customer;
  • pour une connexion (session client) :
mysql> SET SESSION query_cache_type = OFF;

Si query_cache_type est fixée à DEMAND (valeur 2), alors la mise en cache est forcée au niveau du serveur (GLOBAL) ou client (SESSION) :

mysql> SET GLOBAL query_cache_type=2;
mysql> SET SESSION query_cache_type=2;

Un script de maintenance journalier peut se charger de défragmenter le cache :

mysql> FLUSH QUERY CACHE;

ou encore le vider :

mysql> RESET QUERY CACHE;
Haut de page