Utilisez mysqlbinlog pour télécharger à distance les fichiers de journal binaire depuis un cluster PolarDB for MySQL et les analyser localement afin d'auditer les données, restaurer à un instant précis ou dépanner la réplication.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Activé la journalisation binaire pour le cluster PolarDB for MySQL. La journalisation binaire est désactivée par défaut. Sans elle,
SHOW BINARY LOGS;renvoieYou are not using binary logging. L'activation ou la désactivation de la journalisation binaire déclenche un redémarrage automatique du cluster ; effectuez cette modification pendant les heures creuses et assurez-vous que vos applications peuvent se reconnecter automatiquement.Un client MySQL installé sur votre serveur local.
L'endpoint du cluster (privé ou public). Consultez la rubrique Gérer les endpoints d'un cluster.
Un compte de base de données pour le cluster PolarDB for MySQL. Consultez la rubrique Créer et gérer un compte de base de données.
Fonctionnement
Le nœud qui sert les journaux binaires dépend de l'endpoint auquel vous vous connectez :
| Méthode de connexion | Source des journaux binaires |
|---|---|
| Endpoint principal, endpoint de cluster par défaut ou endpoint de cluster personnalisé associé au nœud principal | Nœud principal |
| Endpoint de cluster personnalisé associé uniquement aux nœuds en lecture seule | L'un des nœuds en lecture seule |
Le téléchargement des journaux binaires depuis un nœud en lecture seule nécessite :
PolarDB for MySQL 8.0, version de révision 8.0.1.1.12 ou ultérieure
PolarDB for MySQL 5.7, version de révision 5.7.1.0.12 ou ultérieure
Si la condition de version n'est pas remplie, mysqlbinlog renvoie Only allow to dump binary log file on primary instance. Consultez la rubrique Mise à jour des versions mineures pour effectuer la mise à niveau.
Télécharger les fichiers de journal binaire
-
Connectez-vous au cluster PolarDB depuis le client MySQL. Consultez la rubrique Connexion à la base de données.
root@xxx:~# mysql -h xxx-polardb.rwlb.rds.aliyuncs.com -P3306 -utest_api -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is xxx Server version: 8.0.13 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> -
Répertoriez les fichiers de journal binaire disponibles :
SHOW BINARY LOGS;La sortie liste le nom et la taille de chaque fichier journal :
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000005 | 2639 | +------------------+-----------+ 1 row in set (0.00 sec)Notez la valeur
Log_name; vous l'utiliserez à l'étape suivante. -
Quittez le client MySQL :
exit -
Exécutez mysqlbinlog pour télécharger le fichier de journal binaire sur votre serveur local. Format de la commande :
Paramètres :
Paramètre Description --read-from-remote-serverObligatoire. Se connecte au cluster en tant que client de réplication pour diffuser les journaux binaires à distance. --host/-hL'endpoint privé ou public du cluster. Utilisez un endpoint privé si le cluster et votre serveur se trouvent dans la même région et le même VPC ; sinon, utilisez un endpoint public. Si l'endpoint utilise un port non par défaut, ajoutez le numéro de port après l'endpoint. --user/-uLe nom du compte de base de données du cluster PolarDB for MySQL. --password/-pLe mot de passe du compte. Omettez la valeur pour la saisir de manière interactive après l'exécution de la commande. --rawEnregistre le journal binaire dans son format binaire d'origine au lieu de le convertir en texte. mysql-bin.<log-number>Le nom du fichier de journal binaire issu du champ Log_namede l'étape 2.mysqlbinlog -u<Username> -p<Password> -h<Endpoint> --read-from-remote-server --raw mysql-bin.******Exemple :
mysqlbinlog -utest_api -p -htest-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005mysql> exit Bye root@xxx:~# mysqlbinlog -utest_api -p -hxxx-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005 Enter password: root@xxx:~#
Afficher et analyser les fichiers de journal binaire
Exécutez mysqlbinlog sur le fichier téléchargé pour décoder et afficher son contenu :
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.<log-number> | more
-vv: affiche les instructions SQL détaillées et les modifications au niveau des lignes--base64-output=decode-rows: décode les événements de ligne encodés en base64 en SQL lisible
La sortie affiche le contenu décodé de chaque événement dans le fichier de journal binaire :
[root@iZ ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread id=584632 exec time=0 error code=0
SET TIMESTAMP=1455721478/*!*/;
SET @@session.pseudo_thread_id=584632/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=2097152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 171
Utilisez la même version MySQL que la version du moteur de base de données du cluster PolarDB pour éviter les erreurs d'analyse.
Pour connaître la syntaxe complète et les options de mysqlbinlog, consultez la documentation MySQL.
FAQ
Pourquoi SHOW BINARY LOGS renvoie-t-il « You are not using binary logging » ?
La journalisation binaire est désactivée par défaut. Activez la journalisation binaire pour le cluster et réessayez.
L'activation ou la désactivation de la journalisation binaire déclenche un redémarrage automatique du cluster.
Pourquoi mysqlbinlog échoue-t-il avec une erreur de vérification de cohérence ou de somme de contrôle ?
ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 151, event_type: 35
ERROR: Could not read entry at offset 120: Error in log format or read error.
ERROR: Got error reading packet from server: 'Slave can not handle replication events with the checksum that master is configured to log;
Votre version de mysqlbinlog est trop ancienne. Effectuez une mise à niveau vers une version plus récente ; par exemple, si vous utilisez la V3.3, passez à la V3.4.
Pourquoi mysqlbinlog échoue-t-il avec l'erreur « Lost connection to MySQL server » ?
ERROR: Failed on connect: Lost connection to MySQL server at 'reading initial communication packet', system error: 104
Vérifiez les points suivants :
Connectivité réseau : Vérifiez que vous pouvez atteindre l'endpoint du cluster depuis votre serveur.
Liste d'autorisation IP : Assurez-vous que l'adresse IP de votre serveur est ajoutée à la liste d'autorisation du cluster. Consultez la rubrique Configurer une liste d'autorisation IP.
Paramètres de la base de données : Vérifiez si votre serveur MySQL local peut se connecter aux bases de données et assurez-vous que vous pouvez y accéder avec succès.
Pourquoi le contenu des fichiers de journal binaire n'est-il pas décodé ?
Si vous exécutez mysqlbinlog sans --base64-output=decode-rows, les événements de ligne s'affichent sous forme de chaînes brutes en base64 :
Voici un exemple de sortie de journal binaire non décodée lorsque --base64-output=decode-rows n'est pas utilisé. Les instructions BINLOG contiennent des données encodées en base64 qui n'ont pas été analysées :
[root@iz ~]# mysqlbinlog -vv mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
BINLOG '
BYzEVg9PhBGnZwAAAGsAAAAAAAAQANS41LjE4LjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAAA==
'/*!*/;
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread_id=584632 exec_time=0 error_code=0
Incluez toujours --base64-output=decode-rows lors de l'affichage des fichiers de journal binaire.
Pourquoi le message « Only allow to dump binary log file on primary instance » apparaît-il lors de la connexion à un nœud en lecture seule ?
La version de votre cluster ne répond pas à l'exigence minimale pour l'accès aux journaux binaires des nœuds en lecture seule. Effectuez une mise à niveau vers PolarDB for MySQL 8.0 révision 8.0.1.1.12 ou ultérieure, ou PolarDB for MySQL 5.7 révision 5.7.1.0.12 ou ultérieure. Consultez la rubrique Mise à jour des versions mineures.
Pourquoi les journaux binaires d'un nœud en lecture seule sont-ils parfois en retard par rapport au nœud principal ?
Le nœud principal réplique les fichiers de journal binaire vers les nœuds en lecture seule de manière asynchrone. En cas de latence de synchronisation, il se peut que les nœuds en lecture seule ne disposent pas encore des fichiers journaux les plus récemment écrits. Ce délai est généralement bref lorsque le volume de données est faible.
Pourquoi un fichier de journal binaire expiré n'est-il pas supprimé après la période de rétention binlog_expire_logs_seconds ?
Si un thread de nœud en lecture seule lit activement le fichier lorsqu'il expire, le système le conserve jusqu'à la fin de la lecture. Après que le nœud principal a écrit un nouveau fichier de journal binaire, le système recherche les fichiers expirés qui ne sont plus lus et les supprime.