Maison >base de données >tutoriel mysql >Décryptage MySQL -> Comment afficher l'instruction SQL la plus originale en mode journal binaire ROW

Décryptage MySQL -> Comment afficher l'instruction SQL la plus originale en mode journal binaire ROW

黄舟
黄舟original
2017-02-16 11:43:252478parcourir

Modèle

MySQLbinlogROW analyse

Après mysql5.6, cohérence des données maître-esclave Les exigences sont devenues plus élevées et le format de déclaration est progressivement moins adapté aux besoins de l'entreprise, de sorte que tout le monde dans l'environnement de production adopte le mode ligne. Le mode ligne est un module d'insertion qui transmet les modifications de données les plus faibles pour transmettre les données maître-esclave. dans binlog Quelle est la différence entre celui-ci et le mode instruction ordinaire ? Pouvez-vous voir la déclaration SQL originale ?

1, préparez-vous à saisir les données


mysql> create table test1(id int,c1 varchar(20),type int,address varchar(20),create_time datetime);
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into test1 select 1,'zhangsan','1','zhangsan road No 870,floor 602',now();
ERROR 1406 (22001): Data too long for column 'address' at row 1
mysql>
mysql> show create table test1;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                         |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test1 | CREATE TABLE `test1` (
  `id` int(11) DEFAULT NULL,
  `c1` varchar(20) DEFAULT NULL,
  `type` int(11) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> alter table test1 modify  `address` varchar(200) DEFAULT NULL;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> insert into test1 select 1,'zhangsan','1','zhangsan road No 870,floor 602',now();
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
 
mysql> insert into test1 select 2,'lisi','1','zhangsan road No 870,floor 602',now();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0
 
mysql>


 


mysql>  show binlog events in 'mysql-bin.000216';
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                             |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
| mysql-bin.000216 |   4 | Format_desc |        63 |         120 | Server ver: 5.6.12-log, Binlog ver: 4                                            |
| mysql-bin.000216 | 120 | Query       |        63 |         200 | BEGIN                                                                            || mysql-bin.000216 | 200 | Rows_query  |        63 |         302 | # insert into test1 select 3,'wanger','3','zhangsan road No 870,floor 603',now() || mysql-bin.000216 | 302 | Table_map   |        63 |         359 | table_id: 74 (test.test1)                                                        |
| mysql-bin.000216 | 359 | Write_rows  |        63 |         447 | table_id: 74 flags: STMT_END_F                                                   |
| mysql-bin.000216 | 447 | Xid         |        63 |         478 | COMMIT /* xid=208 */                                                             |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
 
mysql>


2, RangéeLe mode binlog est tronqué

En mode Row, l'instruction ddl dans le binlog s'affiche normalement, mais Le DML est tronqué, comme indiqué ci-dessous :

[root@hch_test_dbm1_121_63 binlog]# / usr /local/mysql/bin/mysqlbinlog mysql-bin.000215

…… # Le précédent est omis ici

#160722 17 :02 : 38 ID du serveur 62 end_log_pos 4291 CRC32 0x369e3244 Requête thread_id=60 exec_time=4294967271 error_code=0

SET TIMESTAMP=1469178158/*!*/;

CRÉER UNE BASE DE DONNÉES SI N'EXISTE PAS 'percona ` /* pt-table-checksum */

/*!*/;

# à 4291

#160722 17:02:38 identifiant du serveur 62 end_log_pos 5079 CRC32 0x8abc6e67 Requête thread_id =60 exec_time=4294967271 error_code=0

utilisez `percona`/*!*/;

SET TIMESTAMP=1469178158/*!*/;

CREATE TABLE IF NOT Existe `Percona`.`checksums` (

DB Char (64) Non nul,

TBL CHAR (64) Non nul,

chunk int non nul ,

chunk_time float NULL,

chunk_index varchar(200) NULL,

lower_boundary text NULL,

upper_boundary text NULL,

this_crc char( 40) NOT NULL,

this_cnt int NOT NULL,

master_crc char(40) NULL,

master_cnt int NULL,

ts timestamp NON NULL PAR DÉFAUT CURRENT_TIMESTAMP SUR UPDATE CURRENT_TIMESTAMP,

CLÉ PRIMAIRE (db, tbl, chunk),

INDEX ts_db_tbl (ts, db, tbl)

) ENGINE=InnoDB

/*!*/;

# à 5079

#160820 10:21:10 identifiant du serveur 63 end_log_pos 5280 CRC32 0xd147bd8e Requête thread_id=16 exec_time=0​ error_code= 0

SET TIMESTAMP=1471659670/*!*/;

SET @@session.sql_mode=1075838976/*!*/;

ACCORDER TOUS LES PRIVILÈGES SUR *.* À 'tim' @'192.168%' IDENTIFIÉ PAR MOT DE PASSE '*2976819BD2CCD13612E03F812A2CD297C1A18B23'

/*!*/;

# au 5280

#160820 10 : 22h40 identifiant du serveur 63 end_log_pos 5445 CRC32 0x85811be7 Requête thread_id=18 exec_time=0 error_code=0

utilisez `test`/*!*/;

SET TIMESTAMP=1471659760/*!*/;

créer une table test1(id int,c1 varchar(20),type int,adresse varchar(20),create_time datetime)

/*!*/;

# à 5445

#160820 10:24:34 identifiant du serveur 63 end_log_pos 5580 CRC32 0x2626220c Requête thread_id=18 exec_time=0 error_code=0

SET TIMESTAMP=1471659874/* !*/;

alter table test1 modifier `adresse` varchar(200) DEFAULT NULL

/*!*/;

# à 5580

#160820 10:24:36 identifiant du serveur 63  end_log_pos 5660 CRC32 0x7b7c645f      Requête       thread_id=18         exec_time=0    error_code=0

SET TIMESTAMP=1471659876/ *!*/;

ENSEMBLE @@session.time_zone='SYSTEM'/*!*/;

BEGIN

/*!*/;

# au 5660

# à 5764

#160820 10:24:36 identifiant du serveur 63  end_log_pos 5821 CRC32 0x08bc94c3      Table_map : `test`.`test1` mappé au numéro 74

# à 5821

#160820 10:24:36 identifiant du serveur 63  end_log_pos 5911 CRC32 0x2f577f52       Write_rows : identifiant de table 74 indicateurs :  STMT_END_F

 

BINLOG '

ZL 3VxM/ AAAAOQAAAL0WAAAAAEoAAAAAAAEABHRlc3QABXRlc3QxAAUDDwMPEgU8AFgCAB/DlLwI

ZL 3Vx4/AAAAWgAAABcXAAAAAEoAAAAAAAEAAAgAF/ ABAAAACHpoYW5nc2FuAQAAAB4Aemhhbmdz

YW4gcm9hZCBObyA4NzAsZmxvb3IgNjAymZoopiRSf1cv

'/* !*/;

# au 5911

#160820 10:24 :36 identifiant du serveur 63  end_log_pos 5942 CRC32 0xb26af81b      Xid = 199

COMMIT/*!*/;

# à 5942

#160820 10:24:48 identifiant du serveur 63 end_log_pos 6022 CRC32 0x09eab31d     Requête       thread_id=18         exec_time=0    error_code=0

SET TIMESTAMP=1471659888/*!*/;

BEGIN

/ *!*/;

# au 6022

# au 6122

#160820 10:24:48 identifiant du serveur 63  end_log_pos 6179 CRC32 0xdc6dc34b      Table_map : `test`.`test1` mappé au numéro 74

# à 6179

#160820 10:24:48 identifiant du serveur 63 end_log_pos 6265 CRC32 0x5f7ad700      Write_rows : identifiant de table 74 indicateurs : STMT_END_F

 

BINLOG '

cL 3VxM/AAAAOQAAACMYAAAAAEoAAAAAAAEABHRlc3QABXRlc3QxAAUDDwMPEgU8AFgCAB9Lw23c

cL 3Vx4/AAAAVgAAAHkYAAAAAEoAAAAAAAEAAgAF/ACAAAABGxpc2kBAAAAHgB6a GFuZ3NhbiBy

b2FkIE5vIDg3MCxmbG9vciA2MDKZmiimMADXel8=

'/*!*/;

# à 6265

#160820 10:24:48 identifiant du serveur 63  end_log_pos 6296 CRC32 0xf6833d28      Xid = 200

COMMIT/*!*/;

# à 6296

#160820 10:31:30 ID du serveur 63  end_log_pos 6343 CRC32 0xcfcdd344       Tourner vers mysql-bin.000216  pos : 4

DELIMITER ;

# Fin du fichier journal

ROLLBACK /* ajouté par mysqlbinlog */;

/*!50003 SET  COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET  @@SESSION.PSEUDO_SLAVE_MODE=0*/ ;

[root@hch_test_dbm1_121_63 binlog]#

3, via --base64-output =decode-rows -v pour afficher l'instruction dml

la commande d'exécution est : /usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin.000215

Vous pouvez voir ce qui suit effet, mais ce sont toutes les instructions SQL du bloc dml original :

[root@hch_test_dbm1_121_63 binlog]#  /usr/local/mysql/bin/mysqlbinlog   --base64-output=decode-rows -v   mysql-bin.000215

/*!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 /*!*/;

……

#160820 10:24:36 server id 63  end_log_pos 5821 CRC32 0x08bc94c3      Table_map: `test`.`test1` mapped to  number 74

# at 5821

#160820 10:24:36 server id 63  end_log_pos 5911 CRC32 0x2f577f52       Write_rows: table id 74 flags:  STMT_END_F

### INSERT INTO `test`.`test1`

### SET

###   @1=1

###    @2='zhangsan'

###   @3=1

###    @4='zhangsan road No 870,floor 602'

###    @5='2016-08-20 10:24:36'

# at 5911

#160820 10:24:36 server id 63  end_log_pos 5942 CRC32 0xb26af81b      Xid = 199

COMMIT/*!*/;

# at 5942

#160820 10:24:48 server id 63  end_log_pos 6022 CRC32 0x09eab31d     Query       thread_id=18         exec_time=0    error_code=0

SET TIMESTAMP=1471659888/*!*/;

BEGIN

/*!*/;

# at 6022

# at 6122

#160820 10:24:48 server id 63  end_log_pos 6179 CRC32 0xdc6dc34b      Table_map: `test`.`test1` mapped to  number 74

# at 6179

#160820 10:24:48 server id 63  end_log_pos 6265 CRC32 0x5f7ad700      Write_rows: table id 74 flags: STMT_END_F

### INSERT INTO `test`.`test1`

### SET

###   @1=2

###   @2='lisi'

###   @3=1

###    @4='zhangsan road No 870,floor 602'

###    @5='2016-08-20 10:24:48'

# at 6265

#160820 10:24:48 server id 63  end_log_pos 6296 CRC32 0xf6833d28      Xid = 200

COMMIT/*!*/;

# at 6296

#160820 10:31:30 server id 63  end_log_pos 6343 CRC32 0xcfcdd344       Rotate to mysql-bin.000216  pos: 4

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET  COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@hch_test_dbm1_121_63 binlog]#

[ root@ hch_test_dbm1_121_63 binlog]# /usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin.000215/*!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 /*!*/;……#160820 10:24:36 identifiant du serveur 63 end_log_pos 5821 CRC32 0x08bc94c3 Table_map : `test`.`test1` mappé à numéro 74 # à 5821#160820 10:24:36 identifiant du serveur 63 end_log_pos 5911 CRC32 0x2f577f52 Write_rows : identifiant de table 74 indicateurs : STMT_END_F### INSÉRER DANS `test`.`test1`## # SET ### @1=1### @2='zhangsan'### @3=1 ### @4='route zhangsan n° 870, étage 602'### @5='2016-08-20 10:24:36'# à 5911# 160820 10:24:36 identifiant du serveur 63 end_log_pos 5942 CRC32 0xb26af81b : 48 identifiant du serveur 63 end_log_pos 6022 CRC32 0x09eab31d Requête thread_id=18 exec_time=0 error_code=0SET TIMESTAMP=14716 59888/*!*/; DEBUT/*! */;# au 6022# au 6122#160820 10:24:48 identifiant du serveur 63 end_log_pos 6179 CRC32 0xdc6dc34b Table_map : `test`.`test1` mappé au numéro 74# à 6179#160820 10:24:48 identifiant du serveur 63 end_log_pos 6265 CRC32 0x5f7ad 700 lignes_d'écriture : identifiant de table 74 indicateurs : STMT_END_F### INSERT INTO `test`.`test1` ### SET### @1 =2### @2='lisi'### @3 =1### @4=' route de Zhangsan n° 870, étage 602'### @5='2016-08-20 10:24:48 '# à 6265 #160820 10:24:48 identifiant du serveur 63 end_log_pos 6296 CRC32 0xf6833d28 Xid = 200COMMIT/*!*/;# à 6296#16082 0 10:31:30 identifiant du serveur 63 end_log_pos 6343 CRC32 0xcfcdd344 Rotation vers mysql-bin.000216 pos : 4DELIMITER ; #Fin du fichier journalROLLBACK /* ajouté par mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*! 50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;[root@hch_test_dbm1_121_63 binlog]#

PS : De cette façon, vous pouvez le voir L'instruction insert de dml, mais seul le bloc insert final est vu, mais pas la déclaration finale insert Dans de nombreux cas, le dépannage nécessite l'instruction insert originale au lieu de l'instruction insérer un bloc. La question est donc de savoir comment voir l'instruction insert sql originale ?

4, passebinlog_rows_query_log_events paramètres pour afficher l'original insérer sql

( 4.1) Définissez d'abord les paramètres globaux binlog_rows_query_log_events en ligne et actualisez le journal :

mysql> set binlog_rows_query_log_events=1; sec)

mysql> set  binlog_rows_query_log_events=1;                                         

Query OK, 0 rows affected (0.01 sec)

 

mysql>

mysql> flush logs;

Query OK, 0 rows affected (0.01 sec)

 

mysql>exit

 

mysql>

mysql> vider les journaux ;Requête OK, 0 ligne affectée (0,01 sec) mysql> ; quitter

[root@hch_test_dbm1_121_63 ~]# mysql  -utim -ptimgood -h192.168.121.63

Warning: Using a password on the command  line interface can be insecure.

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 19

Server version: 5.6.12-log Source  distribution

 

Copyright (c) 2000, 2013, 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>

mysql> use test;

Database changed

mysql> insert into test1 select  3,'wanger','3','zhangsan road No 870,floor 603',now();

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql>

 

(4.2) Puis reconnectez-vous pour saisir de nouveaux enregistrements de données :
[root @hch_test_dbm1_121_63 ~]# mysql -utim -ptimgood -h192.168.121.63Avertissement : l'utilisation d'un mot de passe sur l'interface de ligne de commande peut être non sécurisée.Bienvenue dans le moniteur MySQL. Fin des commandes. avec ; ou g.Votre identifiant de connexion MySQL est 19Version du serveur : 5.6.12-log Distribution source Copyright (c) 2000 , 2013, Oracle et/ou ses sociétés affiliées. Tous droits réservés. Oracle est une marque déposée d'Oracle Corporation et/ou de sesD'autres noms peuvent être. marques déposées de leurspropriétaires respectifs. Tapez « help; » ou « h » pour obtenir de l'aide. Tapez « c » pour effacer l'instruction de saisie actuelle. mysql>mysql> utiliser test ; insérer dans test1 sélectionner 3,'wanger','3','zhangsan road No 870,floor 603',now() ;Requête OK, 1 ligne affectée (0,00 sec)Enregistrements : 1 Doublons : 0 Avertissements : 0 mysql>

 

 

4.3)解析binlog,没有看到原始的insert语句

[root@hch_test_dbm1_121_63 binlog]#  /usr/local/mysql/bin/mysqlbinlog   --base64-output=decode-rows -v   mysql-bin.000216 >1.sql

[root@hch_test_dbm1_121_63 binlog]# more  1.sql

/*!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

#160820 10:31:30 server id 63  end_log_pos 120 CRC32 0x1e4d0366       Start: binlog v 4, server v 5.6.12-log  created 160820 10:31:30

# Warning: this binlog is either in use  or was not closed properly.

# at 120

#160820 10:32:04 server id 63  end_log_pos 200 CRC32 0xab0e625e       Query       thread_id=19   exec_time=0         error_code=0

SET TIMESTAMP=1471660324/*!*/;

SET @@session.pseudo_thread_id=19/*!*/;

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 utf8 *//*!*/;

SET  @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;

SET @@session.time_zone='SYSTEM'/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET  @@session.collation_database=DEFAULT/*!*/;

BEGIN

/*!*/;

# at 200

# at 302

#160820 10:32:04 server id 63  end_log_pos 359 CRC32 0x41bf2876        Table_map: `test`.`test1` mapped to  number 74

# at 359

#160820 10:32:04 server id 63  end_log_pos 447 CRC32 0x1a3ab3d8       Write_rows: table id 74 flags:  STMT_END_F

### INSERT INTO `test`.`test1`

### SET

###    @1=3

###    @2='wanger'

###    @3=3

###    @4='zhangsan road No 870,floor 603'

###    @5='2016-08-20 10:32:04'

# at 447

#160820 10:32:04 server id 63  end_log_pos 478 CRC32 0xc5081021        Xid = 208

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET  COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET  @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@hch_test_dbm1_121_63 binlog]#

 

 

 

4.4)通过mysql的命令行查看最原始的insert sql语句,如下所示:


mysql>  show binlog events in 'mysql-bin.000216';
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                             |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
| mysql-bin.000216 |   4 | Format_desc |        63 |         120 | Server ver: 5.6.12-log, Binlog ver: 4                                            |
| mysql-bin.000216 | 120 | Query       |        63 |         200 | BEGIN                                                                            || mysql-bin.000216 | 200 | Rows_query  |        63 |         302 | # insert into test1 select 3,'wanger','3','zhangsan road No 870,floor 603',now() || mysql-bin.000216 | 302 | Table_map   |        63 |         359 | table_id: 74 (test.test1)                                                        |
| mysql-bin.000216 | 359 | Write_rows  |        63 |         447 | table_id: 74 flags: STMT_END_F                                                   |
| mysql-bin.000216 | 447 | Xid         |        63 |         478 | COMMIT /* xid=208 */                                                             |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
 
mysql>


5, résumé du test

basé on À partir des expériences ci-dessus, on peut conclure qu'en mode ligne, vous pouvez afficher le module de données d'insertion de niveau inférieur via mysqlbinlog --base64-output=decode-rows –v , ou via la ligne de commande afficher les événements binlog dans 'mysql-bin.000216'; pour afficher l'enregistrement insertsql d'origine en temps réel.

Nous pouvons le définir à l'avance dans le fichier de paramètres de démarrage my.cnf lors de la construction de la base de données, comme indiqué ci-dessous :

# vim my.cnf

[mysqld]

binlog_format=row  # binlog 日志格式

binlog_rows_query_log_events = 1  # 将原始的操作sql记录写入事件中              


# vim my.cnf

[mysqld]


binlog_format= row

# binlog


Format du journal

binlog_rows_query_log_events = 1 # Convertir l'opération d'origine sql Événement d'écriture de disques                                                                           > Ce qui précède est un décryptage MySQL--> Instruction SQL en mode journal binaire ROW Pour plus de contenu connexe, veuillez faire attention au PHP. Site chinois (www.php.cn) !
Déclaration:
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