天天看點

如何看到binlog中執行的sql?

作者:東東程式猿

線上rds,如果需要檢視實際執行的語句,是看不到的,解析binlog隻能看到具體sql的變化。

比如update t3 set a=now()這個語句,如果直接mysqlbinlog檢視是經過base64加密的文本:

mysqlbinlog mysql_bin.000009

# at 2549

#200907 17:42:44 server id 1 end_log_pos 2609 CRC32 0x855e560b Update_rows: table id 112 flags: STMT_END_F

BINLOG '

lABWXxMBAAAALAAAAPUJAAAAAHAAAAAAAAEAA2RiMQACdDMAAQoAAXihZ7s=

lABWXx8BAAAAPAAAADEKAAAAAHAAAAAAAAEAAgAB///+AAAA/ifJD/4AAAD+J8kP/gDGD/4nyQ8L

Vl6F

'/*!*/;

如果想看實際sql,實際看到的是下面的樣子:

mysqlbinlog --base64-output=decode-rows -vv mysql_bin.000009

# at 2549

#200907 17:42:44 server id 1 end_log_pos 2609 CRC32 0x855e560b Update_rows: table id 112 flags: STMT_END_F

### UPDATE `db1`.`t3`

### WHERE

### @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

### UPDATE `db1`.`t3`

### WHERE

### @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

### UPDATE `db1`.`t3`

### WHERE

### @1='2019:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

修改的每行都對應有一個update語句,記錄了每行的改變。

但仍然看不出來之前執行的語句。

mysql提供了一個參數,可以在binlog中記錄實際sql,且類型為Rows_query,重放時不會導緻語句重複執行:

設定語句如下:

set binlog_rows_query_log_events=on;

此時檢視binlog,發現多了一部分内容:

# at 2460

# at 2460

#200907 17:42:44 server id 1 end_log_pos 2505 CRC32 0x65ba7849 Rows_query

# update t3 set a=now()

# at 2505

#200907 17:42:44 server id 1 end_log_pos 2549 CRC32 0xbb67a178 Table_map: `db1`.`t3` mapped to number 112

# at 2549

#200907 17:42:44 server id 1 end_log_pos 2609 CRC32 0x855e560b Update_rows: table id 112 flags: STMT_END_F

### UPDATE `db1`.`t3`

### WHERE

### @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

### UPDATE `db1`.`t3`

### WHERE

### @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

### UPDATE `db1`.`t3`

### WHERE

### @1='2019:00:00' /* DATE meta=0 nullable=1 is_null=0 */

### SET

### @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

紅字顯示了實際sql,通過這種方式,可以不打開general_log,達到記錄dml語句的目的,但無法記錄select操作。

繼續閱讀