sql >> Databasteknik >  >> RDS >> Mysql

Ändra stora MySQL InnoDB-tabeller

Redigera 2016: vi har nyligen (augusti 2016) släppt gh-ost , ändrar mitt svar för att återspegla det.

Idag finns det flera verktyg som låter dig göra ändringstabeller online för MySQL. Dessa är:

Låt oss betrakta den "normala" `ALTER TABLE`:

En stor tabell kommer att ta lång tid att ALTER . innodb_buffer_pool_size är viktig, och så är andra variabler, men på mycket stora bord är de alla försumbara. Det tar bara tid.

Vad MySQL gör med ALTER en tabell är att skapa en ny tabell med nytt format, kopiera alla rader och sedan byta. Under denna tid är bordet helt låst.

Tänk på ditt eget förslag:

Det kommer med största sannolikhet att fungera sämst av alla alternativ. Varför är det så? Eftersom du använder en InnoDB-tabell, INSERT INTO tablename_tmp SELECT * FROM tablename gör för en transaktion. en stor transaktion. Det kommer att skapa ännu mer belastning än den normala ALTER TABLE .

Dessutom måste du stänga av din applikation vid den tidpunkten så att den inte skriver (INSERT , DELETE , UPDATE ) till ditt bord. Om den gör det - är hela din transaktion meningslös.

Vad onlineverktygen ger

Verktygen fungerar inte alla lika. Grunderna delas dock:

  • De skapar en "skuggtabell" med ändrat schema
  • De skapar och använder utlösare för att sprida ändringar från originaltabell till spöktabell
  • De långsamt kopiera alla rader från din tabell till skuggtabell. De gör det i bitar:säg 1 000 rader åt gången.
  • De gör allt ovan medan du fortfarande kan komma åt och manipulera den ursprungliga tabellen.
  • När de är nöjda byter de de två med en RENAME .

openark-kit verktyget har använts i 3,5 år nu. Percona-verktyget är några månader gammalt, men möjligen mer testat än det förra. Facebooks verktyg sägs fungera bra för Facebook, men ger ingen generell lösning för den genomsnittliga användaren. Jag har inte använt det själv.

Redigera 2016: gh-ost är en triggerfri lösning som avsevärt minskar masterns skrivbelastning på mastern och frikopplar migreringsskrivbelastningen från den normala belastningen. Det är kontrollerbart, kontrollerbart, testbart. Vi har utvecklat det internt på GitHub och släppt det som öppen källkod; vi gör alla våra produktionsmigreringar via gh-ost i dag. Se mer här .

Varje verktyg har sina egna begränsningar, titta noga på dokumentationen.

Det konservativa sättet

Det konservativa sättet är att använda en Active-Passive Master-Master-replikering, gör ALTER på standbyservern (passiv), byt sedan roller och gör ALTER igen på vad som brukade vara den aktiva servern, nu passiviserad. Detta är också ett bra alternativ, men kräver en extra server och djupare kunskap om replikering.



  1. Vad är sekventiella kontra parallella strömmar i Java?

  2. Hur NOT LIKE fungerar i MySQL

  3. pyodbc kan inte ansluta till databasen

  4. PHP MySQL SQL parser (INSERT och UPPDATERA)