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:
- rediger 2016: gh-ost :GitHubs triggerfri skemamigreringsværktøj (disclaimer:Jeg er forfatter til dette værktøj)
- oak-online- ændre-tabel , som en del af openark-sættet (Ansvarsfraskrivelse:Jeg er forfatter til dette værktøj)
- pt-online-schema- ændre , som en del af Percona Toolkit
- Facebooks onlineskemaændring til MySQL
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.