Nicht blockierendes ALTER auf einer großen Tabelle mit pt-online-schema-change
MySQLOnline-OperationenBefehl
# 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-runWas es tut
Legt eine leere Kopie mit der neuen Struktur an, kopiert Zeilen in Chunks, spiegelt Änderungen während des Kopierens per Trigger und tauscht die Tabellen schließlich mit einem atomaren RENAME. Es verlangsamt / pausiert selbstständig, wenn Last oder Replica-Lag die Schwellenwerte überschreiten.
Wann einsetzen
Für ALTERs, die COPY brauchen (Spaltentyp, Zeichensatz, PK-Änderung) oder lange Replica-Lags verursachen würden.
Vorsicht
Die Tabelle braucht einen PK oder Unique Key. Trigger erzeugen während der Migration Overhead bei jedem Schreibvorgang; bei sehr schreibintensiven Tabellen hat gh-ost weniger Auswirkungen. Verweisen Child-Tabellen per Foreign Key auf diese Tabelle, ist --alter-foreign-keys-method=auto nötig. Bei Konten mit caching_sha2_password s=1 (TLS) zum DSN hinzufügen; sonst schlägt die Replica-Verbindung mit 'Authentication requires secure connection' fehl. Der DSN von --check-replica-lag übernimmt Benutzer / Passwort nicht vom Haupt-DSN; gib sie an. Der Tausch nimmt kurz einen Metadata Lock; halte lock_wait_timeout niedrig, es versucht es erneut, wenn die Sperre nicht zu bekommen ist.