Ce plugin permet de modifier les requêtes SQL avant leur exécution dans MySQL. Il offre une fonctionnalité similaire à la réécriture de requêtes pour les vues matérialisées dans Oracle, mais avec une approche distincte.
Ce guide suppose l'utilisation de Percona Server version 5.7.19 ou similaire.
Installation
-
Localisez le script d'installation : Le fichier
install_rewriter.sqlse trouve généralement dans le répertoiresharesous le répertoire principal de votre installation MySQL. -
Exécutez le script d'installation :
mysql> SOURCE /chemin/vers/mysql/share/install_rewriter.sql;Des messages de succès indiqueront que les objets nécessaires au plugin ont été créés.
-
Vérifiez si le plugin est activé :
mysql> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | rewriter_enabled | ON | +------------------+-------+ -
Configuration permanente : Ajoutez la ligne suivante à votre fichier de configuration MySQL (
my.cnfou similaire) sous la section[mysqld]:[mysqld] rewriter_enabled=ON -
Activation/Désactivation dynamique : Vous pouvez activer ou désactiver le plugin à la volée en utilisant les commandes suivnates :
SET GLOBAL rewriter_enabled = ON; SET GLOBAL rewriter_enabled = OFF;
Tests et Configuration des Règles
-
Ajout d'une règle de réécriture : Pour modifier toutes les requêtes commençant par
SELECTen ajoutant+ 1à la valeur sélectionnée, utilisez :mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES('SELECT ?', 'SELECT ? + 1'); -
Vérification de l'état des règles :
mysql> SELECT * FROM query_rewrite.rewrite_rules\G *************************** 1. row *************************** id: 1 pattern: SELECT ? pattern_database: NULL replacement: SELECT ? + 1 enabled: YES message: NULL pattern_digest: NULL normalized_pattern: NULL -
Chargement des règles en mémoire : Pour que le plugin prenne en compte les nouvelles règles, exécutez la procédure suivante :
mysql> CALL query_rewrite.flush_rewrite_rules(); -
Vérification après le chargement des règles : Les colonnes
pattern_digestetnormalized_patternsont remplies, aidant au débogage :mysql> SELECT * FROM query_rewrite.rewrite_rules\G *************************** 1. row *************************** id: 1 pattern: SELECT ? pattern_database: NULL replacement: SELECT ? + 1 enabled: YES message: NULL pattern_digest: 512e888765927f4393e9f938df43b1ec normalized_pattern: select ? -
Test de la règle :
mysql> SELECT 10; +--------+ | 10 + 1 | +--------+ | 11 | +--------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1105 Message: Query 'SELECT 10' rewritten to 'SELECT 10 + 1' by a query rewrite plugin 1 row in set (0.00 sec)Notez que la requête
SELECT PI()n'est pas affectée car elle ne correspond pas au patternSELECT ?. -
Désactivation d'une règle : Modifiez l'état de la règle dans la table
rewrite_ruleset rechargez les règles :mysql> UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = 1; mysql> CALL query_rewrite.flush_rewrite_rules(); mysql> SELECT * FROM query_rewrite.rewrite_rules\G *************************** 1. row *************************** id: 1 pattern: SELECT ? pattern_database: NULL replacement: SELECT ? + 1 enabled: NO message: NULL pattern_digest: 512e888765927f4393e9f938df43b1ec normalized_pattern: select ?La requête
SELECT 11ne sera plus réécrite. -
Réactivation d'une règle :
mysql> UPDATE query_rewrite.rewrite_rules SET enabled = 'YES' WHERE id = 1; mysql> CALL query_rewrite.flush_rewrite_rules();
Logique de Correspondance des Règles
Le plugin utilise une combinaison de méthodes pour faire correspondre une requête SQL à une règle :
- Correspondance par hachage : Un hachage est calculé pour la requête SQL entrante et comparé aux hachages des règles enregistrées. Cette méthode est rapide mais peut présenter des risques d'erreurs de correspondance (collisions).
- Correspondance par motif normalisé : Si plusieurs règles correspondent via le hachage, le plugin utilise le
normalized_patternpour une comparaison plus précise. Lenormalized_patternest une version canonique du motif de règle. - Correspondance des paramètres : Lors de l'utilisation de paramètres (représentés par
?), le plugin s'assure que le nombre et la position des paramètres dans la requête correspondent à ceux du motif normalisé.
Le tableau suivant illustre la correspondance avec les paramètres :
| Instruction préparée | Correspondance du motif |
|---|---|
PREPARE s AS 'SELECT 3, 3' |
Oui |
PREPARE s AS 'SELECT ?, 3' |
Oui |
PREPARE s AS 'SELECT 3, ?' |
Non |
PREPARE s AS 'SELECT ?, ?' |
Non |
Ce plugin peut être une solution temporaire utile pour corriger des problèmes de performance ou des comportements inattendus dans des environnements de production critiques, en attendant une solution plus durable.