sql >> Database teknologi >  >> RDS >> Mysql

Ændring af store MySQL InnoDB-tabeller

Rediger 2016: vi har for nylig (august 2016) udgivet gh-ost , ændrer mit svar, så det afspejler det.

I dag er der flere værktøjer, som giver dig mulighed for at lave online ændringstabel til MySQL. Disse er:

Lad os overveje den "normale" `ALTER TABLE`:

En stor tabel vil tage lang tid at ALTER . innodb_buffer_pool_size er vigtig, og det samme er andre variabler, men på meget store bord er de alle ubetydelige. Det tager bare tid.

Hvad MySQL gør ved ALTER en tabel er at oprette en ny tabel med nyt format, kopiere alle rækker og derefter skifte over. I denne tid er bordet fuldstændig låst.

Overvej dit eget forslag:

Det vil højst sandsynligt fungere dårligst af alle muligheder. Hvorfor det? Fordi du bruger en InnoDB-tabel, skal INSERT INTO tablename_tmp SELECT * FROM tablename sørger for en transaktion. en enorm transaktion. Det vil skabe endnu mere belastning end den normale ALTER TABLE .

Desuden bliver du nødt til at lukke din applikation ned på det tidspunkt, så den ikke skriver (INSERT , DELETE , UPDATE ) til dit bord. Hvis det gør - er hele din transaktion meningsløs.

Hvad onlineværktøjerne giver

Værktøjerne virker ikke alle ens. Det grundlæggende er dog delt:

  • De opretter en "skygge"-tabel med ændret skema
  • De opretter og bruger triggere til at udbrede ændringer fra original tabel til spøgelsestabel
  • De langsomt kopiere alle rækkerne fra din tabel til skyggetabel. De gør det i bidder:f.eks. 1.000 rækker ad gangen.
  • De gør alt ovenstående, mens du stadig er i stand til at få adgang til og manipulere den originale tabel.
  • Når de er tilfredse, bytter de de to ved hjælp af en RENAME .

openark-sættet værktøjet har været i brug i 3,5 år nu. Percona-værktøjet er et par måneder gammelt, men muligvis mere testet end førstnævnte. Facebooks værktøj siges at fungere godt for Facebook, men giver ikke en generel løsning til den gennemsnitlige bruger. Jeg har ikke selv brugt det.

Rediger 2016: gh-ost er en triggerfri løsning, som væsentligt reducerer master-skrivebelastningen på masteren, og afkobler migreringsskrivebelastningen fra den normale belastning. Det er kontrollerbart, kontrollerbart, testbart. Vi har udviklet det internt hos GitHub og udgivet det som open source; vi udfører alle vores produktionsmigreringer via gh-ost i dag. Se mere her .

Hvert værktøj har sine egne begrænsninger, se nøje på dokumentationen.

Den konservative måde

Den konservative måde er at bruge en Active-Passive Master-Master-replikering, gør ALTER på standby-serveren (passiv), skift derefter roller og udfør ALTER igen på det, der plejede at være den aktive server, nu blevet passiv. Dette er også en god mulighed, men kræver en ekstra server og dybere kendskab til replikering.



  1. MySql Inner Join med WHERE-klausul

  2. Spor Flag 2389 og den nye Cardinality Estimator

  3. MySQL henter streng(er) mellem to # / flere par af #

  4. Forespørgsel tilskud til en tabel i postgres