Dynamische Änderung an innodb_flush_log_at_trx_commit

11

Dies hängt mit dieser Frage zusammen . Es hilft, eine bessere Leistung für InnoDB-Tabellen zu erzielen.

Laut MySQL - Handbuch , innodb_flush_log_at_trx_commitist eine globale dynamische Variable. Daher kann ich es mit dem Befehl SET GLOBAL ändern und es scheint zu funktionieren.

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

Die tatsächliche MySQL-Einstellung wurde jedoch nicht geändert. Als ich my.cnf aktualisiert und den MySQL-Server neu gestartet habe, hat es funktioniert. Ich kann die globale Variable also zur Laufzeit nicht ändern.

Ich bevorzuge den Standardwert innodb_flush_log_at_trx_commit=1, muss ihn jedoch auf 2 ändern, bevor ich einen Wiederherstellungsprozess ausführe, damit eine große Datenbank schneller wird. Aber wenn der Vorgang abgeschlossen ist, möchte ich den Wert wieder auf 1 ändern. Ist dies zur Laufzeit möglich?

Ich habe auf meinem gemeinsam genutzten Hosting-Server keinen Zugriff auf my.cnf .

Sithu
quelle

Antworten:

12

Obwohl ich Rolandos Empfehlung zur Änderung zustimme innodb_flush_method, war mir nicht 100% klar, was Sie damit meinten:

Die tatsächliche MySQL-Einstellung wurde nicht geändert

Ich möchte auf die Einschränkung hinweisen, dass sich eine Änderung an der GLOBAL-Variablen auf alle neuen Verbindungen auswirkt, die aktuelle Sitzung jedoch nicht ändert (Hervorhebung meiner):

Die globale Variablenänderung wirkt sich nicht auf die Sitzungsvariable für einen Client aus, der derzeit verbunden ist ( nicht einmal auf den Client, der die Anweisung SET GLOBAL ausgibt ).

Um das zu überprüfen:

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)
Derek Downey
quelle
2
Diese Antwort macht Sinn. Die Dokumentation ( dev.mysql.com/doc/refman/5.5/en/… ) besagt nicht, dass die Variable auf Sitzungsebene geändert werden kann, sondern nur die globale Ebene. Ich habe festgestellt, dass das Ändern von max_connections mit SET GLOBAL max_connections = 1000;und wenn ich SHOW VARIABLES LIKE 'max_connections';den alten Wert sehe , oft zu verrückten Nüssen führt, bis ich mich abmelde und wieder anmelde . +1 für diesen Standpunkt, der für selbstverständlich gehalten und oft vergessen wird.
RolandoMySQLDBA
@ Rolando mich auch! Ich war auch froh, als ich herausfand, dass ich mich verbinden konnte. anstatt sich ab- und wieder anzumelden. Spart Zeit!
Derek Downey
Dieses Konzept des Laufens connectist für mich in MySQL eigentlich neu. Ich habe das millionenfach in PostgreSQL und Oracle gemacht. Ich habe nie daran gedacht, dass MySQL das
zulässt
@DTest, Danke für deine Antwort. Nach meinem tiefen Test hat es dynamisch funktioniert. In meinem localhost wurde die Sitzungsvariable geändert, ohne connect auszuführen (beim Problem ist ein Fehler aufgetreten connect). Mit dem Wert 2 dauerte das Importieren von 2.241.319 Datensätzen 27 Minuten und 43 Sekunden, während es mit dem Wert 1 ungefähr 1 Tag dauerte. Die Einstellung scheint in der aktuellen Sitzung zu funktionieren, stellte jedoch my.cnfnach dem Neustart die ursprüngliche Einstellung (von ) wieder her.
Sithu
@DerekDowney, ist das nur für bestimmte Einstellungen wie innodb_flush_log_at_trx_commit? Oder hat die Einstellung für alle Einstellungen globalkeinen Einfluss auf die aktuelle Sitzung?
Pacerier
7

Durch die Einstellung innodb_flush_log_at_trx_commit , riskieren Sie eine Verwechslung mit mysqld / O Interoperabilität. Ich sage dies, weil dem Betriebssystem vertraut wird, dass es den Flush ausführt.

Beachten Sie die Vorsicht in der MySQL-Dokumentation

Viele Betriebssysteme und einige Festplattenhardware täuschen den Flush-to-Disk-Betrieb vor. Sie können mysqld mitteilen, dass die Spülung stattgefunden hat, obwohl dies nicht der Fall ist. Dann ist die Dauerhaftigkeit von Transaktionen selbst mit der Einstellung 1 nicht garantiert, und im schlimmsten Fall kann ein Stromausfall sogar die InnoDB-Datenbank beschädigen. Die Verwendung eines batteriegepufferten Festplatten-Caches im SCSI-Festplattencontroller oder auf der Festplatte selbst beschleunigt das Löschen von Dateien und macht den Vorgang sicherer. Sie können auch versuchen, mit dem Unix-Befehl hdparm das Caching von Festplattenschreibvorgängen in Hardware-Caches zu deaktivieren, oder einen anderen Befehl verwenden, der für den Hardwarehersteller spezifisch ist.

Dies sagt Folgendes aus: Das Betriebssystem kann wie ein betrügerischer Ehemann lügen. Das Betriebssystem sagt, dass es auf die Festplatte gespült wird und tut es einfach nicht. Selbst wenn Sie innodb_flush_log_at_trx_commit festlegen, müssen Sie daher das Betriebssystem-Flushing auf die Festplatte von mysqlds Flushing auf die Festplatte trennen.

Versuchen Sie, innodb_flush_method auf O_DIRECT zu setzen, falls Sie dies noch nicht getan haben. Möglicherweise sehen Sie einen Unterschied, da sich die Flush-Methode stark unterscheidet (siehe meinen Mar 04, 2011Beitrag Erläuterung zur Variablen mySQL innodb_flush_method ).

VORBEHALT

Wie Sie bereits erwähnt haben, haben Sie keinen Zugriff auf my.cnf. Bitte kontaktieren Sie den SysAdmin bei Ihrem Provider und lassen Sie innodb_flush_method ändern.

UPDATE 2012-12-10 12:45 EDT

Ich verwende derzeit MySQL 5.5.12 auf meinem PC. Wenn ich mich verbinde und renne, show variables like 'innodb_flush_method';bekomme ich

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

mysql>

Da es leer ist, zeigt es nur an, dass die Standardeinstellung verwendet wird. Bitte lesen Sie meinen Beitrag vom 04. März 2011 zur Erläuterung der Variablen mySQL innodb_flush_method

RolandoMySQLDBA
quelle
Ich habe zuerst in meinem lokalen Host getestet. Ich konnte nicht innodb_flush_methodin my.ini(nicht my.cnf) finden. Serverinformationen - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu
Ich habe festgestellt, dass die Konfigurationsdatei unabhängig von der Serverversion oder ini / cnf keine innodb_flush_methodEinstellungen hat und SHOW VARIABLESdiese nicht anzeigt .
Sithu
Vielen Dank für Ihr UPDATE, ich habe es auch bekommen. Ich habe mich nur gefragt, warum wir seinen Wert nicht sehen können. Da ich es in my.inioder nicht finden konnte my.cnfund es keine dynamische Variable ist, bin ich mir nicht sicher, wie ich es konfigurieren kann.
Sithu