Spec-Zone.ru › MariaDB

Форматы двоичного лога

Поддерживаемые форматы двоичного лога

Существует три поддерживаемых формата для событий двоичного лога:

  • Регистрация на основе операторов
  • Регистрация на основе строк
  • Смешанная регистрация

Независимо от формата, события двоичного лога всегда хранятся в двоичном формате, а не в виде простого текста. MariaDB включает утилиту mariadb-binlog, которая может использоваться для вывода событий двоичного лога в удобочитаемом формате.

Вы можете захотеть установить формат двоичного лога в следующих случаях:

  • Если вы выполняете отдельные операторы, которые обновляют множество строк, то регистрация на основе операторов будет более эффективной для реплики при загрузке, чем регистрация на основе строк.
  • Если вы выполняете множество операторов, которые не влияют на какие-либо строки, то регистрация на основе строк будет более эффективной для реплики при загрузке, чем регистрация на основе операторов.
  • Если вы выполняете операторы, которые занимают много времени для завершения, но в конечном итоге они только вставляют, обновляют или удаляют несколько строк в таблице, то регистрация на основе строк будет более эффективной для реплики при применении, чем регистрация на основе операторов.

По умолчанию используется смешанная регистрация, которая безопасна для репликации и требует меньше места для хранения, чем регистрация на основе строк.

API движка хранения также позволяет движкам хранения устанавливать или ограничивать формат регистрации, что помогает уменьшить ошибки при репликации между первичными и репликами с различными движками хранения.

Регистрация на основе операторов

В MariaDB 10.2.3 и ранее, регистрация на основе операторов была по умолчанию. Смешанная регистрация теперь является по умолчанию.

Когда регистрация на основе операторов включена, операторы записываются в двоичный лог точно так, как они выполнялись. Временные таблицы, созданные на первичном сервере, также будут созданы на реплике. Этот режим рекомендуется только в тех случаях, когда необходимо сделать двоичный лог максимально маленьким, первичный и реплика имеют идентичные данные (включая использование одних и тех же движков хранения для всех таблиц), а все используемые функции являются детерминированными (повторяемыми с одинаковыми аргументами). Операторы и таблицы, использующие метки времени или auto_increment, безопасны для использования с регистрацией на основе операторов.

Этот режим можно включить, установив системную переменную binlog_format в STATEMENT.

В некоторых случаях, когда невозможно выполнить оператор на реплике, сервер переключится на регистрацию на основе строк для этого оператора. Некоторые случаи этого:

  • Когда репликация была изменена с регистрации на основе строк на регистрацию на основе операторов, а оператор использует данные из временной таблицы, созданной во время режима регистрации на основе строк. В этом случае временные таблицы не хранятся на реплике, поэтому регистрация на основе строк является единственной альтернативой.
  • ALTER TABLE таблицы, использующей движок хранения, который хранит данные удалённо, например, S3 движок хранения, на другой движок хранения.
  • Использование последовательностей в операторе или в определении CREATE TABLE.

В некоторых случаях оператор может быть не детерминированным и, следовательно, небезопасным для репликации. Если MariaDB определит, что выполнен небезопасный оператор, то он выдаст предупреждение. Например:

[Warning] Unsafe statement written to the binary log using statement format since 
  BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This 
  is unsafe because the set of rows included cannot be predicted.

См. Небезопасные операторы для репликации на основе операторов для получения дополнительной информации.

Если вам нужно выполнить недетерминированные операторы, то безопаснее использовать смешанную регистрацию или регистрацию на основе строк.

Смешанная регистрация

Смешанная регистрация — это по умолчанию формат двоичного лога.

Когда смешанная регистрация включена, сервер использует комбинацию регистрации на основе операторов и регистрации на основе строк. По умолчанию используется регистрация на основе операторов, но когда сервер определяет, что оператор может быть небезопасным для регистрации на основе операторов, он использует регистрацию на основе строк вместо этого. См. Небезопасные операторы для репликации на основе операторов: Небезопасные операторы для списка небезопасных операторов.

В ходе одной транзакции некоторые операторы могут регистрироваться с регистрацией на основе строк, в то время как другие регистрируются с регистрацией на основе операторов.

Этот режим можно включить, установив системную переменную binlog_format в MIXED.

Регистрация на основе строк

Когда регистрация на основе строк включена, операторы DML не записываются в двоичный лог. Вместо этого каждая вставка, обновление или удаление, выполненные оператором для каждой строки, записываются в двоичный лог отдельно. Операторы DDL всё ещё записываются в двоичный лог.

Регистрация на основе строк использует больше места для хранения, чем другие форматы логов, но является самым безопасным для использования. На практике смешанная регистрация должна быть столь же безопасной.

Если необходимо увидеть исходный запрос, который был записан, можно включить события с аннотированными строками, которые отображаются с помощью mariadb-binlog, с параметром --binlog-annotate-row-events. Этот параметр включен по умолчанию.

Этот режим можно включить, установив системную переменную binlog_format в ROW.

Сжатие двоичного лога

Сжатие двоичного лога может использоваться с любым из форматов двоичного лога, но лучшие результаты получаются при использовании смешанной или регистрации на основе строк. Вы можете включить сжатие, используя опцию запуска --log_bin_compress.

Настройка формата двоичного лога

Формат событий двоичного лога может быть настроен путём установки системной переменной binlog_format. Если у вас есть привилегия SUPER, то вы можете изменить её динамически с помощью SET GLOBAL. Например:

SET GLOBAL binlog_format='ROW';

Вы также можете изменить её динамически только для определённой сессии с помощью SET SESSION. Например:

SET SESSION binlog_format='ROW';

Её также можно установить в группе опций сервера группа опций в файле опций файл опций до запуска сервера. Например:

[mariadb]
...
binlog_format=ROW

Будьте осторожны при изменении формата двоичного лога при использовании репликации. Когда вы изменяете формат двоичного лога на сервере, это изменяет формат только для этого сервера. Изменение формата двоичного лога на первичном сервере не влияет на формат двоичного лога реплики. Это может привести к несогласованным результатам или к сбою репликации.

Будьте осторожны при динамическом изменении формата двоичного лога, когда сервер является репликой и включена параллельная репликация. Если вы динамически меняете глобальное значение, то это не влияет на значения сессий текущих потоков. Это может привести к проблемам с параллельной репликацией, так как потоки-рабочие будут оставаться запущенными даже после выполнения STOP SLAVE. Это можно обойти, сбросив системную переменную slave_parallel_threads. Например:

STOP SLAVE;
SET GLOBAL slave_parallel_threads=0;
SET GLOBAL binlog_format='ROW';
SET GLOBAL slave_parallel_threads=4;
START SLAVE

Влияние формата двоичного лога на реплики

В MariaDB 10.0.22 и более поздних версиях реплика будет применять любые события, полученные с первичного сервера, независимо от формата двоичного лога. Системная переменная binlog_format применяется только к обычным (не реплицируемым) обновлениям.

Если вы используете MySQL или более старую версию MariaDB, чем 10.0.22, вы должны знать, что если вы запустили реплику в binlog_format=STATEMENT режиме, реплика остановится, если первичный сервер использует binlog_format , установленное на значение отличное от STATEMENT.

Формат двоичного лога поддерживает обратную совместимость. Это означает, что репликация всегда должна работать, если реплика имеет ту же или более новую версию MariaDB, чем первичный сервер.

База данных mysql

Операторы, которые влияют на базу данных mysql, могут регистрироваться по-другому, чем ожидается.

Если база данных mysql отредактирована непосредственно, регистрация выполняется как ожидается в соответствии с binlog_format. Операторы, которые непосредственно редактируют базу данных mysql, включают INSERT, UPDATE, DELETE, REPLACE, DO, LOAD DATA INFILE, SELECT и TRUNCATE TABLE.

Если база данных mysql редактируется косвенно, регистрация операторов выполняется с использованием регистрации на основе операторов, независимо от настройки binlog_format. Операторы, косвенно редактирующие базу данных mysql, включают GRANT, REVOKE, SET PASSWORD, RENAME USER, ALTER, DROP и CREATE (кроме ситуации, описанной ниже).

CREATE TABLE ... SELECT может использовать комбинацию форматов регистрации. Часть оператора CREATE TABLE регистрируется с использованием регистрации на основе операторов, в то время как часть SELECT регистрируется в соответствии со значением binlog_format.

См. также

  • Настройка репликации
  • Сжатие двоичного журнала
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/binary-log-formats/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API