Изменение структуры таблиц в кластере MySQL sync с репликами
Чтобы изменить структуру таблицы в кластере MySQL sync с репликами, рекомендуем использовать утилиту pt-online-schema-change из пакета Percona Toolkit.
Эта утилита меняет структуру таблицы без блокировки операций чтения и записи.
Мы не рекомендуем использовать стандартную команду ALTER TABLE в кластерах MySQL sync с репликами.
Она может вызвать ограничения в работе кластера:
- таблица в мастер-ноде будет недоступна на время изменения структуры;
- реплики могут отставать от мастер-ноды, возможна остановка репликации.
Принцип работы pt-online-schema-change
С требованиями, ограничениями и известными ошибками при использовании утилиты можно ознакомиться в инструкции pt-online-schema-change документации Percona Toolkit.
Если на изменяемую таблицу ссылаются внешние ключи, это усложнит работу утилиты. Подробнее в подразделе Особенности работы утилиты при использовании внешних ключей.
Утилита pt-online-schema-change меняет структуру не в оригинальной таблице, а в ее копии.
Копия становится новой версией таблицы.
Из-за этого оригинальная таблица не блокируется, а операции чтения и записи в ней остаются доступными.
При запуске утилита создает пустую копию оригинальной таблицы, изменяет ее структуру и затем построчно копирует данные из оригинальной таблицы в новую.
Для безопасности данных утилита по умолчанию не применяет изменения в таблице, если вы не укажете параметр --execute.
Подробнее о параметре в подразделе Основные параметры для изменения таблицы в кластере MySQL sync.
Для синхронизации данных между таблицами утилита создает триггеры — это позволяет при любых изменениях данных в оригинальной таблице автоматически подтягивать их в новую. Если до запуска утилиты в оригинальной таблице уже были определены какие-либо триггеры, утилита работать не будет. Подробнее о триггерах в инструкции Using Triggers документации MySQL.
Когда все данные скопированы, утилита одновременно переименовывает оригинальную и новую таблицы. Затем заменяет оригинальную таблицу на новую и удаляет оригинальную таблицу.
Особенности работы утилиты при использовании внешних ключей
Внешние ключи в MySQL позволяют ссылаться на данные в других таблицах, поддерживая связи между ними. Подробнее о внешних ключах в инструкции Using Foreign Keys документации MySQL.
Если на изменяемую таблицу ссылаются внешние ключи:
- утилита не сможет изменить таблицу без параметра
--alter-foreign-keys-method. Он необходим, чтобы внешние ключи корректно указывали на новую таблицу. Подробнее о параметре в подразделе Основные параметры для изменения таблицы в кластере MySQL sync; - имена внешних ключей в новой таблице будут изменены — например,
constraint_nameстанет_constraint_name. MySQL не позволяет использовать одинаковые имена ключей в одной базе данных. Утилита добавляет символ_, чтобы избежать конфликта имен.