it-swarm-eu.dev

Doporučuje se innodb_file_per_table?

Máme aplikaci, kde jen jedna z tabulek poroste na milion řádků, ale zbytek bude těsně pod milionem. Jaká je tedy rada, kterou bychom měli jít s innodb_file_per_table nebo nechat jen jako jeden .ibd? Četl jsem několik článků, které říkají, že s tím nepůjdete, protože potřebujete více přístupu na disk, když se mají provést připojení? Budeme se spojovat mezi touto tabulkou a ostatními pro účely generování hlášení.

19
newbie14

Musíte jít s innodb_file_per_table a musíte udělat nějaký způsob čištění pomocí současné infrastruktury InnoDB.

Viděl jsem mnoho klientů hostujících DB hostujících MySQL a nechal InnoDB ve výchozím stavu. To způsobí, že systém tablespace (lépe známý jako ibdata1) roste divoce.

I když jste přepnuli na innodb_file_per_table, soubor .ibd by musel být extrahován z ibdata1 a ibdata se nikdy nezmenší. Například, pokud máte tabulku s názvem mydb.mytable, která je uvnitř ibdata1 zabírajícího 2 GB, extrahujte ji následujícím způsobem:

KROK 01) Přidejte toto do /etc/my.cnf

[mysqld]
innodb_file_per_table

KROK 02) service mysql restart

KROK 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;

Tím bude soubor /var/lib/mysql/mydb/mytable.ibd

Bohužel 2 GB prostoru, který byl před změnou obsazen tabulkou, nelze znovu získat. Napsal jsem minulé příspěvky o tom, jak a proč vyčistit infrastrukturu InnoDB:

Jakmile provedete tuto zásadní změnu, nezapomeňte zvýšit innodb_open_files (výchozí 300) . Jinak je přístup na disk velmi omezený.

Pokud jde o připojení, ujistěte se, že máte správné indexy, které podporují kritéria připojení.

UPDATE 2012-04-02 11:30 EDT

Použití innodb_file_per_table v nové instalaci způsobí, že ibdata1 roste velmi pomalu, protože veškerá DDL je prováděna externě pro ibdata. Jak jsem již zmínil, můžete zmenšit jakoukoli tabulku InnoDB takto:

ALTER TABLE mydb.mytable ENGINE=InnoDB;

UPDATE 2012-04-02 16:50 EDT

Pokud jde o zálohy, buďte velmi opatrní při vytváření kopií souborů .ibd. Proč?

Uvnitř každého souboru .ibd je zvláštní hodnota známá jako tablespace_id. V ibdata1 je seznam hodnot tablespace_id. Pokud někdy provádíte údržbu tabulky, která vyžaduje zrušení a opětovné vytvoření tabulky, stane se tabulka tablespace_id odlišná. Vytvoření kopie takového souboru .ibd může být integrováno zpět do databáze pro použití, pouze pokud vytvoříte kopii ibdata1. To ohrožuje tablespace_id všech ostatních tabulek InnoDB. S ohledem na to je výhodné provádět zálohy mysqldump, protože mysqldumps jsou logické kopie dat. Jinými slovy, záloha je nezávislá na aktuálním čase ibdata1 a máte možnost znovu načíst bez problémů s funkčností.

24
RolandoMySQLDBA

Souhlaste s @RolandoMySQLDBA, za něco, co nezmíní: zálohy.

Pokud máte zálohovaný režim MySQL, a do strategie zálohování systému souborů nezahrnujete jeho soubor .ibd, pak to není tak důležité. Uvědomte si však, že přidání JEDEN BYTŮ do jakékoli tabulky innodb způsobí přírůstkové zálohování vaší tabulky .ibd jinak, a můžete vidět, že vám rychle dojde nedostatek záložního úložiště.

7
Jan Steinman

Mám aplikaci, kde mám přesně tuto situaci: některé velké tabulky a některé menší.

Rozhodl jsem se nechat ty malé v ibdata1, Zatímco ty větší jsem vložil do jejich vlastních souborů.

Dělám to tak, že jsem ve výchozím nastavení zapnul innodb_file_per_table A dočasně jej vypnul pouze pro přesun tabulky na ibdata1 S ALTER TABLE.

4
glglgl