Ingeny, le blog !

Véritable fenêtre sur notre univers, vous trouverez dans ce blog des ressources technologiques, des conseils, des témoignages et bien d'autres choses encore...

MySQL - Écrit par Durand Franck PDFImprimerEnvoyer Publié le 28.07.11

Par défaut, dans le cas d'une réplication MySQL, le serveur esclave correspond exactement au serveur maitre ( pour les bases / tables voulues ).

Il peut cependant être utile de pouvoir éxécuter certaines requêtes uniquement sur le maitre, sans les voir se repliquer sur le serveur esclave.

Pour pouvoir le faire il faut comprendre comment fonctionne la réplication MySQL. Afin d'activer la réplication, il est nécessaire d'activer les log binaires, qui vont contenir les requêtes executé sur le serveur. Le serveur esclave va alors venir lire ces log, pour répercuter les opérations.

Il suffit donc sur le serveur maitre, d'utiliser la variable SQL_LOG_BIN pour contrôler le log de nos requêtes :

SET SQL_LOG_BIN=0;

.... requetes non logguer ....

SET SQL_LOG_BIN=1;

 

De cette manière; il est possible de ne pas logguer, et donc de ne pas répliquer certaines requêtes sur le serveur esclave.

ATTENTION : si vous ne logguer pas des requêtes de création/modification/suppression de tables/bases, la réplication peux se briser, en effet une future requête qui ne pourai pas s'effectuer correctement sur le serveur esclave provoquerai une erreur stopant la replication !

L'utilisation de cette technique peux être utile pour par exemple obtenir un serveur esclave avec une plus grande rétention des données que le serveur maitre. En ne logguant pas les requêtes de nettoyage du maitre, et en utilisant une période de nettoyage différente sur le serveur esclave, on arrive alors à ce resultat.

 

MySQL - Écrit par Durand Franck PDFImprimerEnvoyer Publié le 11.11.10

Une chose à savoir avec les valeurs à virgules flottantes est qu'elles sont stockées de manières approximatives et non pas exacte comme le reste des valeurs.

A première vue sa ne pose pas de problème, sur une requête simple les valeurs retournées sont les bonnes, mais les problèmes arrivent quand on demande à MySQL de faire des calculs ou des comparaisons sur ces valeurs.

 

Le simple fait de demander le résultat d'un calcul sur un flottant retournera sa valeur approximative, par exemple :

CREATE TABLE test (val FLOAT(10.2));
INSERT INTO test VALUES ("3.2"), ("4.1");
SELECT SUM(val) FROM test;
// retourne 7.29999995231628 au lieu de 7.2 attendu

 

Dans un cas simple comme celui la il suffit d'utiliser la fonction ROUND(x, y) avec y égal a la précision après la virgule souhaitée :

SELECT ROUND(SUM(val, 2)) FROM test; // retourne 7.2

 

Egalement en utilisant les résultats dans les clauses de la requête d'autre problèmes apparaissent. Prenons l'exemple suivant :

CREATE TABLE test2 (i INT, val1 FLOAT(10.2), val2 FLOAT(10.2));
INSERT INTO test2 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00);
SELECT SUM(val1) AS a, SUM(val2) AS b FROM test2 GROUP BY i HAVING a <> b;
// retourne a=21.4000015258789, b=22.3999996185303

 

Même en utilisant la fonction ROUND(x, y) cela ne résoudrai pas le problème ( Note pour plus tard : dépend de l'architecture du processeur ), car la valeur résultante est également stocké de manière approximative en mémoire, et l'ont se retrouverai avec des valeur en apparence égale malgré la clause HAVING a <> b.

La seul solution acceptable est de définir un niveau de précision dans lequel s’effectueront les comparaisons :

SELECT SUM(val1) AS a, SUM(val2) AS b FROM test2 GROUPE BY i HAVING ABS(a - b) > 0.001;
// ne retourne rien

 

En fonction de l'architecture du processeur utilisé, les résultat présenté ici peuvent être différent de ceux que vous obtiendrez car il n'existe pas de règle strict quand au calcul à virgules flottantes pour les processeur. Il est ainsi souvent répondu de multiplier le résultat par 1 afin d'obtenir une valeur exacte au lieu d'une valeur approximative, mais ce n'est valable que sur certain processeur, et cette solution est donc a proscrire !

Egalement comprenez bien que même si votre serveur vous répond correctement quand je montre ici que la réponse n'est pas celle attendu, cela ne sera pas forcément vrai sur un autre serveur, il est donc important de mettre en oeuvre les concepts présenté dans cet article !

   

MySQL - Écrit par Durand Franck PDFImprimerEnvoyer Publié le 30.06.10

La documentation officielle de MySQL est très bien faites et traduite en français, mais attention, tout n'est pas forcement traduit et seule la version anglaise sert de référence !

Ainsi dans la version anglaise un passage intéressant est présent mais absent de la version française, concernant l'utilisation des verrous et des alias.

Lire la suite : Les verroux avec MySQL