Spec-Zone.ru › MySQL 5.7

16.1.4.2 Включение транзакций GTID в режиме онлайн

В этом разделе описывается, как включить транзакции GTID, а также, по желанию, автоматическое позиционирование на серверах, которые уже работают в онлайн-режиме и используют анонимные транзакции. Эта процедура не требует вывода сервера из работы и подходит для использования в производственной среде. Однако, если есть возможность вывести серверы из работы при включении транзакций GTID, этот процесс будет проще.

Перед началом убедитесь, что серверы соответствуют следующим предварительным условиям:

  • Все серверы в вашей топологии должны использовать MySQL 5.7.6 или более позднюю версию. Вы не можете включить транзакции GTID в режиме онлайн на отдельных серверах, если все серверы в топологии не используют эту версию.

  • На всех серверах значение gtid_mode установлено по умолчанию OFF.

Данную процедуру можно приостановить в любое время и продолжить позже в том же месте, или отменить, перейдя к соответствующему шагу раздела 16.1.4.3 «Отключение транзакций GTID в режиме онлайн», описывающего онлайн-процедуру отключения GTID. Это делает процедуру отказоустойчивой, так как любые не связанные с ней проблемы, которые могут возникнуть в середине процедуры, можно решить обычным способом, а затем продолжить процедуру с того места, где она была прервана.

Примечание

Необходимо завершить каждый шаг перед переходом к следующему.

Для включения транзакций GTID:

  1. На каждом сервере выполните:

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

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

    Важно

    Это первый важный шаг. Вы должны убедиться, что в логах ошибок нет предупреждений, прежде чем переходить к следующему шагу.

  2. На каждом сервере выполните:

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  3. На каждом сервере выполните:

    SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

    Неважно, какой сервер выполнит это утверждение первым, но важно, чтобы все серверы завершили этот шаг до начала следующего шага на любом сервере.

  4. На каждом сервере выполните:

    SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

    Неважно, какой сервер выполнит это утверждение первым.

  5. На каждом сервере подождите, пока переменная состояния ONGOING_ANONYMOUS_TRANSACTION_COUNT не станет равной нулю. Это можно проверить, выполнив:

    SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
    Примечание

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

  6. Подождите, пока все транзакции, сгенерированные до шага 5, не будут реплицированы на все серверы. Вы можете сделать это, не останавливая обновления: единственное важное условие — репликация всех анонимных транзакций.

    См. раздел 16.1.4.4 «Проверка репликации анонимных транзакций» для одного из способов проверки того, что все анонимные транзакции были реплицированы на все серверы.

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

    Например, после завершения шага 6 на сервере, где вы выполняете резервное копирование, можно выполнить FLUSH LOGS. Затем либо выполните явное резервное копирование, либо подождите следующую итерацию любой запланированной вами периодической процедуры резервного копирования.

    В идеале дождитесь, пока сервер не очистит все двоичные логи, существовавшие на момент завершения шага 6. Дождитесь также истечения срока действия любых резервных копий, созданных до шага 6.

    Важно

    Это второй важный момент. Необходимо понимать, что двоичные логи, содержащие анонимные транзакции без GTID, не могут быть использованы после следующего шага. После этого шага вы должны быть уверены, что транзакции без GTID больше не существуют в топологии.

  8. На каждом сервере выполните:

    SET @@GLOBAL.GTID_MODE = ON;
  9. На каждом сервере добавьте gtid_mode=ON и enforce_gtid_consistency=ON в my.cnf.

    Теперь вы гарантированно можете использовать все транзакции с GTID (за исключением транзакций, сгенерированных на шаге 5 или ранее, которые уже обработаны). Чтобы начать использовать протокол GTID, позволяющий в дальнейшем выполнять автоматическое fail-over, выполните следующее на каждой реплике. По желанию, если вы используете многоканальную репликацию, сделайте это для каждого канала и включите условие FOR CHANNEL channel:

    STOP SLAVE [FOR CHANNEL 'channel'];
    CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
    START SLAVE [FOR CHANNEL 'channel'];

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/replication-mode-change-online-enable-gtids.html

Spec-Zone.ru

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