Mam pełną odpowiedź na to pytanie.
Po wstawieniu innodb_file_per_table , a nowe tabele InnoDB można zmniejszyć za pomocą ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
To zmniejszy nowe .ibd
pliki GWARANTOWANE.
Jeśli uruchomisz ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
tabelę InnoDB utworzoną przed użyciem tabeli_pliku_inodb_per_table, spowoduje to wyrwanie danych i indeksów dla tej tabeli z pliku ibdata1 i zapisanie jej w .ibd
pliku, co spowoduje pozostawienie stałego gołębia w całości w ibdata1, którego nigdy nie można ponownie użyć .
ibdata1
Plik normalnie mieści cztery rodzaje informacji
Oto gwarantowany sposób zmniejszenia pliku ibdata1 prawie na zawsze ...
KROK 01) MySQL Zrzuć wszystkie bazy danych do pliku tekstowego SQL (nazwij go SQLData.sql)
KROK 02) Usuń wszystkie bazy danych (oprócz schematów mysql, information_schema i performance_schema)
KROK 03) Zamknij mysql
KROK 04) Dodaj następujące wiersze do /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Uwaga: Niezależnie od tego, jaki zestaw masz dla innodb_buffer_pool_size, upewnij się, że innodb_log_file_size to 25% innodb_buffer_pool_size.
- KROK 05) Usuń ibdata1, ib_logfile0 i ib_logfile1 ( przed usunięciem zobacz aktualizację poniżej! )
W tym momencie powinien istnieć tylko schemat mysql w / var / lib / mysql
- KROK 06) Uruchom ponownie mysql
Spowoduje to ponowne utworzenie ibdata1 przy 10 MB (nie konfiguruj opcji), ib_logfile0 i ib_logfile1 przy 1G każdy
- KROK 07) Ponownie załaduj SQLData.sql do mysql
ibdata1
wzrośnie, ale będzie zawierać tylko metadane tabeli i dane przerywane MVCC.
Każda tabela InnoDB będzie istnieć poza ibdata1
Załóżmy, że masz tabelę InnoDB o nazwie mydb.mytable. Jeśli wejdziesz do /var/lib/mysql/mydb
, zobaczysz dwa pliki reprezentujące tabelę
mytable.frm
(Nagłówek silnika pamięci masowej)
mytable.ibd
(Strona główna danych tabeli i indeksów tabeli dla mydb.mytable
)
ibdata1
nigdy nie będzie już zawierał danych i indeksów InnoDB.
Z opcją innodb_file_per_table w /etc/my.cnf
, możesz uruchomić OPTIMIZE TABLE mydb.mytable
LUB, ALTER TABLE mydb.mytable ENGINE=InnoDB;
a plik /var/lib/mysql/mydb/mytable.ibd
faktycznie się zmniejszy.
Robiłem to wiele razy w mojej karierze jako MySQL DBA bez żadnego problemu. W rzeczywistości, kiedy pierwszy raz to zrobiłem, zwinąłem 50 GB pliku ibdata1 do 50 MB.
Spróbuj. Jeśli masz dodatkowe pytania, napisz do mnie. Zaufaj mi. Będzie to działać w krótkim okresie i na dłuższą metę.
AKTUALIZACJA 2013-07-02 15:08 EDT
Jest jedno zastrzeżenie, które mam w tym względzie, które zaktualizowałem w innych moich postach, ale przegapiłem to: aktualizuję swoją odpowiedź nieco bardziej za pomocą innodb_fast_shutdown, ponieważ kiedyś restartowałem mysql i zatrzymywałem mysql, aby to zrobić. Teraz ten jeden krok jest niezbędny, ponieważ każda niezatwierdzona transakcja może zawierać inne ruchome części w dziennikach transakcji InnoDB i poza nimi ( patrz Infrastruktura InnoDB ).
Należy pamiętać, że ustawienie innodb_fast_shutdown na 2 również wyczyści dzienniki, ale więcej ruchomych części nadal istnieje i zostanie wybranych podczas odzyskiwania po awarii podczas uruchamiania mysqld. Ustawienie 0 jest najlepsze.