| 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 : 
 Par exemple, pour afficher le contenu du fichier de log binaire
 
binlog.000003
 , utilisez cette commande :| 
shell> mysqlbinlog [options] log-file ...
 | 
 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.| 
shell> mysqlbinlog binlog.0000003
 | 
 
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 : 
Vous pouvez aussi configurer les variables suivantes avec l'option 
 
--var_name=value
  :
     --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 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 ) :
     open_files_limit
    
      Spécifie le nombre de pointeurs de fichiers à réserver.
      ou :| 
shell> mysqlbinlog hostname-bin.000001 | 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
 .| 
shell> mysqlbinlog hostname-bin.[0-9]* | 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
  : 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 | mysql # DANGER!!shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!
 | 
 La seconde méthode :| 
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
 | 
 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
 .| 
shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sqlshell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
 shell> mysql -e "source /tmp/statements.sql"
 | 
 
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. |