Musisz iść z innodb_file_per_table i musisz zrobić, jak czyszczenie przy użyciu obecnej infrastruktury InnoDB.
Widziałem, jak wielu klientów hostujących DB konfiguruje MySQL i pozostawia InnoDB w domyślnym stanie. To powoduje, że systemowy obszar tabel (lepiej znany jako ibdata1) rośnie dziko.
Nawet jeśli przełączysz się na innodb_file_per_table, plik .ibd musiałby zostać wyodrębniony z ibdata1, a ibdata nigdy się nie zmniejszy. Na przykład, jeśli masz tabelę o nazwie mydb.mytable, która znajduje się w ibdata1 zajmującej 2 GB, aby ją rozpakować, musisz wykonać następujące czynności:
KROK 01) Dodaj to do /etc/my.cnf
[mysqld]
innodb_file_per_table
KROK 02) service mysql restart
KROK 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
To sprawi, że plik /var/lib/mysql/mydb/mytable.ibd
Niestety 2 GB miejsca zajmowanego przez tabelę przed zmianą nie może zostać odzyskane. Pisałem wcześniejsze posty o tym, jak i dlaczego wyczyścić infrastrukturę InnoDB:
Po dokonaniu tej ważnej zmiany nie zapomnij zwiększyć innodb_open_files (domyślnie 300) . W przeciwnym razie dostęp do dysku jest bardzo ograniczony.
W odniesieniu do złączeń upewnij się, że masz odpowiednie indeksy, które obsługują kryteria łączenia.
AKTUALIZACJA 2012-04-02 11:30 EDT
Użycie innodb_file_per_table w nowej instalacji powoduje, że ibdata1 rośnie bardzo wolno, ponieważ cały DDL jest wykonywany zewnętrznie w stosunku do ibdata. Możesz zmniejszyć dowolną tabelę InnoDB, o której wspomniałem wcześniej:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
AKTUALIZACJA 2012-04-02 16:50 EDT
Jeśli chodzi o kopie zapasowe, należy zachować szczególną ostrożność podczas wykonywania kopii plików .ibd. Dlaczego?
Wewnątrz każdego pliku .ibd znajduje się specjalna wartość znana jako id_przestrzeni. W ibdata1 znajduje się lista wartości id_przestrzeni_ tabel. Jeśli kiedykolwiek wykonasz konserwację tabeli, która wymaga upuszczenia i ponownego utworzenia tabeli, tablepace_id zmieni się. Utworzenie kopii takiego pliku .ibd może zostać ponownie włączone do bazy danych w celu użycia, jeśli wykonasz również kopię ibdata1. Zagraża to tablepace_id wszystkich innych tabel InnoDB. W związku z tym zaleca się wykonywanie kopii zapasowych mysqldump, ponieważ mysqldump to logiczne kopie danych. Innymi słowy, kopia zapasowa jest niezależna od momentu ibdata1 i można ją ponownie załadować bez problemów z działaniem.
Zgadzam się z @RolandoMySQLDBA, na coś, o czym on nie wspomina: kopie zapasowe.
Jeśli masz już wszystkie zasady tworzenia kopii zapasowych MySQL, ORAZ nie dołączasz pliku .ibd do strategii tworzenia kopii zapasowych systemu plików, nie jest to takie ważne. Należy jednak wziąć pod uwagę, że dodanie JEDNEGO BYTESA do dowolnej tabeli innodb spowoduje przyrostowe tworzenie kopii zapasowej tabeli .ibd w inny sposób i można zauważyć, że szybko zabraknie miejsca na kopie zapasowe.
źródło
Mam aplikację, w której mam dokładnie taką sytuację: niektóre duże stoły i niektóre mniejsze.
Postanowiłem zostawić małe na
ibdata1
chwilę, umieszczając większe we własnych plikach.Robię to przez
innodb_file_per_table
włączenie domyślnie i wyłączam go tylko tymczasowo, aby przenieść stolikibdata1
zALTER TABLE
.źródło
ALTER TABLE
nich. Tak więc moją strategią jestinnodb_file_per_table
regularne włączanie i swobodne wyłączanie go, aby przenieść mały stolik,ibdata1
a następnie włączyć go ponownie.