DBAtlas · Veritabanı operasyon atlası

gh-ost ile trigger'sız online şema değişikliği

MySQLOnline İşlemler

Komut

# Replikaya baglanir, binlog'u oradan okur; cut-over bayrak dosyasi silinene kadar bekler
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
# Calisirken: durum / 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

Ne yapar?

Kopya tabloyu oluşturup satırları kopyalar; eşzamanlı değişiklikleri trigger yerine binlog'u okuyarak uygular. Throttle, durdurma ve cut-over zamanı çalışırken socket veya bayrak dosyalarıyla kontrol edilir.

Ne zaman kullanılır?

Yoğun yazma alan büyük tablolarda trigger yükü kabul edilemediğinde ve cut-over anını (ör. düşük trafik saati) elle seçmek istediğinde.

Dikkat

binlog_format=ROW ve binlog_row_image=FULL gerekir; bağlanılan replikada log_replica_updates=ON olmalı. Kullanıcıya SUPER veya REPLICATION CLIENT / REPLICATION SLAVE ve tabloda ALL gerekir. Foreign key içeren (parent veya child) tabloları desteklemez. Cut-over sonrası eski tablo _<tablo>_del adıyla kalır; doğruladıktan sonra elle DROP et (--ok-to-drop-table otomatik siler). 1.1.8 öncesi gh-ost sürümleri SHOW SLAVE STATUS kullandığından MySQL 8.4'te 1064 hatasıyla durur; 8.4 desteği 1.1.8 ile geldi. --postpone-cut-over-flag-file ile verilen dosyayı gh-ost kendisi oluşturur; dosya silinmeden cut-over yapılmaz.

DBAtlas'ta aç →

İlgili