Ist es sicher, innodb_flush_log_at_trx_commit = 2 zu verwenden?

54

Ich drehte mich um innodb_flush_log_at_trx_commit = 2und erreichte eine sehr schnelle Schreibgeschwindigkeit. Aber ist es sicher, in der Produktionswebsite verwendet zu werden?

Bruce Dou
quelle

Antworten:

57

Sie können Transaktionen im Wert von bis zu einer Sekunde verlieren. Der Standardwert ist 1, wodurch InnoDB ACID-kompatibel bleibt .

Gemäß der MySQL-Dokumentation zu innodb_flush_log_at_trx_commit

Wenn der Wert von innodb_flush_log_at_trx_commit 0 ist, wird der Protokollpuffer einmal pro Sekunde in die Protokolldatei geschrieben, und die Operation zum Leeren auf die Festplatte wird für die Protokolldatei ausgeführt. Bei einem Transaktions-Commit wird jedoch nichts ausgeführt. Wenn der Wert 1 ist (Standardeinstellung), wird der Protokollpuffer bei jedem Transaktions-Commit in die Protokolldatei geschrieben und die Operation zum Löschen auf die Festplatte wird für die Protokolldatei ausgeführt. Wenn der Wert 2 ist, wird der Protokollpuffer bei jedem Festschreiben in die Datei geschrieben, der Vorgang zum Löschen auf die Festplatte wird jedoch nicht ausgeführt. Das Leeren der Protokolldatei erfolgt jedoch einmal pro Sekunde, auch wenn der Wert 2 ist. Beachten Sie, dass das Leeren pro Sekunde aufgrund von Prozessplanungsproblemen nicht zu 100% pro Sekunde erfolgt.

Der Standardwert 1 ist für die vollständige Einhaltung der ACID-Richtlinien erforderlich. Sie können eine bessere Leistung erzielen, indem Sie einen anderen Wert als 1 festlegen. Bei einem Absturz können Sie jedoch Transaktionen im Wert von bis zu einer Sekunde verlieren. Mit einem Wert von 0 kann jeder Absturz von mysqld-Prozessen die letzte Sekunde von Transaktionen löschen. Mit einem Wert von 2 kann nur ein Betriebssystemabsturz oder ein Stromausfall die letzte Sekunde von Transaktionen löschen. Die Wiederherstellung nach einem Absturz von InnoDB funktioniert unabhängig vom Wert.

Verwenden Sie für eine bestmögliche Beständigkeit und Konsistenz in einem Replikationssetup mit InnoDB und Transaktionen die Optionen innodb_flush_log_at_trx_commit = 1 und sync_binlog = 1 in Ihrer Masterserver-Datei my.cnf.

Vorsicht

Viele Betriebssysteme und einige Festplatten-Hardware machen den Flush-to-Disk-Betrieb unmöglich. Sie können mysqld mitteilen, dass der Flush stattgefunden hat, obwohl dies nicht der Fall ist. Die Dauerhaftigkeit von Transaktionen ist dann auch 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, den Unix-Befehl hdparm zu verwenden, um das Zwischenspeichern von Festplattenschreibvorgängen in Hardware-Caches zu deaktivieren, oder einen anderen für den Hardwarehersteller spezifischen Befehl verwenden.

Auf dieser Grundlage besteht für InnoDB bei anderen Werten als 1 das Risiko, dass Transaktionen im Wert von 1 Sekunde oder Daten im Wert von Transaktions-Commits verloren gehen.

In der Dokumentation steht auch use sync_binlog=1.

Laut der MySQL-Dokumentation auf sync_binlog

Der Wert 1 ist die sicherste Wahl, da Sie im Falle eines Absturzes höchstens eine Anweisung oder Transaktion aus dem Binärprotokoll verlieren. Dies ist jedoch auch die langsamste Option (es sei denn, die Festplatte verfügt über einen batteriegepufferten Cache, wodurch die Synchronisierung sehr schnell erfolgt).

Ihre sicherste Wahl ist

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

Wenn Ihnen ein möglicher Datenverlust (bis zu 1 Sekunde) nichts ausmacht, können Sie entweder 0 oder 2 auf eigenes Risiko verwenden, wenn sich die Belohnungen (höhere Schreibgeschwindigkeit) lohnen.

RolandoMySQLDBA
quelle
3
Rolando: +1 für die letzten paar Zeilen sync_binlog = 1 ...
Abdul Manaf
@AbdulManaf, Streben Sie immer nach Datenintegrität als nach Geschwindigkeit. Wenn Sie Geschwindigkeit für Datenintegrität opfern möchten, verlieren Sie viel mehr Zeit bei Datenproblemen.
Pacerier
1
@RolandoMySQLDBA, Meinen Sie mit "eine Sekunde Transaktionswert verlieren", dass ein erfolgreicher commit tatsächlich verloren gehen könnte?
Pacerier
1
Pacerier, ja. Es wird nur garantiert, dass die Daten auf die Festplatte geschrieben werden, nachdem sie "auf die Festplatte gespült" wurden. Bis dahin befindet es sich möglicherweise nur im RAM-Speicher.
Emil Vikström
2
@RolandoMySQLDBA Sie sind der Mann, ernst. Wenn Sie etwas anderes als Vollzeit-MySQL-Beratungsauftritte machen, sollten Sie möglicherweise Ihren Karriereweg ändern.
So
25

Der innodb_flush_log_at_trx_commitwird mit dem Zweck verwendet, als ..

Wenn der Wert innodb_flush_log_at_trx_commit 0 ist, wird der Protokollpuffer einmal pro Sekunde in die Protokolldatei geschrieben, und die Operation zum Leeren auf die Festplatte wird für die Protokolldatei ausgeführt. Bei einem Transaktions-Commit wird jedoch nichts unternommen.

Wenn der Wert 1 ist (Standardeinstellung), wird der Protokollpuffer bei jedem Transaktions-Commit in die Protokolldatei geschrieben und die Operation zum Löschen auf die Festplatte wird für die Protokolldatei ausgeführt.

Wenn der Wert 2 ist, wird der Protokollpuffer bei jedem Festschreiben in die Datei geschrieben, der Vorgang zum Löschen auf die Festplatte wird jedoch nicht ausgeführt. Das Leeren der Protokolldatei erfolgt jedoch einmal pro Sekunde, auch wenn der Wert 2 ist. Beachten Sie, dass das Leeren pro Sekunde aufgrund von Prozessplanungsproblemen nicht zu 100% pro Sekunde erfolgt.

Der Standardwert 1 ist für die vollständige Einhaltung der ACID-Richtlinien erforderlich. Sie können eine bessere Leistung erzielen, indem Sie einen anderen Wert als 1 festlegen. Bei einem Absturz können Sie jedoch Transaktionen im Wert von bis zu einer Sekunde verlieren. Mit einem Wert von 0 kann jeder Absturz von mysqld-Prozessen die letzte Sekunde von Transaktionen löschen. Mit einem Wert von 2 kann nur ein Betriebssystemabsturz oder ein Stromausfall die letzte Sekunde von Transaktionen löschen. Die Wiederherstellung nach einem Absturz von InnoDB funktioniert unabhängig vom Wert.

Meiner Meinung innodb_flush_log_at_trx_commitnach sollte die Verwendung von bis 2 kein Problem sein. Die Verwendung von 1 ist jedoch am sichersten.

Abdul Manaf
quelle
3
Ich habe gerade bemerkt, dass Sie nur 18 Sekunden nach mir mit im Wesentlichen der gleichen Antwort geantwortet haben. +1 !!!
RolandoMySQLDBA
24

Meine Meinung unterscheidet sich von anderen. innodb_flush_log_at_trx_commit = 0 if: Es handelt sich um meinen Entwicklungscomputer oder meine Mini-Datenbank, in der keine vertraulichen Daten gespeichert sind.

innodb_flush_log_at_trx_commit = 2 wenn: es ist blog / stats / e-commerce (mit ~ 100x shop in day), etc.

innodb_flush_log_at_trx_commit = 1 wenn: Sie viele Kunden haben oder mit Geldtransaktionen wie Bank arbeiten müssen. Dieses Mal sollten Sie Ihren Datenfluss auf mehrere Server aufteilen, um Geschwindigkeit und Sicherheit zu gewährleisten.

Ich bevorzuge 2, weil es ~ 75x schnellere Schreibgeschwindigkeit hat und es NUR ausfällt, wenn Hardware ausfällt.

Wie auch immer, Sie sollten wissen, was Sie brauchen, viel mehr Schreibgeschwindigkeit oder bis zu 1 Sekunde Information?

Sertekmedia
quelle
1
+1 für75x faster write speed and it fails ONLY if hardware fails.
Naman Gala
3
75x schneller? Zitat benötigt.
Pacerier
5
Mein eigener Benchmark: 5000 UPDATEmit innodb_flush_log_at_trx_commit = 1: 179 Sekunden. Mit innodb_flush_log_at_trx_commit = 2: 1,12 Sekunden. In meinem Fall ist es eine 160-mal schnellere Schreibgeschwindigkeit.
Kevin
Gute Antwort. Beachten Sie Folgendes: Wenn Ihr Computer nach einer erfolgreichen Transaktion abstürzt, wurde die Transaktion möglicherweise nicht mit innodb_flush_log_at_trx_commit = 2 auf die Festplatte geschrieben, und der Anwendung wurde der Erfolg angezeigt (dh mysqld kann ein Netzwerkpaket senden, das angibt, dass die Transaktion erfolgreich abgeschlossen wurde für den Fahrer in Ihrer App) ist diese Chance sehr, sehr gering
Vladislav Vaintroub
Können Sie Ihre Antwort verbessern, indem Sie angeben, was Dokumente mitcrash
shareef 20.03.18
2

Ich versuche zu antworten, wozu innodb_flush_log_at_trx_commit?

InnoDB führt die meisten seiner Operationen im Speicher aus ( InnoDB Buffer Pool). Alle geänderten Daten werden InnoDB transaction log filein einen dauerhaften Speicher (Festplatte) geschrieben und anschließend gelöscht (geschrieben).

Zur Datensicherheit ( Durability from ACID) muss InnoDB geänderte Daten jeder Transaktion in einem permanenten Speicher ablegen. Gleichzeitig ist das Festschreiben auf der Festplatte für jede Transaktion ein kostspieliger Vorgang.

Disk I / O ist ein blockierender Prozess und es ist sehr langsam, es ist eine langsame Festplatte, außerdem wird die Anzahl der Datenträger reduziert InnoDB transaction per seconds(Datenträgerdurchsatz).

InnoDB bietet eine innodb_flush_log_at_trx_commitVariable zur Steuerung der Häufigkeit dieses Spülvorgangs. Basierend auf dem Wert verhält sich der InnoDB-Spülvorgang anders.

(Bereits in anderen Antworten erklärt)

0 - In Protokolldatei schreiben und jede Sekunde auf die Festplatte leeren (Daten im Pufferpool werden nicht in die Protokolldatei geschrieben - zur Leistungssteigerung). 1 - Flush to Disk, wenn eine Transaktion festgeschrieben wird - Standard (Zur Datensicherheit - ACID-Konformität) 2 - Schreiben Sie für jede Transaktion in die Protokolldatei und flushen Sie jede Sekunde auf die Festplatte. (Zur Leistungssteigerung)

Abhängig von den Anwendungsanforderungen ( Performance Vs data safety) können Sie diese Variable festlegen. Der Unterschied zwischen 0 und 2 - beide erhöhen die Leistung, Wert 2 speichert die Daten in der Transaktionsdatei und kann im Falle eines Absturzes oder Fehlers wiederhergestellt werden, jedoch nicht in 0.

In vielen Fällen bedeutet Flush to Disk, dass die Daten von InnoDB buffer pool (memory) to Operating systems cachenicht tatsächlich auf die Speicherplatte geschrieben werden (permanenter Speicher). Im schlimmsten Fall können Datenverluste bis zu einer Sekunde auftreten.

Der Leistungsgewinn hängt von der Umgebung ab und Sie können Benchmarks erstellen und identifizieren. Legen Sie in einer Replikationsumgebung aus Gründen der Datensicherheit und -konsistenz innodb_flush_log_trx_commit = 1und fest sync_binlog=1.

Wenn die Leistung das Hauptziel der Anwendung ist, bietet InnoDB eine Variable zur Steuerung der Häufigkeit des Löschens von Protokollen - innodb_flush_log_at_timeout- mit der Sie den Frequenzbereich für das Löschen von Protokollen festlegen können. 1 to 2700 secondsStandardmäßig ist dies 1.

Wenn Sie das Spülintervall auf bis zu N Sekunden erhöhen, bedeutet dies einen Leistungsgewinn, der die Datensicherheit auf bis zu N Sekunden einschränkt. Wenn Sie beispielsweise festlegen, dass alle 5 Sekunden eine Spülung durchgeführt werden soll, ist die Durchsatzsteigerung sehr hoch. Im Falle eines Stromausfalls oder eines Systemabsturzes gehen jedoch Daten im Wert von 5 Sekunden verloren.

Dieser Artikel beschreibt die InnoDB-Leerung und Transaktions-Commit- Vorgänge.

Sie können nach dem Ausführen von Modus 2 auf aws rds Folgendes ändern:

kann sich nach dem Ausführen von Modus 2 auf aws ändern

Vorschauänderungen

Nicht änderbar in einigen Fällen wie wenn Sie Replikation Multi Az haben:

In einigen Fällen nicht veränderbar

rathishDBA
quelle
1

Wenn Ihre Hardware ausfällt, können Sie alle Ihre Daten verlieren, so dass ich ohne Sorgen param = 2 verwende. Auf jeden Fall können Sie sensible (Bestellung, virtuelles Geld, ...) und reguläre (Statistiken, Warenkorb, ...) Daten zwischen 2 Datenbankservern aufteilen und diese sicher und schnell aufbewahren. Für Transaktionen zwischen Datenbanken können Sie http://dev.mysql.com/doc/refman/5.7/en/xa.html verwenden

Karolis Mačiulskis
quelle
"Alle Ihre Daten verlieren", oder meinen Sie die Transaktionen, die in den letzten Sekunden abgefragt wurden?
NiCk Newman
1
Ein Hardwarefehler kann bedeuten, dass eine gesamte Festplatte verloren geht, sodass "alle Ihre Daten verloren gehen". Wenn Sie also kein Replikationssetup haben, sind Ihre Daten davon abhängig, wie oft Sie ohnehin Backups durchführen. Die Antwort darauf lautet also, dass ein oder zwei Sekunden Datenverlust im Vergleich nichts zu befürchten sind
ThomasRutter,