it-swarm-eu.dev

Dynamická změna na innodb_flush_log_at_trx_commit

Souvisí to s tato otázka . Pomáhá získat lepší výkon pro tabulky InnoDB.

Podle MySQL manuál , innodb_flush_log_at_trx_commit je globální dynamická proměnná. Mohu to tedy změnit pomocí příkazu SET GLOBAL a zdá se, že to funguje.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

Ale to nezměnilo skutečné nastavení MySQL. Když jsem aktualizoval my.cnf a restartoval server MySQL, fungovalo to. Takže nemohu změnit globální proměnnou za běhu?

Dávám přednost výchozí hodnotě innodb_flush_log_at_trx_commit=1, ale musím to změnit na 2, než spustím proces obnovy velké databáze, abych se zrychlil. Když ale proces skončí, chci změnit hodnotu zpět na 1. Je to možné provést za běhu?

Nemám přístup k my.cnf na mém sdíleném hostitelském serveru.

11
Sithu

I když souhlasím s doporučením Rolanda změnit innodb_flush_method, Nebyl jsem stoprocentně jasný, co jste myslel:

to nezměnilo skutečné nastavení MySQL

Chci zdůraznit pozornění , že změna proměnné GLOBAL ovlivní všechna nová připojení, ale nezmění aktuální relaci (důrazný důl):

Globální změna proměnné neovlivní proměnnou relace u žádného klienta, který je aktuálně připojen (, ani u klienta, který vydává příkaz SET GLOBAL ).

Zkontrolujte tedy, zda:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)
12
Derek Downey

Nastavením innodb_flush_log_at_trx_commit riskujete záměnu s interoperabilitou mysqld/OS. Říkám to proto, že OS je důvěryhodný k provedení flush.

Pozor na upozornění z Dokumentace MySQL

Mnoho operačních systémů a nějaký diskový hardware oklamávají operaci splachování na disk. Mohou říct mysqld, že k flush došlo, i když tomu tak není. Trvanlivost transakcí pak není zaručena ani při nastavení 1 a v nejhorším případě může výpadek napájení dokonce poškodit databázi InnoDB. Použití mezipaměti disku zálohované na baterii v diskovém řadiči SCSI nebo na samotném disku urychluje vyprazdňování souborů a zvyšuje bezpečnost práce. Můžete také zkusit použít příkaz Unix hdparm k zakázání ukládání do mezipaměti zápisů disků v mezipaměti hardwaru nebo použít jiný příkaz specifický pro dodavatele hardwaru.

Říká se to takto: OS může ležet jako podvádějící manžel. OS říká, že se vyprázdní na disk a jednoduše to neudělá. Proto, i když nastavíte innodb_flush_log_at_trx_commit, musíte rozvést OS vyprázdnění na disk od splachování mysqldu na disk.

Pokud jste tak již neučinili, zkuste nastavit innodb_flush_method na O_DIRECT. Můžete vidět rozdíl, protože metoda vyprazdňování se výrazně liší (viz můj Mar 04, 2011 post Objasnění proměnné mySQL innodb_flush_method ).

CAVEAT

Jak jste uvedli, nemáte přístup k my.cnf. Kontaktujte prosím SysAdmin u svého poskytovatele a změňte innodb_flush_method .

AKTUALIZACE 2012-12-10 12:45 EDT

Momentálně na svém počítači běží MySQL 5.5.12. Když se připojím a spustím show variables like 'innodb_flush_method'; Dostanu

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

Protože je prázdný, znamená to, že je použito výchozí nastavení. Přečtěte si prosím můj příspěvek ze 4. března 2011 pro vysvětlení proměnné MySQL innodb_flush_method

7
RolandoMySQLDBA