Displaying posts with tag: pratique (reset)
Désactiver les clés étrangères

Une petite « astuce » pour se remettre dans le bain du blogging… Comme vous avez pu le constater la fréquence de mise à jour a un peu diminuée depuis notre retour de la MySQL Conf, corrigeons cela avec cette petite remise en jambe à classer dans la catégorie « pratique ».

La désactivation du contrôle des clés étrangères est intéressante lorsque vous devez exécuter sur votre serveur MySQL un script de création de tables par exemple. Il se peut dans ce cas que l’ordre de création des différentes tables ne soit pas « logique ».

J’entends par là qu’une table A peut contenir une contrainte basée sur une clé étrangère référençant le champ d’une table B… qui n’existe pas encore ! La « logique » voudrait que les tables soient inscrites dans le script selon les liens qui existent entre elles mais cela n’est pas toujours le cas.

Cette opération de …

[Lire plus]
Sauvegarder ses procédures stockées avec mysqldump

Une fois n’est pas coutume, un billet qui se lit en 10s :

Pour exporter vos procédures stockées grâce à mysqldump, n’oubliez pas l’option -R. Sans elle votre prochaine restauration risque de vous apporter quelques surprises. Si les triggers sont bien sauvegardés par défaut, il n’en va pas de même pour les procédures stockées.

Ainsi :
mysqldump -umy_user -p MY_DB MY_TABLE1 MY_TABLE2 > /tmp/dump_my_db.sql

… Sauvegardera bien les tables MY_TABLE1 et MY_TABLE2 de la base MY_DB, mais pas les procédures stockées…

L’option -R permet de sauvegarder cette fois vos bases, procédures stockées comprises :

mysqldump -umy_user -p -R MY_DB MY_TABLE1 MY_TABLE2 > /tmp/dump_my_db.sql

Pour ne sauvegarder que vos procédures stockées, utilisez par …

[Lire plus]
le trigger au secours des function-based index (FBI)

Constat : les FBI (function-based index) ne sont pas disponibles en MySQL.

Comment faire dans ce cas pour obtenir par exemple l’équivalent de l’index suivant ?

CREATE INDEX idx_str_len ON my_table (length(str));

Une des solutions les plus simples consiste à utiliser un trigger qui assurera la mise à jour d’une colonne supplémentaire que l’on créera dans la table cible.

Partons de la table suivante :

CREATE TABLE `t` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`date` timestamp NOT NULL,
`str` varchar(100) NOT NULL default '0',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

Le but est de pouvoir obtenir une réponse rapide à la requête suivante :

select sql_no_cache count(*) from t where length(str) …

[Lire plus]
surveillez vos my.cnf : can’t find message file share/english/errmsg.sys

Oui je me suis fait avoir, oui je suis parti en mode R&D pour comprendre d’où sortait cette erreur sans cause apparente, oui j’ai tenté de bidouiller mon my.cnf pour rajouter la variable “language” et définir ainsi le path vers ce fameux “errmsg.sys” inconnu au bataillon de mon serveur MySQL…

Faute avouée est à demi-pardonnée, alors autant dire que publiée sur un blog elle est carrément excusée

“L’astuce” est donc la suivante :

Vérifiez que vos “clients” MySQL lisent bien le bon my.cnf… La doc ne fait pourtant pas mystère de la façon dont les fichiers de configuration (my.cnf en tête de gondole) sont lus.

“If multiple instances of a given option are found, the last instance takes precedence.” Autrement dit, le dernier qui parle à raison et mon …

[Lire plus]
Liens symboliques et fichiers temporaires sous MyISAM

Récemment confronté à des problèmes ponctuels d’espace disque sur un serveur gros consommateur de ce type de ressources (datawarehouse), j’ai dû temporairement jongler entre différentes partitions afin de permettre au serveur MySQL de continuer à fonctionner.

Le problème :
La partition accueillant le répertoire d’installation standard de notre MySQL arrivant à saturation, il devenait impossible de passer certaines commandes dont le ALTER TABLE. Celle-ci nécessite en effet la plupart du temps (pour MyISAM) la création de fichiers temporaires (.MYD, .MYI, .frm) dont les tailles sont semblables à celles des fichiers initiaux (aux modifications de structure près). Le hic : la taille restante sur cette partition ne permettait pas la création de tels fichiers.

Sur une table de plusieurs centaines de millions de lignes, pesant quelques dizaines de Go, un ALTER TABLE prend souvent plusieurs …

[Lire plus]
Encore une question réccurente…

Bonjour à tous, c’est mon 1er post de l’année 2009, donc je vous souhaite à tous mes meilleurs voeux pour cette nouvelle année… Après 15 jours sans accés au réseau ( oui cela m’arrive une fois l’an ) me voila de retour en ligne. Comme le signalait arnaud, j’espère rencontrer le maximum de personne à Paris pour la soirée Open Source. En attendant, faisons un peu de MySQL!
La question du jour m’a été posée par mon ami Geoff et c’est une question assez simple. Comment mettre les differentes valeurs d’une colonne sur une ligne?

Sans rentrer dans les détails, nous avons une simple table qui stocke différents métrics mesurés sur plusieurs serveurs. Nous avons à faire une application de monitoring.

mysql> desc default_summary;

[Lire plus]
Les covering index, de la théorie à la pratique avec MyISAM et InnoDB

Pour faire suite au dernier schéma sur les structures comparées d’un index MyISAM et InnoDB, ce billet a pour but de détailler une optimisation nommée covering index.
On appelle ainsi un index lorsqu’il “couvre” l’intégralité des données recherchées et évite ainsi un parcours des enregistrements souvent basé sur des random I/O, spécialement couteux sur disque.

A propos des random I/O, voici un court extrait d’un billet précédent sur les SSD :

Sur un disque classique un “random read” entraîne (du plus couteux au moins couteux) :
- le déplacement de la tête de lecture/écriture sur la bonne piste (”seek time”)
- une fois la tête sur …

[Lire plus]
Cardinalité, sélectivité et distributivité d’un index MySQL : quel impact sur le plan d’exécution ?

Nouveau volet de notre série consacrée aux index, la notion de sélectivité d’un index est ici à l’honneur.
Souvenez-vous du billet précédent : notre table de test contient 1 million de lignes et un champ “flag” à la cardinalité très faible : 2.

Cardinalité ? Sélectivité ? Avant d’aller plus loin, deux définitions s’imposent. Tout d’abord la cardinalité d’un index : c’est le nombre de valeurs uniques qu’il contient.

La sélectivité d’un index se calcule elle de la façon suivante :

Selectivité = Cardinalité(Idx) / Nombre total d’enregistrements dans la table
Résultat des courses notre index à une sélectivité de 2 /1 000 000 = 2e-6, …

[Lire plus]
Générer un jeu de données : shell, mysqlslap, et procédure stockée

Le prochain article de notre série consacrée aux index MySQL approche et j’ai besoin pour ce prochain épisode de générer une table de test de la forme suivante :

CREATE TABLE `t` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`date` timestamp NOT NULL,
`flag` tinyint(4) NOT NULL default '0',
PRIMARY KEY  (`id`),
KEY `flag` (`flag`)
) ENGINE=MyISAM;


La structure est définie, reste à alimenter la table, disons 1 million d’enregistrements.

La valeur du champ “flag” est importante pour nos tests ultérieurs, sa valeur doit pour le moment être comprise entre 0 et 1, le tout à peu près uniformément distribué.

La requête sera la suivante :

INSERT INTO test.t (flag) VALUES (ROUND(RAND()));

Il faut maintenant …

[Lire plus]
Installation du MySQL Cluster

Le but de ce billet est d’installer rapidement une configuration permettant de tester le cluster MySQL.
Il existe plusieurs façons de faire, en voici une basée sur les binaires de la dernière version à ce jour, la cluster 6.2.15. Rappelez-vous que depuis la version 5.1.25 de MySQL, les binaires du cluster ne sont plus inclus mais disposent de leur propre branche.

Haute disponibilité (redondance), montée en charge et haute performance (données en mémoire vive), une architecture en “shared-nothing” (aucun élément du cluster ne partage le même hardware) et un serveur mysql doté d’un nouveau moteur de stockage (NDB encore appelé NDBCLUSTER), voici quelques caractéristiques du cluster MySQL. Voyons comment l’installer en un minimum …

[Lire plus]