Maison >base de données >tutoriel mysql >Décryptage MySQL -> Comment afficher l'instruction SQL la plus originale en mode journal binaire ROW
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 ?
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> |
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]# |
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 :
|
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.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> 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>
|
[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> |
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]
|