sql >> Databáze >  >> RDS >> Mysql

Změna velkých tabulek MySQL InnoDB

Ú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.



  1. Použití LIKE v bindParam pro dotaz MySQL PDO

  2. Počkejte na statistiky a úložiště dotazů

  3. Úvod do referenčních kurzorů PL/SQL v databázi Oracle

  4. Optimalizujte dotaz MySQL, abyste se vyhnuli použití kde; Použití dočasné; Pomocí řazení souborů