Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zmiana dużych tabel MySQL InnoDB

Edytuj 2016: niedawno (sierpień 2016) wydaliśmy gh-ost , modyfikując moją odpowiedź, aby ją odzwierciedlić.

Obecnie istnieje kilka narzędzi, które pozwalają tworzyć online alter table dla MySQL. Są to:

Rozważmy „normalną” `ALTER TABLE`:

ALTER dużej tabeli zajmie dużo czasu . innodb_buffer_pool_size jest ważne, podobnie jak inne zmienne, ale na bardzo dużym stole wszystkie są pomijalne. To po prostu wymaga czasu.

Co MySQL robi, aby ALTER tabela to utworzenie nowej tabeli w nowym formacie, skopiowanie wszystkich wierszy, a następnie przełączenie. W tym czasie stół jest całkowicie zablokowany.

Rozważ własną sugestię:

Najprawdopodobniej będzie działać najgorzej ze wszystkich opcji. Dlaczego? Ponieważ używasz tabeli InnoDB, INSERT INTO tablename_tmp SELECT * FROM tablename sprawia, że ​​transakcja. ogromny transakcja. Stworzy jeszcze większe obciążenie niż normalna ALTER TABLE .

Co więcej, będziesz musiał w tym czasie zamknąć swoją aplikację, aby nie pisała (INSERT , DELETE , UPDATE ) do swojego stolika. Jeśli tak - cała transakcja jest bezcelowa.

Co zapewniają narzędzia online

Nie wszystkie narzędzia działają jednakowo. Jednak podstawy są wspólne:

  • Tworzą „tablicę cieni” ze zmienionym schematem
  • Tworzą i używają wyzwalaczy do propagowania zmian z oryginalnej tabeli do tabeli widma
  • Oni powoli skopiuj wszystkie wiersze ze swojej tabeli do tabeli cieni. Robią to porcjami:powiedzmy 1000 wierszy na raz.
  • Robią wszystkie powyższe, podczas gdy nadal możesz uzyskać dostęp do oryginalnej tabeli i manipulować nią.
  • Gdy są usatysfakcjonowani, zamieniają je dwoma, używając RENAME .

zestaw openark Narzędzie jest używane od 3,5 roku. Narzędzie Percona ma kilka miesięcy, ale prawdopodobnie jest bardziej przetestowane niż poprzednie. Mówi się, że narzędzie Facebooka działa dobrze na Facebooku, ale nie zapewnia ogólnego rozwiązania dla przeciętnego użytkownika. Sam go nie używałem.

Edytuj 2016: gh-ost to rozwiązanie niewymagające wyzwalania, które znacznie zmniejsza obciążenie zapisu mastera, oddzielając obciążenie zapisu migracji od normalnego obciążenia. Jest audytowalny, kontrolowany, testowalny. Opracowaliśmy go wewnętrznie na GitHub i wydaliśmy jako open source; wszystkie nasze migracje produkcyjne wykonujemy za pośrednictwem gh-ost Dziś. Zobacz więcej tutaj .

Każde narzędzie ma swoje ograniczenia, spójrz uważnie na dokumentację.

Konserwatywny sposób

Konserwatywnym sposobem jest użycie replikacji Active-Passive Master-Master, wykonaj ALTER na serwerze rezerwowym (pasywnym), a następnie zmień role i wykonaj ALTER ponownie na tym, co kiedyś było aktywnym serwerem, teraz stało się pasywne. Jest to również dobra opcja, ale wymaga dodatkowego serwera i głębszej wiedzy na temat replikacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqldump problemy z błędem przywracania:'Proszę ODRZUĆ obszar tabel przed IMPORTEM'

  2. Koncepcje MySQL:sesja a połączenie

  3. ORDER BY NULL w MySQL

  4. Strategia synchronizacji bazy danych z wielu lokalizacji do centralnej bazy danych i odwrotnie

  5. Jak mogę sprawdzić, kiedy tabela MySQL była ostatnio aktualizowana?