4.6.7.2 Отображение событий строк mysqlbinlog
Следующие примеры иллюстрируют, как 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 отображает события строк, закодированные как строки base-64, с использованием инструкций BINLOG. Без лишних строк, вывод для событий строк, сгенерированных предыдущей последовательностью инструкций, выглядит так:
$> 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 дважды, чтобы также отобразить типы данных и некоторые метаданные для каждого столбца. Вывод содержит дополнительный комментарий после каждого изменения столбца:
$> 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 */
Вы можете указать mysqlbinlog подавить инструкции BINLOG для событий строк, используя опцию --base64-output=DECODE-ROWS. Это похоже на --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'
Не следует подавлять инструкции BINLOG, если вы намерены повторно выполнить вывод mysqlbinlog.
Инструкции SQL, сгенерированные --verbose для событий строк, гораздо более удобочитаемы, чем соответствующие инструкции BINLOG. Однако они не точно соответствуют исходным инструкциям SQL, которые сгенерировали эти события. Применяются следующие ограничения:
Исходные имена столбцов теряются и заменяются на
@, гдеNN— номер столбца.-
Информация о наборе символов недоступна в бинарном логе, что влияет на отображение столбцов строк:
Нет различий между соответствующими бинарными и небинарными типами строк (
BINARYиCHAR,VARBINARYиVARCHAR,BLOBиTEXT). Вывод использует тип данныхSTRINGдля строк фиксированной длины иVARSTRINGдля строк переменной длины.-
Для многобайтовых наборов символов максимальное количество байтов на символ отсутствует в бинарном логе, поэтому длина для типов строк отображается в байтах, а не в символах. Например,
STRING(4)используется в качестве типа данных для значений из любого из этих типов столбцов:CHAR(4) CHARACTER SET latin1 CHAR(2) CHARACTER SET ucs2
Из-за формата хранения событий типа
UPDATE_ROWS_EVENT, инструкцииUPDATEотображаются с клаузойWHERE, предшествующей клаузеSET.
Правильная интерпретация событий строк требует информации из события описания формата в начале бинарного лога. Так как mysqlbinlog не знает заранее, содержит ли остальная часть лога события строк, по умолчанию он отображает событие описания формата с помощью инструкции BINLOG в начальной части вывода.
Если известно, что бинарный лог не содержит событий, требующих инструкции BINLOG (то есть событий строк), опция --base64-output=NEVER может быть использована для предотвращения записи этого заголовка.
© 2025 Oracle
Licensed under the GPLv2 License.