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.31 «Репликация и временные таблицы», временные таблицы не реплицируются при использовании журналирования на основе строк или смешанного формата. Дополнительную информацию см. в разделе 19.2.1.1 «Преимущества и недостатки репликации на основе инструкций и на основе строк».
Временные таблицы не реплицируются при использовании журналирования на основе строк или смешанного формата, так как в этом нет необходимости. Кроме того, поскольку временные таблицы могут считываться только из потока, который их создал, редко, если вообще, есть выгода от их репликации, даже при использовании журналирования на основе инструкций.
Вы можете переключиться с журналирования на основе инструкций на журналирование на основе строк в реальном времени, даже когда были созданы временные таблицы, но вы не можете переключиться с журналирования на основе строк или смешанного формата на журналирование на основе инструкций в реальном времени из-за того, что любые
CREATE TEMPORARY TABLEинструкции были опущены из двоичного журнала в предыдущем режиме.Сервер MySQL отслеживает режим журналирования, который был активен при создании каждой временной таблицы. Когда завершается сеанс определенного клиента, сервер записывает
DROP TEMPORARY TABLE IF EXISTSинструкцию для каждой временной таблицы, которая все еще существует и была создана при использовании журналирования двоичных логов на основе инструкций. Если при создании таблицы использовалось журналирование двоичных логов на основе строк или смешанного формата, тоDROP TEMPORARY TABLE IF EXISTSинструкция не записывается.Нетранзакционные инструкции DML, связанные с временными таблицами, разрешены при использовании
binlog_format=ROW, при условии, что любые не транзакционные таблицы, затронутые инструкциями, являются временными таблицами. RBL и синхронизация не транзакционных таблиц. Когда затронуто много строк, набор изменений разбивается на несколько событий; при подтверждении инструкции все эти события записываются в двоичный журнал. При выполнении на реплике блокировка таблицы берется для всех вовлеченных таблиц, а затем строки применяются в пакетном режиме. В зависимости от используемого движка для копии таблицы на реплике, это может быть или не быть эффективным.
Задержка и размер двоичного журнала. 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.