mysqladmin , administration d'un serveur MySQL
<<<
mysqlbinlog , Exécuter des requêtes dans le log binaire mysqlcc , MySQL Control Center
>>>

8 MySQL Scripts clients et utilitaires
 Manuel de Référence MySQL 4.1 : Version Française

Présentation des scripts serveurs et utilitaires
myisampack , le générateur de tables MySQL compressées en lecture seule
mysql , l'outil en ligne de commande
mysqladmin , administration d'un serveur MySQL
->mysqlbinlog , Exécuter des requêtes dans le log binaire
mysqlcc , MySQL Control Center
Utiliser mysqlcheck pour l'entretien et la réparation
mysqldump , sauvegarde des structures de tables et les données
mysqlhotcopy , copier les bases et tables MySQL
mysqlimport , importer des données depuis des fichiers texte
Afficher les bases, tables et colonnes
perror , expliquer les codes d'erreurs
L'utilitaire de remplacement de chaînes replace

8.5 mysqlbinlog , Exécuter des requêtes dans le log binaire

Les fichiers de log sont écrits dans un format binaire. Vous pouvez éxaminer le log binaire avec l'utilitaire mysqlbinlog . Il est disponible depuis MySQL 3.23.14.

Appelez mysqlbinlog comme ceci :


shell> mysqlbinlog [options] log-file ...
Par exemple, pour afficher le contenu du fichier de log binaire binlog.000003 , utilisez cette commande :

shell> mysqlbinlog binlog.0000003
Le résultat est toutes les requêtes contenues dans le fichier de log binaire binlog.000003 , avec différentes informations (durée de la requête, identifiant du thread qui l'a émise, timestamp d'émission, etc.).Normalement, vous utilisez mysqlbinlog pour lire les fichiers de log directement, et les envoyer au serveur MySQL local. Il est aussi possible de lire le fichier binaire sur un serveur distant en utilisant l'option --read-from-remote-server . Cependant, c'est une technique abandonnée, car nous préférons rendre plus simple l'utilisation des logs binaires sur un serveur MySQL local.

Lorsque vous lisez des logs binaires distants, les options de connexion peuvent être données pour indiquer comment se connecter au serveur, mais ils sont ignorés à moins que vous ne spécifiez aussi l'option --read-from-remote-server . Ces options sont --host , --password , --port , --protocol , --socket et --user .

Vous pouvez aussi utiliser mysqlbinlog pour relayer des fichiers de log écrits par un serveur esclave, dans une architecture de réplication. Les logs de relais sont au même format que le log binaire.

Le log binaire est présenté en détails dans la section Le log binaire des mises à jour .

mysqlbinlog supporte les optiosn suivantes :
    --help, -?
    Affiche cette aide et quitte.
    --database=db_name, -d db_name
    Limite les lignes à cette base de données (log local uniquement).
    --force-read, -f
    Continue même si vous obtenez une erreur SQL.
    --host=host_name, -h host_name
    Lit le log binaire depuis le serveur MySQL distant.
    --local-load=path, -l path
    Prépare les fichiers temporaires destinés aux commandes LOAD DATA INFILE dans le dossier spécifié.
    --offset=N, -o N
    Ignore les N première lignes.
    --password[=password], -p[password]
    Le mot de passe utilisé lors de la connexion sur le serveur. S'il n'est pas donné en ligne de commande, il sera demandé interactivement. Notez que si vous utilisez la forme courte -p , vous ne devez pas laisser d'espace entre l'option et le mot de passe.
    --port=port_num, -P port_num
    Le numéro de port TCP/IP pour la connexion.
    --position=N, -j N
    Comment la lecture dans le log binaire à la position N .
    --protocol={TCP | SOCKET | PIPE | MEMORY}
    Spécifie le protocole de connexion à utiliser. Nouveau en MySQL version 4.1.
    --read-from-remote-server, -R
    Read the binary log from a MySQL server. Les options de connexion distantes seront ignorées à moins que cette option ne soit donné. Ces options sont --host , --password , --port , --protocol , --socket et --user .
    --result-file=name, -r name
    Export direct vers le fichier spécifié.
    --short-form, -s
    Affiche uniquement les commandes du log, sans les informations supplémentaires.
    --socket=path, -S path
    Le fichier de socket à utiliser pour la connexion.
    --user=user_name, -u user_name
    Le nom d'utilisateur MySQL lors de la connexion à distance.
    --version, -V
    Affiche la version et quitte.
Vous pouvez aussi configurer les variables suivantes avec l'option --var_name=value :
    open_files_limit
    Spécifie le nombre de pointeurs de fichiers à réserver.
Vous pouvez envoyer le résultat de mysqlbinlog vers un client mysql avec un pipe : c'est une technique pour restaurer le serveur après un crash ( Sauvegardes de base de données ) :

shell> mysqlbinlog hostname-bin.000001 | mysql
ou :

shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Vous pouvez aussi rediriger le résultat de mysqlbinlog dans un fichier texte, modifier ce fichier (supprimer les requêtes qui vous gênent), puis exécuter ces requêtes, depuis le fichier, avec mysql . Après edition du fichier, exécutez les commandes qu'il contient comme d'habitude, avec le programme mysql .

mysqlbinlog dispose de l'option --position qui affiche les requêtes du log binaire à partir de la position spécifiée.

Si vous avez plus d'un fichier de log binaire à exécuter sur le serveur MySQL, la méthode sûre est de tout faire avec la même connexion MySQL. Voici la méthode dangeureuse :

shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!
shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!
Cela va causer des problèmes si le premier log contient des commandes de type CREATE TEMPORARY TABLE et que le second contient des requêtes d'utilisation de cette table : lorsque le premier mysql termine son exécution, il va détruire la table, et le second va rencontrer des erreurs ``unknown table''. Pour éviter cela, utilisez une seule connexion, surtout si vous utilisez des tables temporaires. Voici deux méthodes possibles :

shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
La seconde méthode :

shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"
Depuis MySQL 4.0.14, mysqlbinlog peut préparer des requêtes valides pour mysql , afin d'il utilise la commande LOAD DATA INFILE depuis le log binaire. COmme le log contient les données à charger (c'est vrai depuis MySQL 4.0; MySQL 3.23 n'inscrivait pas les données à charger dans le log binaire, et le fichier original était nécessaire pour éxécuter le contenu du log binaire), mysqlbinlog va copier ces données dans un fichie temporaire et émettre une commande LOAD DATA INFILE pour que mysql le charge. Le dossier du fichier temporaire est le dossier temporaire par défaut : il peut être modifié avec l'option local-load de mysqlbinlog .

Comme mysqlbinlog convertit les commandes LOAD DATA INFILE en commandes LOAD DATA LOCAL INFILE (c'est à dire qu'il ajoute LOCAL ), le client et le serveur que vous utilisez pour traiter les commandes doivent être configuré pour autoriser l'option LOCAL . Problèmes de sécurité avec LOAD DATA LOCAL .

ATTENTION : lorsque vous exécutez mysqlbinlog sur un fichier binaire, il va créer un fichier temporaire pour chaque commande LOAD DATA INFILE . Ces fichiers ne seront pas automatiquement effacés, car vous en aurez besoin lorsque vous exécuterez les commandes SQL générées. Il faudra les effacer manuellement lorsque vous n'en aurez plus besoin. Les fichiers portent le nom de temporary-dir/original_file_name-#-# .

Dans le futur, nous allons corriger ce problème, en permettant à mysqlbinlog de se connecter directement au serveur mysqld . Dans ce cas, nous pourrons supprimer tranquillement les fichiers de log, lorsqu'ils auront été utilisés.

Avant MySQL 4.1, mysqlbinlog ne pouvait pas préparer de log SQL pour mysql lorsque le log binaire contenait des requêtes de différents threads, utilisant des tables temporaires de même nom, si les requêtes étaient mélangées. Ceci est corrigé en MySQL 4.1.

<< mysqlbinlog , Exécuter des requêtes dans le log binaire >>
mysqladmin , administration d'un serveur MySQL MySQL Scripts clients et utilitaires mysqlcc , MySQL Control Center