Antworten:
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.
commit
tatsächlich verloren gehen könnte?
Der innodb_flush_log_at_trx_commit
wird 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_commit
nach sollte die Verwendung von bis 2 kein Problem sein. Die Verwendung von 1 ist jedoch am sichersten.
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?
75x faster write speed and it fails ONLY if hardware fails.
UPDATE
mit 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.
crash
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 file
in 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_commit
Variable 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 cache
nicht 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 = 1
und 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 seconds
Standardmäß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:
Nicht änderbar in einigen Fällen wie wenn Sie Replikation Multi Az haben:
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