Table des matières
1,binlog日志的困扰,先看下日志格式
2,测试例子:
3,查看binlog,打开是乱码模式,看不到执行的sql语句,如下所示
4,google,得知可以用–base64-output=DECODE-ROWS -v查看出来sql语句,如下所示
5,问题分析
4.1 REPEATABLE-READ和STATEMENT测试结果
4.2 REPEATABLE-READ和MIXED测试结果
Maison base de données tutoriel mysql mysqlbinlog解析binlog乱码问题解密

mysqlbinlog解析binlog乱码问题解密

Mar 31, 2017 pm 04:51 PM

发现mysql库的binlog日志出来都是乱码,如下所示:
BINLOG ’
IXZqVhNIAAAALQAAAGcBAAAAAHoAAAAAAAEABHRlc3QAAno0AAEDAABUOcnY
IXZqVh5IAAAAKAAAAI8BAAAAAHoAAAAAAAEAAgAB//4BAAAAcu+UpA==,如果强行用-v出来也得不到具体执行的sql语句,这个问题困扰了很近,今天深入研究才发现核心问题所在。


1,binlog日志的困扰,先看下日志格式

mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name                           | Value                |
+-----------------------------------------+----------------------+
| binlog_cache_size                       | 1048576              |
| binlog_checksum                         | CRC32                |
| binlog_direct_non_transactional_updates | OFF                  |
| binlog_format                           | MIXED                |
| binlog_max_flush_queue_time             | 0                    |
| binlog_order_commits                    | ON                   |
| binlog_row_image                        | FULL                 |
| binlog_rows_query_log_events            | OFF                  |
| binlog_stmt_cache_size                  | 32768                |
| innodb_api_enable_binlog                | OFF                  |
| innodb_locks_unsafe_for_binlog          | OFF                  |
| max_binlog_cache_size                   | 18446744073709547520 |
| max_binlog_size                         | 1073741824           |
| max_binlog_stmt_cache_size              | 18446744073709547520 |
| sync_binlog                             | 1                    |
+-----------------------------------------+----------------------+
15 rows in set (0.01 sec)

mysql>
Copier après la connexion

日志格式是MIXED的,这个表示一些特殊的uuid以及now()之类会记录成row,其它的仍然是记录sql模式。


2,测试例子:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table z4 select 1 as a;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into z4 select 2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql>
Copier après la connexion

blog为csdn博主黄杉(mchdba)所有,原地址为:http://blog.csdn.net/mchdba/article/details/50300035,谢绝转载。


3,查看binlog,打开是乱码模式,看不到执行的sql语句,如下所示

[[email protected] binlog_new]# ll
总用量 32
-rw-rw----. 1 mysql mysql   143 12月 10 21:09 mysql-bin.000001
-rw-rw----. 1 mysql mysql 17549 12月 11 15:06 mysql-bin.000002
-rw-rw----. 1 mysql mysql   618 12月 11 15:07 mysql-bin.000003
-rw-rw----. 1 mysql mysql   135 12月 11 15:06 mysql-bin.index
[[email protected] binlog_new]# /usr/local/mysql/bin/mysqlbinlog mysql-bin.000003
/*!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
#151211 15:06:46 server id 72  end_log_pos 120 CRC32 0x9961ff72     
Start: binlog v 4, server v 5.6.12-log created 151211 15:06:46
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
BnZqVg9IAAAAdAAAAHgAAAABAAQANS42LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAXL/
YZk=
'/*!*/;
# at 120
#151211 15:07:13 server id 72  end_log_pos 192 CRC32 0x3ea43b0e     
Query   thread_id=732   exec_time=0 error_code=0
SET TIMESTAMP=1449817633/*!*/;
SET @@session.pseudo_thread_id=732/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, 
@@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 192
#151211 15:07:13 server id 72  end_log_pos 314 CRC32 0xcaec51ae     
Query   thread_id=732   exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1449817633/*!*/;
CREATE TABLE `z4` (
  `a` int(1) NOT NULL DEFAULT '0'
)
/*!*/;
# at 314
#151211 15:07:13 server id 72  end_log_pos 359 CRC32 0xd8c93954     
Table_map: `test`.`z4` mapped to number 122
# at 359
#151211 15:07:13 server id 72  end_log_pos 399 CRC32 0xa494ef72     
Write_rows: table id 122 flags: STMT_END_F

BINLOG '
IXZqVhNIAAAALQAAAGcBAAAAAHoAAAAAAAEABHRlc3QAAno0AAEDAABUOcnY
IXZqVh5IAAAAKAAAAI8BAAAAAHoAAAAAAAEAAgAB//4BAAAAcu+UpA==
'/*!*/;
# at 399
#151211 15:07:13 server id 72  end_log_pos 430 CRC32 0xd1ab5b55     
Xid = 6908
COMMIT/*!*/;
# at 430
#151211 15:07:20 server id 72  end_log_pos 502 CRC32 0xdfc3212d     
Query   thread_id=732   exec_time=0 error_code=0
SET TIMESTAMP=1449817640/*!*/;
BEGIN
/*!*/;
# at 502
#151211 15:07:20 server id 72  end_log_pos 547 CRC32 0xc59aab0e     
Table_map: `test`.`z4` mapped to number 122
# at 547
#151211 15:07:20 server id 72  end_log_pos 587 CRC32 0x648b02a4     
Write_rows: table id 122 flags: STMT_END_F

BINLOG '
KHZqVhNIAAAALQAAACMCAAAAAHoAAAAAAAEABHRlc3QAAno0AAEDAAAOq5rF
KHZqVh5IAAAAKAAAAEsCAAAAAHoAAAAAAAEAAgAB//4CAAAApAKLZA==
'/*!*/;
# at 587
#151211 15:07:20 server id 72  end_log_pos 618 CRC32 0x9b35600a     Xid = 6915
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[[email protected] binlog_new]#
Copier après la connexion

PS:大家看到/usr/local/mysql/bin/mysqlbinlog mysql-bin.000003解析出来的都是KHZqVhNIAAAALQAAACMCAAAAAHoAAAA这样的乱码格式。


4,google,得知可以用–base64-output=DECODE-ROWS -v查看出来sql语句,如下所示

[[email protected] binlog_new]# /usr/local/mysql/bin/mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000003
/*!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
#151211 15:06:46 server id 72  end_log_pos 120 CRC32 0x9961ff72     Start: binlog v 4, server v 5.6.12-log created 151211 15:06:46
# Warning: this binlog is either in use or was not closed properly.
# at 120
#151211 15:07:13 server id 72  end_log_pos 192 CRC32 0x3ea43b0e     Query   thread_id=732   exec_time=0 error_code=0
SET TIMESTAMP=1449817633/*!*/;
SET @@session.pseudo_thread_id=732/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 192
#151211 15:07:13 server id 72  end_log_pos 314 CRC32 0xcaec51ae     Query   thread_id=732   exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1449817633/*!*/;
CREATE TABLE `z4` (
  `a` int(1) NOT NULL DEFAULT '0'
)
/*!*/;
# at 314
#151211 15:07:13 server id 72  end_log_pos 359 CRC32 0xd8c93954     Table_map: `test`.`z4` mapped to number 122
# at 359
#151211 15:07:13 server id 72  end_log_pos 399 CRC32 0xa494ef72     Write_rows: table id 122 flags: STMT_END_F
### INSERT INTO `test`.`z4`
### SET
###   @1=1
# at 399
#151211 15:07:13 server id 72  end_log_pos 430 CRC32 0xd1ab5b55     Xid = 6908
COMMIT/*!*/;
# at 430
#151211 15:07:20 server id 72  end_log_pos 502 CRC32 0xdfc3212d     Query   thread_id=732   exec_time=0 error_code=0
SET TIMESTAMP=1449817640/*!*/;
BEGIN
/*!*/;
# at 502
#151211 15:07:20 server id 72  end_log_pos 547 CRC32 0xc59aab0e     Table_map: `test`.`z4` mapped to number 122
# at 547
#151211 15:07:20 server id 72  end_log_pos 587 CRC32 0x648b02a4     Write_rows: table id 122 flags: STMT_END_F
### INSERT INTO `test`.`z4`
### SET
###   @1=2
# at 587
#151211 15:07:20 server id 72  end_log_pos 618 CRC32 0x9b35600a     Xid = 6915
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[[email protected] binlog_new]#
Copier après la connexion

确实可以看到sql语句,不过都是row模式的,如下所示:

### INSERT INTO `test`.`z4`
### SET
###   @1=2
# at 587
Copier après la connexion

看到不到应用程序或者客户端执行的真正sql语句,这样也不利于进行业务分析数据分析,无助于对程序的优化。


5,问题分析

这样binlog日志格式MIXED都录制为乱码,那我将换成STATEMENT格式看看是否会持续乱码?,修改完my.cnf后,重启mysql数据库,开始建表测试,但是报错如下:

mysql> create table z3 select 1 as a;
ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since 
BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. 
InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
mysql>
Copier après la connexion

问题发现了,看到问题贺新郎,隔离级别太低了,我的默认隔离级别是READ-COMMITTED,所以导致binlog记录的必须都是row模式,解析出来的是乱码,强行用-v显示出来也是row模式,所以我将隔离级别升级为REPEATABLE-READ的话,就会有row格式也会有statement格式了。接下来为了用2个小实例来验证我的判断:


4.1 REPEATABLE-READ和STATEMENT测试结果

**所以我将隔离级别升级为REPEATABLE-READ,binlog设置为binlog_format=STATEMENT
如下所示:**

# Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
binlog_format=STATEMENT
Copier après la connexion

然后重启mysql,看binlog的记录形式是啥样的,如下所示:

BEGIN
/*!*/;
# at 219
# at 251
#151211 16:15:02 server id 72  end_log_pos 251 CRC32 0x4ea440db     Intvar
SET INSERT_ID=10550/*!*/;
#151211 16:15:02 server id 72  end_log_pos 435 CRC32 0xa37c5f2d     Query   thread_id=1 exec_time=0 error_code=0
use `parking_db`/*!*/;
SET TIMESTAMP=1449821702/*!*/;
INSERT INTO access_log.access_log VALUES(NULL,CONNECTION_ID(),NOW(),USER(),CURRENT_USER())
/*!*/;
# at 435
#151211 16:15:02 server id 72  end_log_pos 466 CRC32 0x2970e89a     Xid = 3
COMMIT/*!*/;
# at 466
#151211 16:16:22 server id 72  end_log_pos 569 CRC32 0xbe43b367     Query   thread_id=2 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1449821782/*!*/;
create table z4 select 1 as a
/*!*/;
# at 569
#151211 16:16:32 server id 72  end_log_pos 648 CRC32 0x69b2383c     Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1449821792/*!*/;
BEGIN
/*!*/;
# at 648
#151211 16:16:32 server id 72  end_log_pos 745 CRC32 0xcd1721a4     Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1449821792/*!*/;
insert into z4 select 2
/*!*/;
# at 745
#151211 16:16:32 server id 72  end_log_pos 776 CRC32 0xfc0dcfc4     Xid = 70
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[[email protected] binlog_new]#
Copier après la connexion

看到有类似的INSERT INTO access_log.access_log VALUES(NULL,CONNECTION_ID(),NOW(),USER(),CURRENT_USER())这里的一些函数最好用row模式,因为主从复制的时候,uuid已经now()等会造成时间延迟,故而为了数据一致性,statement格式不是最佳选择。


4.2 REPEATABLE-READ和MIXED测试结果

my.cnf里面修改设置:

transaction_isolation = REPEATABLE-READ
binlog_format=MIXED
Copier après la connexion

重启mysql数据库后,录入测试数据:

mysql> insert into z4 select 3;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> exit
Copier après la connexion

查看binlog数据,会看到insert into z4 select 3这条sql记录,表明在mixed模式下,解析出来的sql是正常的,有些now()已经uuid的直接解析成row格式了,如下所示:

[[email protected] binlog_new]# /usr/local/mysql/bin/mysqlbinlog 
--base64-output=DECODE-ROWS -v mysql-bin.000007
...
# at 274
#151211 16:21:02 server id 72  end_log_pos 368 CRC32 0x156a1c51     Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `access_log`.`access_log`
### SET
###   @1=10551
###   @2=1
###   @3=1449822062
###   @4='[email protected]'
###   @5='[email protected]%'
# at 368
#151211 16:21:02 server id 72  end_log_pos 399 CRC32 0x8254defe     Xid = 3
COMMIT/*!*/;
# at 399
#151211 16:21:25 server id 72  end_log_pos 478 CRC32 0xe252f5c7     Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1449822085/*!*/;
BEGIN
/*!*/;
# at 478
#151211 16:21:25 server id 72  end_log_pos 575 CRC32 0x34308ad6     Query   thread_id=2 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1449822085/*!*/;
insert into z4 select 3
/*!*/;
# at 575
#151211 16:21:25 server id 72  end_log_pos 606 CRC32 0x67c460eb     Xid = 61
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[[email protected] binlog_new]#
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment ouvrir phpmyadmin Comment ouvrir phpmyadmin Apr 10, 2025 pm 10:51 PM

Vous pouvez ouvrir PHPMYADMIN via les étapes suivantes: 1. Connectez-vous au panneau de configuration du site Web; 2. Trouvez et cliquez sur l'icône PHPMYADMIN; 3. Entrez les informations d'identification MySQL; 4. Cliquez sur "Connexion".

MySQL: une introduction à la base de données la plus populaire au monde MySQL: une introduction à la base de données la plus populaire au monde Apr 12, 2025 am 12:18 AM

MySQL est un système de gestion de la base de données relationnel open source, principalement utilisé pour stocker et récupérer les données rapidement et de manière fiable. Son principe de travail comprend les demandes des clients, la résolution de requête, l'exécution des requêtes et les résultats de retour. Des exemples d'utilisation comprennent la création de tables, l'insertion et la question des données et les fonctionnalités avancées telles que les opérations de jointure. Les erreurs communes impliquent la syntaxe SQL, les types de données et les autorisations, et les suggestions d'optimisation incluent l'utilisation d'index, les requêtes optimisées et la partition de tables.

Comment utiliser un seul fileté redis Comment utiliser un seul fileté redis Apr 10, 2025 pm 07:12 PM

Redis utilise une architecture filetée unique pour fournir des performances élevées, une simplicité et une cohérence. Il utilise le multiplexage d'E / S, les boucles d'événements, les E / S non bloquantes et la mémoire partagée pour améliorer la concurrence, mais avec des limites de limitations de concurrence, un point d'échec unique et inadapté aux charges de travail à forte intensité d'écriture.

Place de MySQL: bases de données et programmation Place de MySQL: bases de données et programmation Apr 13, 2025 am 12:18 AM

La position de MySQL dans les bases de données et la programmation est très importante. Il s'agit d'un système de gestion de base de données relationnel open source qui est largement utilisé dans divers scénarios d'application. 1) MySQL fournit des fonctions efficaces de stockage de données, d'organisation et de récupération, en prenant en charge les systèmes Web, mobiles et de niveau d'entreprise. 2) Il utilise une architecture client-serveur, prend en charge plusieurs moteurs de stockage et optimisation d'index. 3) Les usages de base incluent la création de tables et l'insertion de données, et les usages avancés impliquent des jointures multiples et des requêtes complexes. 4) Des questions fréquemment posées telles que les erreurs de syntaxe SQL et les problèmes de performances peuvent être déboguées via la commande Explication et le journal de requête lente. 5) Les méthodes d'optimisation des performances comprennent l'utilisation rationnelle des indices, la requête optimisée et l'utilisation des caches. Les meilleures pratiques incluent l'utilisation des transactions et des acteurs préparés

Pourquoi utiliser MySQL? Avantages et avantages Pourquoi utiliser MySQL? Avantages et avantages Apr 12, 2025 am 12:17 AM

MySQL est choisi pour ses performances, sa fiabilité, sa facilité d'utilisation et son soutien communautaire. 1.MySQL fournit des fonctions de stockage et de récupération de données efficaces, prenant en charge plusieurs types de données et opérations de requête avancées. 2. Adoptez l'architecture client-serveur et plusieurs moteurs de stockage pour prendre en charge l'optimisation des transactions et des requêtes. 3. Facile à utiliser, prend en charge une variété de systèmes d'exploitation et de langages de programmation. 4. Avoir un solide soutien communautaire et fournir des ressources et des solutions riches.

Comment se connecter à la base de données d'Apache Comment se connecter à la base de données d'Apache Apr 13, 2025 pm 01:03 PM

Apache se connecte à une base de données nécessite les étapes suivantes: Installez le pilote de base de données. Configurez le fichier web.xml pour créer un pool de connexion. Créez une source de données JDBC et spécifiez les paramètres de connexion. Utilisez l'API JDBC pour accéder à la base de données à partir du code Java, y compris l'obtention de connexions, la création d'instructions, les paramètres de liaison, l'exécution de requêtes ou de mises à jour et de traitement des résultats.

Moniteur Disd Droplet avec service d'exportateur Redis Moniteur Disd Droplet avec service d'exportateur Redis Apr 10, 2025 pm 01:36 PM

La surveillance efficace des bases de données Redis est essentielle pour maintenir des performances optimales, identifier les goulots d'étranglement potentiels et assurer la fiabilité globale du système. Le service Redis Exporter est un utilitaire puissant conçu pour surveiller les bases de données Redis à l'aide de Prometheus. Ce didacticiel vous guidera à travers la configuration et la configuration complètes du service Redis Exportateur, en vous garantissant de créer des solutions de surveillance de manière transparente. En étudiant ce tutoriel, vous réaliserez les paramètres de surveillance entièrement opérationnels

Comment démarrer MySQL par Docker Comment démarrer MySQL par Docker Apr 15, 2025 pm 12:09 PM

Le processus de démarrage de MySQL dans Docker se compose des étapes suivantes: Tirez l'image MySQL pour créer et démarrer le conteneur, définir le mot de passe de l'utilisateur racine et mapper la connexion de vérification du port Créez la base de données et l'utilisateur accorde toutes les autorisations sur la base de données

See all articles