以下範例說明 mysqlbinlog 如何顯示指定資料修改的列事件。這些對應於具有 WRITE_ROWS_EVENT
、UPDATE_ROWS_EVENT
和 DELETE_ROWS_EVENT
類型代碼的事件。--base64-output=DECODE-ROWS
和 --verbose
選項可用於影響列事件輸出。
假設伺服器正在使用基於列的二進位日誌記錄,並且您執行以下陳述式序列
CREATE TABLE t
(
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
date DATE NULL
) ENGINE = InnoDB;
START TRANSACTION;
INSERT INTO t VALUES(1, 'apple', NULL);
UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
DELETE FROM t WHERE id = 1;
COMMIT;
預設情況下,mysqlbinlog 會使用 BINLOG
陳述式顯示編碼為 base-64 字串的列事件。省略多餘的行,先前陳述式序列產生的列事件輸出看起來像這樣
$> mysqlbinlog log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
若要以「偽 SQL」陳述式的形式將列事件視為註解,請使用 mysqlbinlog 和 --verbose
或 -v
選項執行。此輸出層級也會顯示適用的資料表分割資訊。輸出包含以 ###
開頭的行
$> mysqlbinlog -v log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
### @1=1
### @2='apple'
### @3=NULL
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
### @1=1
### @2='apple'
### @3=NULL
### SET
### @1=1
### @2='pear'
### @3='2009:01:01'
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
### @1=1
### @2='pear'
### @3='2009:01:01'
指定 --verbose
或 -v
兩次,以同時顯示每個欄位的資料類型和一些中繼資料,以及資訊性日誌事件(例如列查詢日誌事件),如果 binlog_rows_query_log_events
系統變數設定為 TRUE
。輸出在每個欄位變更之後包含額外的註解
$> mysqlbinlog -vv log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
您可以使用 --base64-output=DECODE-ROWS
選項,告訴 mysqlbinlog 抑制列事件的 BINLOG
陳述式。這類似於 --base64-output=NEVER
,但如果找到列事件,則不會以錯誤結束。--base64-output=DECODE-ROWS
和 --verbose
的組合提供了一種方便的方式,僅將列事件視為 SQL 陳述式
$> mysqlbinlog -v --base64-output=DECODE-ROWS log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
### INSERT INTO test.t
### SET
### @1=1
### @2='apple'
### @3=NULL
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
### UPDATE test.t
### WHERE
### @1=1
### @2='apple'
### @3=NULL
### SET
### @1=1
### @2='pear'
### @3='2009:01:01'
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
### DELETE FROM test.t
### WHERE
### @1=1
### @2='pear'
### @3='2009:01:01'
如果您打算重新執行 mysqlbinlog 輸出,則不應抑制 BINLOG
陳述式。
對於列事件,--verbose
產生的 SQL 陳述式比對應的 BINLOG
陳述式更具可讀性。但是,它們與產生事件的原始 SQL 陳述式並不完全對應。以下限制適用
原始欄位名稱遺失,並替換為
@
,其中N
N
是欄位編號。字元集資訊在二進位日誌中不可用,這會影響字串欄位的顯示
對應的二進位和非二進位字串類型之間沒有區別 (
BINARY
和CHAR
、VARBINARY
和VARCHAR
、BLOB
和TEXT
)。輸出針對固定長度字串使用STRING
的資料類型,針對可變長度字串使用VARSTRING
。對於多位元組字元集,每個字元的最大位元組數不存在於二進位日誌中,因此字串類型的長度以位元組而不是字元顯示。例如,
STRING(4)
用作來自以下任一欄位類型的值的資料類型CHAR(4) CHARACTER SET latin1 CHAR(2) CHARACTER SET ucs2
由於
UPDATE_ROWS_EVENT
類型事件的儲存格式,UPDATE
陳述式會顯示在SET
子句之前的WHERE
子句。
正確解譯列事件需要來自二進位日誌開頭的格式描述事件的資訊。由於 mysqlbinlog 無法預先知道日誌的其餘部分是否包含列事件,因此預設情況下,它會使用輸出初始部分的 BINLOG
陳述式顯示格式描述事件。
如果已知二進位日誌不包含任何需要 BINLOG
陳述式(也就是沒有資料列事件)的事件,則可以使用 --base64-output=NEVER
選項來防止寫入此標頭。