DBAtlas · Атлас эксплуатации баз данных

Онлайн-изменение схемы без триггеров через gh-ost

MySQLОнлайн-операции

Команда

# Connects to a replica and reads its binlog; postpones cut-over until the flag file is removed
gh-ost --host=db2 --port=3306 --user=ghost --password='Gh0st#2024' \
  --database=shop --table=orders \
  --alter="ADD COLUMN channel VARCHAR(20) NULL, ADD INDEX ix_channel (channel)" \
  --max-load=Threads_running=50 --critical-load=Threads_running=200 --max-lag-millis=1500 \
  --exact-rowcount --concurrent-rowcount --default-retries=120 \
  --postpone-cut-over-flag-file=/tmp/ghost.postpone --panic-flag-file=/tmp/ghost.panic \
  --serve-socket-file=/tmp/gh-ost.shop.orders.sock --ssl --ssl-allow-insecure --execute
# While running: status / throttle / cut-over
echo status | nc -U /tmp/gh-ost.shop.orders.sock
echo throttle | nc -U /tmp/gh-ost.shop.orders.sock
rm /tmp/ghost.postpone

Что делает

Строит ghost-таблицу и копирует строки; применяет параллельные изменения, читая binlog вместо триггеров. Throttling, пауза и момент cut-over управляются во время работы через сокет или флаг-файлы.

Когда использовать

На больших таблицах с интенсивной записью, где накладные расходы триггеров неприемлемы и нужно самостоятельно выбрать момент cut-over (например, окно с низким трафиком).

Внимание

Требует binlog_format=ROW и binlog_row_image=FULL; реплике, к которой он подключается, нужен log_replica_updates=ON. Пользователю нужны SUPER или REPLICATION CLIENT / REPLICATION SLAVE плюс ALL на таблицу. Таблицы с внешними ключами (родительские или дочерние) не поддерживаются. После cut-over старая таблица остаётся как _<table>_del; удалите её вручную после проверки (--ok-to-drop-table удаляет её автоматически). Релизы gh-ost до 1.1.8 используют SHOW SLAVE STATUS и останавливаются с ошибкой 1064 на MySQL 8.4; поддержка 8.4 появилась в 1.1.8. gh-ost сам создаёт файл, указанный в --postpone-cut-over-flag-file; cut-over не выполняется, пока файл не удалён.

Открыть в DBAtlas →

Связанные материалы