Cambio dinamico in innodb_flush_log_at_trx_commit


11

Questo è legato a questa domanda . Aiuta a ottenere prestazioni migliori per le tabelle InnoDB.

Secondo il manuale di MySQL , innodb_flush_log_at_trx_commitè una variabile dinamica globale. Quindi, posso cambiarlo usando il comando SET GLOBAL e sembra funzionare.

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

Tuttavia, non ha modificato le impostazioni effettive di MySQL. Quando ho aggiornato my.cnf e riavviato il server MySQL, ha funzionato. Quindi, non posso cambiare la variabile globale in fase di esecuzione?

Preferisco il valore predefinito innodb_flush_log_at_trx_commit=1, ma devo cambiarlo in 2 prima di eseguire un processo di ripristino per un database di grandi dimensioni per ottenere più velocemente. Ma una volta terminato il processo, desidero riportare il valore su 1. È possibile farlo in fase di esecuzione?

Non ho accesso a my.cnf sul mio server di hosting condiviso.

Risposte:


12

Mentre sono d'accordo con la raccomandazione di Rolando di cambiare innodb_flush_method, non ero al 100% chiaro cosa intendevi per:

non ha modificato le impostazioni effettive di MySQL

Voglio sottolineare l'avvertenza che apportare una modifica alla variabile GLOBAL influisce su eventuali nuove connessioni, ma non modifica la sessione corrente (sottolineatura mia):

La modifica della variabile globale non influisce sulla variabile di sessione per qualsiasi client attualmente connesso ( nemmeno quello del client che emette l'istruzione SET GLOBAL ).

Quindi per verificare che:

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)

2
Questa risposta ha senso. La documentazione ( dev.mysql.com/doc/refman/5.5/en/… ) non dice che la variabile a livello di sessione può essere cambiata, solo a livello globale. Ho sperimentato molte volte che cambiare max_connections con SET GLOBAL max_connections = 1000;e quando corro SHOW VARIABLES LIKE 'max_connections';per vedere il vecchio valore significherebbe impazzire fino a quando non mi disconnetto e riconnetto . +1 per questo punto di vista dato per scontato e spesso dimenticato.
RolandoMySQLDBA

@Rolando anche a me! inoltre, sono stato contento quando ho scoperto che potevo "connettermi"; invece di disconnettersi e riconnettersi. Risparmia tempo!
Derek Downey,

Questo concetto di corsa connectè in realtà nuovo per me in MySQL. L'ho fatto un milione di volte in PostgreSQL e Oracle. Una volta non avevo mai pensato a MySQL che lo permettesse
RolandoMySQLDBA il

@DTest, grazie per la risposta. Secondo il mio test approfondito, ha funzionato in modo dinamico. Nel mio localhost, la variabile di sessione è stata modificata senza eseguire connect (ho riscontrato un errore durante il problema connect). Con il valore 2, l'importazione di 2.241.319 record ha richiesto 27 minuti e 43 secondi, mentre sono stati necessari circa 1 giorni con il valore 1. L'impostazione sembra funzionare nella sessione corrente ma ha ripristinato l'impostazione originale (da my.cnf) dopo il riavvio.
Sithu,

@DerekDowney, è solo per certe impostazioni come innodb_flush_log_at_trx_commit? O è che per tutte le impostazioni, l'impostazione globalnon influirebbe sulla sessione corrente?
Pacerier,

7

Impostando innodb_flush_log_at_trx_commit , si rischia la confusione con l'interoperabilità di mysqld / OS. Dico questo perché il sistema operativo è affidabile per eseguire il flush.

Nota la cautela dalla documentazione di MySQL

Molti sistemi operativi e alcuni componenti hardware del disco ingannano l'operazione flush-to-disk. Potrebbero dire a mysqld che il flush ha avuto luogo, anche se non lo è stato. Quindi la durata delle transazioni non è garantita nemmeno con l'impostazione 1 e, nel peggiore dei casi, un'interruzione dell'alimentazione può persino danneggiare il database InnoDB. L'uso di una cache del disco con batteria tampone nel controller del disco SCSI o nel disco stesso accelera lo scaricamento dei file e rende l'operazione più sicura. Puoi anche provare a utilizzare il comando Unix hdparm per disabilitare la memorizzazione nella cache delle scritture su disco nelle cache dell'hardware o utilizzare altri comandi specifici per il fornitore dell'hardware.

Ciò che dice è il seguente: Il sistema operativo può mentire come un marito traditore. Il sistema operativo dice che si scaricherà sul disco e semplicemente non lo farà. Pertanto, anche se si imposta innodb_flush_log_at_trx_commit, è necessario divorziare il flushing del sistema operativo su disco dal flushing di mysqld su disco.

Prova a impostare innodb_flush_method su O_DIRECT se non l'hai già fatto. Potresti vedere una differenza perché il metodo flush è molto diverso (Vedi il mio Mar 04, 2011post Chiarimenti sulla variabile MySQL innodb_flush_method ).

AVVERTIMENTO

Come hai detto, non hai accesso a my.cnf. Si prega di contattare SysAdmin presso il proprio provider e ottenere innodb_flush_method modificato.

AGGIORNAMENTO 2012-12-10 12:45 EDT

Attualmente sto eseguendo MySQL 5.5.12 sul mio PC. Quando mi connetto e corro, show variables like 'innodb_flush_method';ottengo

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

mysql>

Poiché è vuoto, indica solo che viene utilizzata l'impostazione predefinita. Si prega di leggere il mio post del 4 marzo 2011 per chiarimenti sulla variabile MySQL innodb_flush_method


Ho provato prima nel mio localhost. Non riuscivo a trovare innodb_flush_methodin my.ini(non my.cnf). Informazioni sul server - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu

Ho notato che indipendentemente dalla versione del server o ini / cnf, il file di configurazione non ha innodb_flush_methodimpostazioni e SHOW VARIABLESnon lo mostra.
Sithu,

Grazie per il tuo AGGIORNAMENTO, l'ho preso anch'io, mi chiedevo solo perché non possiamo vederne il valore. Dato che non sono riuscito a trovarlo in my.inio my.cnfe non è una variabile dinamica, non sono sicuro di come configurarlo.
Sithu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.