it-swarm-eu.dev

Jak bezpečně změnit MySQL innodb proměnnou 'innodb_log_file_size'?

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á?

108
Derek Downey

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 !!!

UPDATE 2011-10-20 16:40 EDT

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

AKTUALIZACE 2013-04-19 16:16 EDT

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ší.

86
RolandoMySQLDBA

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:

  1. Zastavte server MySQL a ujistěte se, že se vypne bez chyb.

  2. 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.

  3. 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.

31
RandomSeed

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:

  1. set innodb_fast_shutdown = OFF
  2. restartujte mysql
  3. zastavte mysql
  4. odeberte logfiles
  5. začít mysql

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)

  • 5.6 Umožňuje innodb_log_file_size> 4 GB
  • 5,6 innodb_log_file_size lze změnit bez předchozího odstranění iblogu *
  • 5.7 umožňuje dynamickou změnu velikosti 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.

22
Rick James

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

2
Linux Newbie