Úpravy v roce 2016: nedávno (srpen 2016) jsme vydali gh-ost
, upravující mou odpověď, aby ji odrážela.
Dnes existuje několik nástrojů, které vám umožňují provádět online změny tabulky pro MySQL. Jsou to:
- úprava 2016: gh-ost :Nástroj pro migraci schémat bez spouštěče GitHubu (prohlášení:Jsem autorem tohoto nástroje)
- oak-online- alter-table , jako součást sady openark-kit (odmítnutí odpovědnosti:Jsem autorem tohoto nástroje)
- pt-online-schema- změnit , jako součást Percona Toolkit
- Změna online schématu
Podívejme se na "normální" `ALTER TABLE`:
ALTER
u velké tabulky bude trvat dlouho . innodb_buffer_pool_size
je důležité, stejně jako ostatní proměnné, ale na velmi velké tabulce jsou všechny zanedbatelné. Chce to jen čas.
Co dělá MySQL pro ALTER
tabulka je vytvořit novou tabulku s novým formátem, zkopírovat všechny řádky a poté přepnout. Během této doby je stůl zcela uzamčen.
Zvažte svůj vlastní návrh:
S největší pravděpodobností bude fungovat nejhůře ze všech možností. proč tomu tak je? Protože používáte tabulku InnoDB, INSERT INTO tablename_tmp SELECT * FROM tablename
provádí transakci. obrovské transakce. Vytvoří ještě větší zatížení než normální ALTER TABLE
.
Navíc budete muset v tu dobu svou aplikaci vypnout, aby nezapisovala (INSERT
, DELETE
, UPDATE
) na váš stůl. Pokud ano – celá vaše transakce je zbytečná.
Co poskytují online nástroje
Ne všechny nástroje fungují stejně. Základy jsou však sdíleny:
- Vytvářejí "stínovou" tabulku se změněným schématem
- Vytvářejí a používají spouštěče k šíření změn z původní tabulky do tabulky duchů
- Oni pomalu zkopírujte všechny řádky z vaší tabulky do stínové tabulky. Dělají to po částech:řekněme 1000 řádků najednou.
- Udělají vše výše uvedené, zatímco vy máte stále přístup k původní tabulce a můžete s ní manipulovat.
- Když jsou spokojeni, vymění je pomocí
RENAME
.
sada openark nástroj se používá již 3,5 roku. Nástroj Percona je několik měsíců starý, ale možná testovanější než předchozí. Nástroj Facebooku prý funguje pro Facebook dobře, ale běžnému uživateli neposkytuje obecné řešení. Sám jsem to nepoužil.
Úpravy v roce 2016: gh-ost
je řešení bez spouště, které výrazně snižuje zatížení master zápisem na master, čímž se odděluje zatížení zápisu migrace od běžného zatížení. Je auditovatelný, kontrolovatelný, testovatelný. Vyvinuli jsme jej interně na GitHubu a vydali jako open source; všechny naše produkční migrace provádíme prostřednictvím gh-ost
dnes. Další informace naleznete zde
.
Každý nástroj má svá omezení, podívejte se pozorně na dokumentaci.
Konzervativní způsob
Konzervativním způsobem je použití replikace Active-Passive Master-Master, proveďte ALTER
na pohotovostním (pasivním) serveru, poté přepněte role a proveďte ALTER
opět na tom, co býval aktivní server, nyní se změnil na pasivní. To je také dobrá volba, ale vyžaduje další server a hlubší znalosti replikace.