MySQL 復号化 --> バイナリ ログ ROW モードで最もオリジナルの SQL ステートメントを表示する方法

黄舟
リリース: 2017-02-16 11:43:25
オリジナル
2450 人が閲覧しました

MySQLbinlogROWモード分析

mysql5.6 以降、マスターとスレーブのデータの一貫性の要件は次のとおりです。ステートメントの形式が徐々にビジネス ニーズに適さなくなるため、本番環境のすべてのユーザーが行モードを採用し、バイナリ ログでマスター/スレーブ データを送信するための最小限のデータ変更を送信します。ステートメントモードの違いは何ですか?元の SQL ステートメントが見えますか?

1、data
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>
ログイン後にコピー

を入力する準備ができています

2Rowmodebinlogは文字化けしたコードです​​

Row In binlog の ddl ステートメントは正常に表示されますが、dml以下に示すように、文字化けしたコードです:

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

…… #ザここの前に 1 つ省略

#160722 17:02:38 サーバー ID 62 end_log_pos 4291 CRC32 0x369e3244 クエリ thread_id=60 exec_time=4294967271 error_code=0

SET TIMESTAMP=1 469178158/*!* /;

データベースを作成する存在しない場合 `percona` /* pt-table-checksum */

/*!*/;

# at 4291

#160722 17:02:38 サーバー ID 62 end_log_pos 5079 CRC32 0x8abc6e67 クエリ thread_id=60 exec _time =4294967271 error_code=0

`percona`/*!*/;

SET TIMESTAMP=1469178158/*!*/;

存在しない場合はテーブルを作成してください `percona`.`checksums` (

tbl char(64) NOT NULL,

Chunk int NOT NULL,

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 に、

TS タイムスタンプが Null ではない、更新時のdefault_timestamp Mp、r 主キー (DB、TBL、チャンク)、

インデックス ts_db_tbl (ts, db, tbl)

) ENGINE=InnoDB

/*!*/;

# at 5079

#160820 10:21:10 サーバー ID 63 end_log_pos 5280 CRC32 0xd147bd8 e クエリ thread_id=16 exec_time=0 error_code=0

SET TIMESTAMP=1471659670/*!*/;

SET .sql_mode =1075838976/*!*/;

*.* のすべての権限をパスワード '*2976819BD2CCD13612E03F812A2CD297C1A18B23' で識別された 'tim'@'192.168%' に付与します

/*!*/;

#5280で

#160820 10:22:40 サーバー ID 63 end_log_pos 5445 CRC32 0 x85811be7 クエリ thread_id=18 exec_time=0 error_code=0

use `test `/*!*/;

SET TIMESTAMP=1471659760/*!*/;

createテーブル test1(id int,c1 varchar(20),type int,address varchar(20),create_time datetime)

/* !*/;

# at 5445

#160820 10:24:34 サーバー ID 63 end_log_pos 5580 CRC32 0x2626220c クエリ thread_id=18 exec_time=0 error_code=0

SET TIMESTAMP=1471659874/*!*/;

alter table test1 edit `address` varchar(200) DEFAULT NULL

/*!*/;

#5580で

#160820 10:24:36 サーバー ID 63 end_log_pos 5660 CRC32 0x7b7c645f クエリ thread_id=18 exec_time=0 error_code=0

SET TIMESTAMP=1471659876/*!*/;

SET @@session.time_zone='システム'/ *!*/;

BEGIN

/*!*/;

# at 5660

# at 5764

#160820 10:24:36 サーバー ID 63 end_log_pos 5821 CRC32 0x08bc94c3 Table_map: `テスト`.`テスト1 ` 番号 74

#、5821

#160820 10:24:36 サーバー ID 63 end_log_pos 5911 CRC32 0x2f577f52 Write_rows: テーブル ID 74 flags: STMT_END_F

にマッピングされました

BINLOG '

ZL+3VxM/AAAOQAAAL0WAAAAAEoAAAAAAAEABHRlc3QABXRlc3QxAAUDDwMPEgU8AFgCAB/DlLwI

ZL+3Vx4/AAAAWgAAABcXAAAAAEoAAAAAAEAAgAF/+ABAAAACHpoYW5nc2FuAQAAAB4Aemhhbmdz

YW4gcm9hZCBObyA4NzAsZmxvb3IgNjAymZoopiRSf1cv

'/*!*/;

# at 5911

#160820 10:24:36 サーバー ID 63 end_log_pos 5942 CRC32 0xb26af81b Xid = 199

COMMIT/* !*/;

# at 5942

#160820 10:24:48 サーバー ID 63 end_log_pos 6022 CRC32 0x09eab31d クエリ thread_id=18 exec_time=0 error_code=0

SETタイムスタンプ=1471659888/*!*/;

BEGIN

/*!*/;

# at 6022

# at 6122

#160820 10:24:48 サーバー ID 63 end_log_pos 6179 CRC32 0xdc6dc34b Table_map: `test`.`test1` が number にマッピングされました74

# at 6179

#160820 10:24:48 サーバー ID 63 end_log_pos 6265 CRC32 0x5f7ad700 Write_rows: テーブル ID 74 フラグ: STMT_END_F

BINLOG '

cL+3VxM/A AAAOQAAACMYAAAAAEoAAAAAAAEABHRlc3QABXRlc3QxAAUDDwMPEgU8AFgCAB9Lw23c

cL+3Vx4/AAAAVgAAAHkYAAAAAEoAAAAAAEAAagAF/+ACAAAABGxpc2kBAAAAHgB6aGFuZ3NhbiBy

b2FkIE5vIDg3MCxmbG9vciA2MDKZmiimMADXel8=

'/*!*/;

# at 6265

#160820 10:24:48 サーバー ID 63 end_log_pos 6296 CRC32 0xf6833d28 Xid = 200

COMMIT/*!*/;

# at 6296

#160820 10:31:30 サーバー ID 63 end_log_pos 6343 CRC32 0xcfcdd344 mysql-bin.000216 に回転 pos: 4

DELIMITER ;

# ログファイルの終わり

ROLLBACK /* */;

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

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

[root@hch_test_dbm1_121_63 binlog]#

3--base64-output=decode-rows -vを介してdmlステートメントを表示します

実行コマンドは次のとおりです。 /usr /local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin.000215

次の効果が確認できますが、これらはすべて元の DML ブロック SQL ステートメントです。

[root@hch_test_dbm1_121_63 binlog]#/usr/local/mysql/bin/mysqlbinlog - base64-output = decode-rows -v mysql-bin.000215/*!50530セット@@セッション.PS EUDO_SLAVE_MODE= 1*/;

/*!40019 SET @@session.max_insert_layed_threads=0*/;

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

DELIMITER /* !*/;

……

#160820 10:24:36 サーバー ID 63 end_log_pos 5821 CRC32 0x08bc94c3 Table_map: `test`.`test1` が番号 5821 の 74

# にマップされました

#160820 10:2 4: 36 サーバー ID 63 end_log_pos 5911 CRC32 0x2f577f52 Write_rows: テーブル ID 74 フラグ: STMT_END_F

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

### SET

### @1=1

### @2='張三'

### @3=1

### @4='張三路870号、602階'

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

# at 5911#160820 10:24:36 サーバー ID 63 end_log_pos 5942 CRC32 0xb26af81b Xid = 199

COMMIT/*!*/;

# at 5942

#160820 10:24:48 サーバー ID 63 end_log_pos 6022 CRC32 0x09eab31d クエリ thread_id=18 exec_time=0 error_code=0

SET TIMESTAMP=1471659888/*!* /;

始めましょう

/*! */;

# at 6022

# at 6122

#160820 10:24:48 サーバー ID 63 end_log_pos 6179 CRC32 0xdc6dc34b Table_map: `test`.`test1` は 61 79 の番号 74

# にマップされました

#160820 10:24 :48 サーバー ID 63 end_log_pos 6265 CRC32 0x5f7ad700 Write_rows: テーブル ID 74 フラグ: STMT_END_F

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

### # ## @1= 2

### @2='lisi'

### @3=1

### @4='張山路870号、602階'

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

# at 6265

#160820 10:24:48 サーバーID 63 end_log_pos 6296 CRC32 0xf6833d28 Xid = 200

コミット/ *!*/;

# at 6296

#160820 10:31:30 サーバー ID 63 end_log_pos 6343 CRC32 0xcfcdd344 mysql-bin.000216 にローテートします pos: 4

DELIMITER ;

# ログ ファイルの終わり

ロールバック/* mysqlbinlog によって追加されました */;

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

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

[root@hch_test_dbm1_121_63 binlog]#

PS:この方法では、dmlinsertステートメントを確認できますが、最後のinsertのみが表示されます。 できずにブロックします元の insert ステートメントを参照してください。 多くの場合、トラブルシューティングには、基になる insert ブロックではなく、元の insert ステートメントが必要です。そこで質問は、元の insert sql ステートメントをどのように確認するかということです。

4binlog_rows_query_log_eventsパラメータを介して元のinsert sqlを表示します

(4.1) まずオンラインでセットアップしてくださいグローバル binlog_rows_query_log_events パラメーター、ログを更新:

[ルート@ hch_test_dbm1_121_63 ~]# mysql -utim -ptimgood -h192.168.121.63

mysql> set binlog_rows_query_log_events=1;

Query OK、0 行が影響を受けます ( 0.01秒)

mysql>

mysql> ログをフラッシュ;

クエリ OK、影響を受ける行は 0 (0.01 秒) 4.2

) 次に、再度ログインして新しいデータ レコードを入力します :

警告: コマンド ライン インターフェイスでのパスワードの使用は安全でない可能性があります。

MySQL モニターへようこそ。コマンドは ; または g で終わります。

MySQL接続 ID は 19 サーバー バージョン: 5.6.12-log ソース配布 Copyright (c) 2000, 2013, Oracle and/or its associations.All Rights Reserved .

Oracle は Oracle の登録商標です。 Corporation および/またはその関連会社。その他の名前はそれぞれの

所有者の商標である可能性があります。

現在の入力ステートメントをクリアするには、「help;」または「h」を入力してください。

mysql>

mysql>テストを使用;

データベースが変更されました

mysql>test1 に挿入 3,'wanger','3','zhangsan road No 870,floor 603',now();

Query OK、1 行が影響を受けました (0.00 秒)

レコード: 1 重複: 0 警告: 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、テストの概要

上記のテストに基づいて、行モードでは、mysqlbinlog --base64-output=decode-rows を渡すことができると結論付けることができます。 –v 最下位レベルの挿入データ モジュールを表示するか、コマンド ライン show binlog events in 'mysql-bin.000216'; を使用して元の insertsql レコードをリアルタイムで表示できます。

以下に示すように、データベースを構築するときに起動パラメータ ファイル my.cnf で事前に設定できます。 row

# binlog

Log format
binlog_rows_query_log_events = 1

上記はMySQLの復号化です --> 最もオリジナルなSQL文の内容をバイナリで表示する方法ログROWモードその他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート