Неблокирующий ALTER большой таблицы через pt-online-schema-change
MySQLОнлайн-операцииКоманда
# First --dry-run, then the same command with --execute; throttles on replica lag
pt-online-schema-change --alter "ADD COLUMN region CHAR(2) NULL, ADD INDEX ix_region (region)" \
D=shop,t=orders,h=db1,u=osc,p='Osc#2024',s=1 \
--max-lag=5 --check-replica-lag h=db2,u=osc,p='Osc#2024',s=1 \
--max-load Threads_running=50 --critical-load Threads_running=200 \
--set-vars lock_wait_timeout=5 --noversion-check --dry-runЧто делает
Создаёт пустую копию с новой структурой, копирует строки порциями, отражает изменения во время копирования через триггеры и в конце меняет таблицы местами атомарным RENAME. Самостоятельно замедляется / приостанавливается, когда нагрузка или отставание реплики превышают пороги.
Когда использовать
Для ALTER, требующих COPY (тип столбца, charset, изменение PK) или способных вызвать долгое отставание реплики.
Внимание
У таблицы должен быть PK или уникальный ключ. Триггеры добавляют накладные расходы к каждой записи во время миграции; на таблицах с очень интенсивной записью gh-ost влияет меньше. Если дочерние таблицы ссылаются на эту таблицу через внешние ключи, требуется --alter-foreign-keys-method=auto. Для учётных записей caching_sha2_password добавьте s=1 (TLS) в DSN; иначе подключение к реплике завершится ошибкой 'Authentication requires secure connection'. DSN для --check-replica-lag не наследует пользователя / пароль из основного DSN; укажите их. Обмен таблиц берёт кратковременную блокировку метаданных; держите lock_wait_timeout низким — при невозможности получить блокировку выполняется повторная попытка.