it-swarm.com.de

Dynamische Änderung an innodb_flush_log_at_trx_commit

Dies hängt mit dieser Frage zusammen. Dies trägt zu einer besseren Leistung von InnoDB-Tabellen bei.

Laut MySQL-Handbuch , innodb_flush_log_at_trx_commit ist 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, aber ich muss es 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 keinen Zugriff auf my.cnf auf meinem gemeinsam genutzten Hosting-Server.

11
Sithu

Ich stimme zwar Rolandos Empfehlung zu, innodb_flush_method, Mir war nicht 100% klar, was du damit gemeint hast:

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

Ich möchte darauf hinweisen die Einschränkung , dass das Ändern der GLOBAL-Variablen alle neuen Verbindungen beeinflusst, aber die aktuelle Sitzung 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)
12
Derek Downey

Wenn Sie innodb_flush_log_at_trx_commit festlegen, besteht die Gefahr einer Verwechslung mit der Interoperabilität von mysqld/OS. 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 Festplattencaches 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 für den Hardwarehersteller spezifischen Befehl zu verwenden.

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 Spülmethode stark unterscheidet (siehe mein Mar 04, 2011 post 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 show variables like 'innodb_flush_method'; Ich bekomme

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 für Erläuterung zur Variablen mySQL innodb_flush_method

7
RolandoMySQLDBA