Czy wskazana jest opcja innodb_file_per_table?

19

Mamy aplikację, w której tylko jedna tabela będzie rosła w milion linii, a reszta będzie nieco mniejsza niż milion. Więc jaka rada powinna pójść z innodb_file_per_table lub pozostawić jako jeden .ibd? Czytałem niektóre artykuły, które mówią, że nie idź z tym, ponieważ potrzebujesz więcej dostępu do dysku, gdy połączenia są wykonywane? Będziemy łączyć tę tabelę z innymi w celu generowania raportów.

nowicjusz14
źródło

Odpowiedzi:

24

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.

RolandoMySQLDBA
źródło
to będzie nowy serwer. więc co powinienem wtedy zrobić? Dlaczego mówisz, że dobrze jest iść z innodb_file_per_table? Z czasem tabela ta będzie się powiększać, na co należy zwrócić uwagę w przypadku jakichkolwiek błędów limitów?
newbie14
7

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.

Jan Steinman
źródło
drodzy wszyscy tak, planuję również wykonać kopię zapasową. jeśli potrzebuję master do master backup, jaka to różnica od zwykłego master do slave? Czy to jedno i drugie będzie się wzajemnie tworzyło, prawda? Co należy zmienić w ustawieniach?
newbie14
4

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 ibdata1chwilę, umieszczając większe we własnych plikach.

Robię to przez innodb_file_per_tablewłączenie domyślnie i wyłączam go tylko tymczasowo, aby przenieść stolik ibdata1z ALTER TABLE.

glglgl
źródło
@ gigigi, jak zostawić małe w ibdata1, a duże we własnych plikach, czy nie jest tak, że jeśli ustawisz ten plik innodb_file_per_table, to znaczy, że wszystko będzie w swoich plikach?
newbie14
Tylko po ALTER TABLEnich. Tak więc moją strategią jest innodb_file_per_tableregularne włączanie i swobodne wyłączanie go, aby przenieść mały stolik, ibdata1a następnie włączyć go ponownie.
glglgl
czy dobrze jest pozostać zawsze, ponieważ innodb_file_per_table nie stanowi problemu, prawda?
newbie14
powinno być ok, IMHO ...
glglgl