19.2.1.2 Использование протоколирования и репликации на основе строк
MySQL использует протоколирование на основе операторов (SBL), протоколирование на основе строк (RBL) или смешанное протоколирование. Тип используемого двоичного журнала влияет на размер и эффективность протоколирования. Поэтому выбор между репликацией на основе строк (RBR) и репликацией на основе операторов (SBR) зависит от вашего приложения и среды. В этом разделе описаны известные проблемы при использовании журнала в формате на основе строк и описаны некоторые лучшие практики его использования в репликации.
Для дополнительной информации см. Раздел 19.2.1, «Форматы репликации» и Раздел 19.2.1.1, «Преимущества и недостатки репликации на основе операторов и на основе строк».
Сведения о проблемах, специфичных для репликации NDB Cluster (которая зависит от репликации на основе строк), см. в Разделе 25.7.3, «Известные проблемы репликации NDB Cluster».
-
Протоколирование временных таблиц на основе строк. Как отмечается в Разделе 19.5.1.32, «Репликация и временные таблицы», временные таблицы не реплицируются при использовании протоколирования на основе строк или смешанного формата. Для получения дополнительной информации см. Раздел 19.2.1.1, «Преимущества и недостатки репликации на основе операторов и на основе строк».
Временные таблицы не реплицируются при использовании протоколирования на основе строк или смешанного формата, так как это не требуется. Кроме того, поскольку временные таблицы могут читаться только из потока, который их создал, редко, если вообще, вы получаете какую-либо пользу от их репликации, даже при использовании формата на основе операторов.
Вы можете переключиться с протоколирования на основе операторов на протоколирование на основе строк во время выполнения, даже если временные таблицы были созданы, но вы не можете переключиться с протоколирования на основе строк или смешанного формата на протоколирование на основе операторов во время выполнения из-за возможных
CREATE TEMPORARY TABLEоператоров, которые были опушены из двоичного журнала в предыдущем режиме.Сервер MySQL отслеживает режим протоколирования, который был активен при создании каждой временной таблицы. Когда завершается сессия определённого клиента, сервер записывает
DROP TEMPORARY TABLE IF EXISTSоператор для каждой временной таблицы, которая все еще существует и была создана, когда использовалось протоколирование двоичного журнала на основе операторов. Если при создании таблицы использовалось протоколирование двоичного журнала на основе строк или смешанного формата,DROP TEMPORARY TABLE IF EXISTSоператор не записывается.Нетранзакционные операторы DML, связанные с временными таблицами, разрешены при использовании
binlog_format=ROW, при условии, что любые не транзакционные таблицы, затронутые этими операторами, являются временными таблицами. RBL и синхронизация не транзакционных таблиц. Когда затронуто много строк, набор изменений разделяется на несколько событий; при выполнении оператора commit все эти события записываются в двоичный журнал. При выполнении на реплике блокировка таблицы накладывается на все затронутые таблицы, а затем строки применяются в пакетном режиме. В зависимости от используемого движка для копии таблицы на реплике это может быть или не быть эффективным.
Задержка и размер двоичного журнала. RBL записывает изменения для каждой строки в двоичный журнал, поэтому его размер может довольно быстро увеличиваться. Это может значительно увеличить время, необходимое для внесения изменений на реплике, которые соответствуют изменениям на источнике. Вы должны учитывать возможность этой задержки в своих приложениях.
Чтение двоичного журнала. mysqlbinlog отображает события на основе строк в двоичном журнале, используя оператор
BINLOG. Этот оператор отображает событие в виде строки, закодированной в формате Base64, смысл которой не очевиден. При вызове с параметрами--base64-output=DECODE-ROWSи--verbose, mysqlbinlog форматирует содержимое двоичного журнала для удобочитаемости. Когда события двоичного журнала были записаны в формате на основе строк, и вы хотите прочитать или восстановиться после сбоя репликации или базы данных, вы можете использовать эту команду для чтения содержимого двоичного журнала. Для получения дополнительной информации см. Раздел 6.6.9.2, «mysqlbinlog Отображение событий на основе строк».-
Ошибки выполнения двоичного журнала и режим выполнения реплики. Использование
replica_exec_mode=IDEMPOTENTобычно полезно только при репликации MySQL NDB Cluster, для которойIDEMPOTENTявляется значением по умолчанию. (См. Раздел 25.7.10, «Репликация NDB Cluster: двунаправленная и циклическая репликация»). Когдаreplica_exec_modeравноIDEMPOTENT, отказ от применения изменений из RBL, потому что исходная строка не найдена, не вызывает ошибку или не приводит к сбою репликации. Это означает, что возможно, что обновления не применяются на реплике, так что источник и реплика больше не синхронизированы. Проблемы с задержкой и использование не транзакционных таблиц с RBR, когдаreplica_exec_modeравноIDEMPOTENT, могут привести к ещё большему расхождению между источником и репликой. Для получения дополнительной информации оreplica_exec_modeсм. Раздел 7.1.8, «Системные переменные сервера».В других сценариях установка
replica_exec_modeнаSTRICTобычно достаточна; это значение по умолчанию для движков хранения, отличных отNDB. Фильтрование на основе идентификатора сервера не поддерживается. Вы можете фильтровать на основе идентификатора сервера, используя параметр
IGNORE_SERVER_IDSдляCHANGE REPLICATION SOURCE TO. Этот параметр работает как с форматом протоколирования на основе операторов, так и с форматом на основе строк, но не может использоваться, когдаgtid_mode=ON. Другой метод фильтрации изменений на некоторых репликах — использование клаузыWHERE, которая включает клаузу@@server_id <>с операторамиid_valueUPDATEиDELETE. Например,WHERE @@server_id <> 1. Однако это не работает правильно с протоколированием на основе строк. Чтобы использовать системную переменнуюserver_idдля фильтрации операторов, используйте протоколирование на основе операторов.RBL, не транзакционные таблицы и остановленные реплики. При использовании протоколирования на основе строк, если сервер реплики останавливается, в то время как поток реплики обновляет не транзакционную таблицу, база данных реплики может достичь несогласованного состояния. По этой причине рекомендуется использовать транзакционный движок хранения, такой как
InnoDB, для всех таблиц, реплицируемых с использованием формата на основе строк. ИспользованиеSTOP REPLICAилиSTOP REPLICA SQL_THREADперед выключением сервера MySQL реплики помогает предотвратить возникновение проблем и всегда рекомендуется независимо от используемого формата протоколирования или движка хранения.
© 2025 Oracle
Licensed under the GPLv2 License.