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.