Le log binaire a remplacé l'ancien log de modifications, qui ne sera plus disponible à partir de MySQL version 5.0. Le log binaire contient toutes les informations du log de modifications, dans un format plus efficace, et compatible avec les transactions.
Le log binaire, comme le log de modifications, contient toutes
les requêtes qui modifient les données. Ainsi, une commande
UPDATE
ou DELETE
avec une
clause WHERE
qui ne trouve aucune ligne ne
sera pas écrite dans le log. Les commandes
UPDATE
qui donnent à une colonne sa valeur
courante sont même évitées.
Le log binaire contient aussi des informations sur le temps d'exécution de la requête dans la base. Il ne contient que des commandes qui modifient des données. Si vous voulez avoir toutes les commandes (par exemple, si vous identifiez un problème de requête, vous devez utiliser le log de requête général. See Section 5.9.2, « Le log général de requêtes ».
Le but principal de ce log est de pouvoir reprendre les modifications de la base durant les opérations de restaurations, car le log binaire contiendra les requêtes qui ont eu lieu après une sauvegarde.
Le log binaire est aussi utilisé lorsque de la réplication d'un maître par un esclave. See Chapitre 6, Réplication de MySQL.
L'utilisation du log binaire ralentit le serveur d'environ 1%. Cependant, les avantages du log binaire durant les opérations de restauration et pour la réplication sont généralement plus intéressants.
Lorsque l'option de démarrage
--log-bin[=file_name]
est utilisée,
mysqld
écrit un fichier de log contenant
toutes les commandes SQL qui modifient les données. Si aucun
nom de fichier n'est donné, le nom de la machine hôte est
utilisé, suivi de -bin
. Si un nom est
donné, mais qu'il ne contient pas de chemin, le fichier sera
écrit dans le dossier de données.
Si vous fournissez une extension à
--log-bin=filename.extension
, l'extension sera
automatiquement supprimée.
mysqld
va ajouter une extension au nom du
fichier de log binaire qui est un nombre automatiquement
incrémenté chaque fois que vous exécutez mysqladmin
refresh
, mysqladmin flush-logs
,
FLUSH LOGS
ou redémarrez le serveur. Un
nouveau fichier de log sera automatiquement créé lorsque le
fichier en cours atteint la taille de
max_binlog_size
. Un fichier de log binaire
peut être plus grand que max_binlog_size
si
vous utilisez de grandes transactions : une transaction est
écrite dans le log binaire d'un seul coup, et n'est jamais
répartie entre plusieurs fichiers.
Pour être capable de faire la différence entre les fichiers de
logs binaire utilisés, mysqld
crée aussi un
fichier d'index de logs, qui porte le même nom que le fichier
de log, mais avec l'extension '.index'
. Vous
pouvez changer le nom du fichier de log avec l'option
--log-bin-index=[file_name]
. N'éditez pas
manuellement ce fichier durant l'exécution de
mysqld
; cela va induire
mysqld
en erreur.
Vous pouvez effacer tous les fichiers de log avec la commande
RESET MASTER
, ou seulement certains d'entre
eux avec PURGE MASTER LOGS
. Voyez
Section 13.5.4.5, « Syntaxe de la commande RESET
» et
Section 13.6.1, « Requêtes SQL pour contrôler les maîtres de réplication ».
Vous pouvez utiliser les options suivantes avec
mysqld
pour modifier ce qui est enregistré
dans le fichier de log :
binlog-do-db=database_name
Indique au maître qu'il doit enregistrer les modifications
si la base courante (c'est à dire, celle qui est
sélectionnée par USE
) est
db_name
. Toutes les autres bases de
données qui ne sont pas explicitement mentionnées sont
ignorées. Si vous utilisez cette option, assurez vous que
vous ne faites des modifications que dans la base courante.
Un exemple qui ne fonctionnera pas comme on pourrait
l'attendre : Si le serveur est lancé avec l'option
binlog-do-db=sales
, et que vous utilisez
USE prices; UPDATE sales.january SET
amount=amount+1000;
, cette commande ne sera pas
écrite dans le fichier de log binaire.
binlog-ignore-db=database_name
Indique au maître qu'il doit ne doit pas enregistrer les
modifications si la base courante (c'est à dire, celle qui
est sélectionnée par USE
) est
db_name
. Si vous utilisez cette option,
assurez vous que vous ne faites des modifications que dans
la base courante.
Un exemple qui ne fonctionnera pas comme on pourrait
l'attendre : Si le serveur est lancé avec l'option
binlog-ignore-db=sales
, et que vous
utilisez USE prices; UPDATE sales.january SET
amount=amount+1000;
, cette commande sera écrite
dans le fichier de log binaire.
Pour ignorer ou forcer plusieurs bases, spécifiez l'option plusieurs fois, une fois par base.
Les règles suivante sont utilisées dans l'ordre suivant, pour décider si la requête doit aller dans le log binaire ou pas :
Y a-t-il des règles binlog-do-db
ou
binlog-ignore-db
?
Non : écrit la requête dans le log binaire, et quitte.
Oui : aller à l'étape suivante.
Il y a des règles (binlog-do-db
ou
binlog-ignore-db
ou les deux). Y a t il
une base de données courante (une base sélectionnée avec
la commande USE
)?
Non : N'écrit pas la requête, et quitte.
Oui : aller à l'étape suivante.
Il y a une base de données courante. Y a-t-il des règles
binlog-do-db
?
Oui : Est-ce que la base de données courante vérifie
une des règles binlog-do-db
?
Oui : écrit la requête dans le log binaire, et quitte.
Non : N'écrit pas la requête, et quitte.
Non : aller à l'étape suivante.
Il y a des règles binlog-ignore-db
.
Est-ce que la base de données courante vérifie une des
règles binlog-ignore-db
?
Oui : N'écrit pas la requête, et quitte.
Non : écrit la requête dans le log binaire, et quitte.
Par exemple, un esclave qui fonctionne avec l'option
binlog-do-db=sales
ne va pas écrire dans le
log binaire les commandes qui concernent d'autres bases que
sales
(en d'autres termes, l'option
binlog-do-db
peut être considéré comme
``ignore les autres bases'').
Si vous utilisez la réplication, vous ne devez pas effacer les
anciens log binaires jusqu'à ce que vous soyez sûrs que les
esclaves n'en auront plus besoin. Une fa¸on de faire cela est
d'utiliser la commande mysqladmin flush-logs
une fois par jour, et d'effacer les fichiers de log qui ont plus
de trois jours. Vous pouvez les supprimer manuellement, ou
utilisez de préférence la commande PURGE MASTER LOGS
TO
(see Section 13.6, « Commandes de réplication ») qui va
aussi modifier le fichier de log binaires pour vous depuis MySQL
4.1.
Un client avec le droit de SUPER
peut
désactiver le log binaire pour ses commandes avec SET
SQL_LOG_BIN=0
. See Section 13.5.2.8, « Syntaxe de SET
».
Vous pouvez examiner le fichier de log binaire avec la commande
mysqlbinlog
. Par exemple, vous pouvez mettre
à jour le serveur MySQL depuis la ligne de commande comme
ceci :
shell> mysqlbinlog log-file | mysql -h server_name
Vous pouvez aussi utiliser le programme
Section 8.5, « mysqlbinlog
, Exécuter des requêtes dans le log
binaire » pour lire le fichier de log
binaire directement dans le serveur MySQL.
Si vous utilisez les transactions, vous devez utiliser le fichier de log binaire pour les sauvegardes, plutôt que le vieux fichier de log de modifications.
L'enregistrement dans le fichier de log binaire est fait immédiatement après l'achèvement de la requête, mais avant la libération des verrous ou la validation de la requête. Cela garantit que les requêtes seront enregistrées dans l'ordre d'exécution.
Les modifications dans les tables non transactionnelles sont
enregistrées dans le fichier de log binaire immédiatement
après exécution. Pour les tables transactionnelles comme
BDB
ou InnoDB
, toutes les
modifications (UPDATE
,
DELETE
ou INSERT
) qui
modifient les tables sont mises en cache jusqu'à ce qu'une
commande COMMIT
ne les envoie au serveur. A
ce moment, mysqld
écrit la totalité de la
transaction dans le log binaire, avant d'appliquer la commande
COMMIT
. Tous les threads vont, au démarrage,
allouer un buffer de la taille de
binlog_cache_size
octets pour enregistrer les
requêtes. Si la requête est plus grande que ce buffer, le
thread va ouvrir un fichier temporaire pour écrire la
transaction. Le fichier temporaire sera supprimé dès que le
thread se termine.
L'option max_binlog_cache_size
(par défaut
4Go) peut être utilisé pour limiter la taille utilisée pour
mettre en cache une transaction multi-requête. Si la
transaction est plus grande que que cette taille, elle sera
annulée.
Si vous utilisez les log de modification ou binaire, les
insertions concurrentes seront converties en insertions normales
lors de l'utilisation de CREATE ... SELECT
ou
INSERT ... SELECT
. Cela garantit que vous
pourrez recréer une copie exacte de la table en appliquant les
même commandes sauvegardées.
Le format de log binaire est différent entre les versions 3.23, 4.0 et 5.0.0. Ces changements de formats sont nécessaires pour améliorer la réplication. MySQL 4.1 a le même format de log binaire que 4.0. See Section 6.5, « Compatibilité de la réplication entre les versions de MySQL ».
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.