DBAtlas · Atlas d'exploitation des bases de données

Changement de schéma en ligne sans trigger avec gh-ost

MySQLOpérations en ligne

Commande

# 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

Ce que fait la commande

Construit une table fantôme (ghost) et copie les lignes ; applique les changements concurrents en lisant le binlog au lieu d'utiliser des triggers. Le bridage, la pause et le moment du cut-over sont contrôlés à l'exécution via le socket ou des fichiers indicateurs.

Quand l'utiliser

Sur les grandes tables à forte écriture où la surcharge des triggers est inacceptable et où vous voulez choisir vous-même le moment du cut-over (par ex. une fenêtre de faible trafic).

Attention

Exige binlog_format=ROW et binlog_row_image=FULL ; la réplique à laquelle il se connecte a besoin de log_replica_updates=ON. L'utilisateur a besoin de SUPER ou de REPLICATION CLIENT / REPLICATION SLAVE plus ALL sur la table. Les tables avec clés étrangères (parent ou enfant) ne sont pas prises en charge. Après le cut-over, l'ancienne table reste sous le nom _<table>_del ; supprimez-la manuellement après vérification (--ok-to-drop-table la supprime automatiquement). Les versions de gh-ost antérieures à 1.1.8 utilisent SHOW SLAVE STATUS et s'arrêtent avec l'erreur 1064 sur MySQL 8.4 ; la prise en charge de 8.4 est arrivée en 1.1.8. gh-ost crée lui-même le fichier indiqué dans --postpone-cut-over-flag-file ; le cut-over n'a pas lieu tant que le fichier n'est pas supprimé.

Ouvrir dans DBAtlas →

Voir aussi