Takže jsem docela nový v ladění InnoDB. Pomalu měním tabulky (podle potřeby) z MyIsamu na InnoDB. V innodbu mám asi 100 MB, takže jsem zvýšil innodb_buffer_pool_size
proměnná na 128 MB:
mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
Když jsem šel změnit innodb_log_file_size
value (příklad my.cnf na konfigurační stránka innodb mysql komentářů ke změně velikosti souboru protokolu na 25% velikosti bufferu. Moje my.cnf tedy nyní vypadá takto:
# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
Po restartování serveru se zobrazí tato chyba:
110216 9:48:41 InnoDB: Inicializace fondu vyrovnávacích pamětí, velikost = 128,0M
110216 9:48:41 InnoDB: Dokončená inicializace fondu vyrovnávacích pamětí
InnoDB: Chyba: soubor protokolu ./ib_logfile0 má jinou velikost 0 5242880 bajtů
InnoDB: než je uvedeno v souboru .cnf 0 33554432 bajtů!
110216 9:48:41 [CHYBA] Funkce inicializace 'InnoDB' pluginu vrátila chybu.
110216 9:48:41 [CHYBA] Registrace 'InnoDB' pluginu jako SKLADOVÉHO MOTORU selhala.
Moje otázka: Je tedy bezpečné odstranit staré log_files, nebo existuje jiná metoda pro změnu innodb_log_file_size
proměnná?
Ano, je bezpečné odstranit soubor protokolu, jakmile je mysqld vypnut
Na základě toho proveďte následující kroky:
mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start
Spuštění programu mysqld znovu vytvoří ib_logfile0
a ib_logfile1
Pokusit se !!!
Před opakováním souborů protokolu čistě stránkuje všechna data ve fondu vyrovnávacích pamětí InnoDB, měli byste tuto možnost nastavit přibližně 1 hodinu před vypnutím:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Ve výchozím nastavení je innodb_max_dirty_pages_pct 75 (MySQL 5.5+) nebo 90 (před MySQL 5.5). Nastavení na nulu udržuje počet špinavých stránek pod 1% fondu vyrovnávacích pamětí InnoDB. Provádění service mysql stop
to přesto dělá. Kromě toho vypnutím dojde k dokončení všech zbývajících položek v protokolu opakování. Chcete-li tuto možnost zachovat, přidejte ji do souboru /etc/my.cnf:
[mysqld]
innodb_max_dirty_pages_pct = 0
Svou odpověď jsem aktualizoval o innodb_fast_shutdown , protože jsem použil restartování mysql a zastavení mysql. Nyní je tento jeden krok nezbytný, protože každá transakce bez závazku může mít jiné pohyblivé části uvnitř a vně transakčních protokolů InnoDB ( Viz infrastruktura InnoDB ) ).
Vezměte prosím na vědomí, že nastavení innodb_fast_shutdown na 2 by vyčistilo protokoly také, ale stále více pohyblivých částí existuje a bude vybíráno při selhání Zotavení během spuštění mysqldu. Nastavení 0 je nejlepší.
Místo toho bych doporučil oficiální metoda , kterou zde pro větší reprodukci reprodukuji:
Chcete-li změnit počet nebo velikost souborů protokolu InnoDB v MySQL 5.6.7 nebo starší , použijte následující pokyny. Postup, který se má použít, závisí na hodnotě innodb_fast_shutdown, která určuje, zda má být systémový tabulkový prostor plně aktuální před operací vypínání:
Pokud není hodnota innodb_fast_shutdown nastavena na 2: Zastavte server MySQL a ujistěte se, že se vypne bez chyb, abyste zajistili, že v protokolu opakování nebudou žádné informace o nevyřízených transakcích. Zkopírujte staré soubory protokolu redo na bezpečné místo pro případ, že by se během vypnutí něco pokazilo a potřebujete je k obnovení tabulkového prostoru. Odstraňte staré soubory protokolu z adresáře souborů protokolu, upravte soubor my.cnf a změňte konfiguraci souboru protokolu a znovu spusťte server MySQL. mysqld vidí, že při spuštění neexistují žádné soubory protokolu InnoDB a vytváří nové.
Pokud je innodb_fast_shutdown nastaven na 2: Nastavte innodb_fast_shutdown na 1:
mysql> SET GLOBAL innodb_fast_shutdown = 1;
Poté postupujte podle pokynů v předchozí položce.
Od MySQL 5.6.8 nastavení innodb_fast_shutdown již není při změně počtu nebo velikosti souborů protokolu InnoDB relevantní. Kromě toho již nemusíte odstraňovat staré soubory protokolu, i když je možné, že budete chtít zkopírovat staré soubory protokolu na bezpečné místo, jako zálohu. Chcete-li změnit počet nebo velikost souborů protokolu InnoDB, proveďte následující kroky:
Zastavte server MySQL a ujistěte se, že se vypne bez chyb.
Upravte my.cnf a změňte konfiguraci souboru protokolu. Chcete-li změnit velikost souboru protokolu, nakonfigurujte innodb_log_file_size. Chcete-li zvýšit počet souborů protokolu, nakonfigurujte innodb_log_files_in_group.
Znovu spusťte server MySQL.
Pokud InnoDB zjistí, že se innodb_log_file_size liší od velikosti souboru redo log, zapíše kontrolní bod protokolu, uzavře a odstraní staré soubory protokolu, vytvoří nové soubory protokolu v požadované velikosti a otevře nové soubory protokolu.
innodb_buffer_pool_size
- jednoduše změňte my.cnf
(my.ini
) a restartujte mysqld.
innodb_log_file_size
je méně kritický. Neměňte to, pokud k tomu nemáte důvod. Roland za předpokladu, že kroky , ale jeden aspekt mě znepokojuje ... Nevím, jestli jsou první dva kroky důležité; vypadá to, že by to mohlo být:
set innodb_fast_shutdown = OFF
Soubory protokolu sledují nedokončené podnikání; " innodb_fast_shutdown
"říká, že se má s těmito věcmi vypořádat po restartování . Takže odstranění souborů může ztratit informace?
Nové verze vylepšily věci: (další diskuse v komentářích)
innodb_log_file_size
> 4 GBinnodb_log_file_size
lze změnit bez předchozího odstranění iblogu *innodb_buffer_pool_size
Měl bych změnit velikost log_file_size?
Použijte GLOBAL STATUS
pro výpočet počtu minut před cykly protokolu.
Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`
Pokud je mnohem méně než 60 (minut), může to pomoci zvýšit log_file_size. Pokud je to mnohem více, pak soubory protokolu ztrácí místo na disku. Tato „hodina“ je spíše libovolná, takže pokud jste blízko, neobtěžujte se měnit velikost log_file_size.
Odejít innodb_log_files_in_group
ve výchozím nastavení 2.
Při přihlášení k mysql zadejte tyto příkazy:
pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G
Získáte dvě čísla. Nejprve dostanete jednu a pak počkejte minutu. Získáte další.
Řekněme, že první z nich je 3,456,718,123 a druhý z nich je 4,098,873,134
Nyní (4,098,873,133,856,718,123) * 60/1024/1024
Výsledek je = 13,856 MB
Máte dva soubory protokolu. Takže ji rozdělte na dvě a získáte číslo poblíž 7 000 MB. Pro jistotu nastavte velikost souboru protokolu 8 GB