Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Empfehlungen für Meine SQL Funktionen in Aurora My SQL
Die folgenden Funktionen sind in der SQL Kompatibilität mit Aurora My SQL for My verfügbar. Sie haben jedoch Probleme mit der Leistung, Skalierbarkeit, Stabilität oder Kompatibilität in der Aurora-Umgebung. Wir empfehlen daher, dass Sie bei der Verwendung dieser Funktionen bestimmte Richtlinien einhalten. Wir empfehlen zum Beispiel, bestimmte Funktionen nicht für Aurora-Produktionseinsätze zu verwenden.
Themen
- Verwenden der Multithread-Replikation in Aurora My SQL
- Aufrufen AWS Lambda Funktionen, die native SQL My-Funktionen verwenden
- Vermeidung von XA-Transaktionen mit Amazon Aurora My SQL
- Fremdschlüssel bei DML Kontoauszügen aktiviert lassen
- Konfigurieren, wie oft der Protokollpuffer geleert wird
- Minimierung und Behebung von Aurora My-Deadlocks SQL
Verwenden der Multithread-Replikation in Aurora My SQL
Bei der binären Protokollreplikation mit mehreren SQL Threads liest ein Thread Ereignisse aus dem Relay-Log und stellt sie in eine Warteschlange, damit SQL Worker-Threads sie anwenden können. Die SQL Worker-Threads werden von einem Koordinator-Thread verwaltet. Die binären Protokollereignisse werden nach Möglichkeit parallel angewendet.
Die Multithread-Replikation wird in Aurora My SQL Version 3 und in Aurora My SQL Version 2.12.1 und höher unterstützt.
Für Aurora SQL My-Versionen unter 3.04 verwendet Aurora standardmäßig die Single-Thread-Replikation, wenn ein Aurora My SQL DB-Cluster als Read Replica für die binäre Protokollreplikation verwendet wird.
Frühere Versionen von Aurora My SQL Version 2 haben mehrere Probleme mit der Multithread-Replikation aus My SQL Community Edition übernommen. Für diese Versionen empfehlen wir, die Multithread-Replikation in der Produktion nicht zu verwenden.
Wenn Sie die Multithread-Replikation verwenden, empfehlen wir, sie gründlich zu testen.
Weitere Informationen zur Verwendung der Replikation in Amazon Aurora finden Sie unter Replikation mit Amazon Aurora. Weitere Informationen zur Multithread-Replikation in Aurora My finden Sie SQL unterReplikation von Binärprotokollen mit mehreren Threads.
Aufrufen AWS Lambda Funktionen, die native SQL My-Funktionen verwenden
Wir empfehlen, die nativen SQL My-Funktionen lambda_async
zu verwenden lambda_sync
und Lambda-Funktionen aufzurufen.
Wenn Sie die veraltete Prozedur mysql.lambda_async
verwenden, empfehlen wir, dass Sie die Aufrufe an die Prozedur mysql.lambda_async
in einer gespeicherten Prozedur übergeben. Sie können diese gespeicherte Prozedur aus verschiedenen Quellen aufrufen, wie z. B. Trigger oder Client-Code. Dieser Ansatz kann helfen, Probleme hinsichtlich Impedanz-Unstimmigkeiten zu vermeiden und macht es Ihren Datenbank-Programmieren einfacher Lambda-Funktionen aufzurufen.
Weitere Informationen über das Aufrufen von Lambda-Funktionen in Amazon Aurora finden Sie unter Aufrufen einer Lambda-Funktion aus einem Amazon Aurora My SQL DB-Cluster.
Vermeidung von XA-Transaktionen mit Amazon Aurora My SQL
Wir empfehlen, keine eXtended Architecture (XA) -Transaktionen mit Aurora My zu verwendenSQL, da sie zu langen Wiederherstellungszeiten führen können, wenn sich die XA im PREPARED
Status befindet. Wenn Sie XA-Transaktionen mit Aurora My verwenden müssenSQL, befolgen Sie diese bewährten Methoden:
-
Lassen Sie eine XA-Transaktion nicht im Status
PREPARED
offen. -
Halten Sie XA-Transaktionen so klein wie möglich.
Weitere Informationen zur Verwendung von XA-Transaktionen mit My SQL finden Sie unter XA-Transaktionen
Fremdschlüssel bei DML Kontoauszügen aktiviert lassen
Es wird dringend empfohlen, keine Anweisungen in der Datendefinitionssprache (DDL) auszuführen, wenn die foreign_key_checks
Variable auf 0
(aus) gesetzt ist.
Wenn Sie Zeilen einfügen oder aktualisieren müssen, die eine vorübergehende Verletzung von Fremdschlüsseln bedingen, gehen Sie wie folgt vor:
-
Setzen Sie
foreign_key_checks
auf0
. -
Nehmen Sie Änderungen an Ihrer Datenmanipulationssprache (DML) vor.
-
Stellen Sie sicher, dass Ihre durchgeführten Änderungen keine Fremdschlüsselbedingungen verletzen.
-
Setzen Sie
foreign_key_checks
auf1
(ein).
Darüber hinaus halten Sie die folgenden anderen bewährten Methoden für Fremdschlüsselbedingungen ein:
-
Stellen Sie sicher, dass Ihre Client-Anwendungen die Variable
foreign_key_checks
nicht auf0
als Teil der Variableninit_connect
setzen. -
Wenn eine Wiederherstellung aus einer logischen Sicherung, wie beispielsweise
mysqldump
, fehlschlägt oder unvollständig ist, stellen Sie sicher, dassforeign_key_checks
auf1
gesetzt ist, bevor Sie innerhalb derselben Sitzung andere Operationen starten. Eine logische Sicherung setztforeign_key_checks
beim Start auf0
.
Konfigurieren, wie oft der Protokollpuffer geleert wird
In My SQL Community Edition muss der InnoDB-Protokollpuffer in einen dauerhaften Speicher geleert werden, um Transaktionen dauerhaft zu machen. Verwenden Sie den Parameter innodb_flush_log_at_trx_commit
, um zu konfigurieren, wie oft der Protokollpuffer geleert und auf die Festplatte übertragen wird.
Wenn Sie den Parameter innodb_flush_log_at_trx_commit
auf den Standardwert 1 festlegen, wird der Protokollpuffer bei jedem Transaktions-Commit geleert. Diese Einstellung trägt dazu bei, dass die Datenbank ACID
Die Änderung innodb_flush_log_at_trx_commit
zu einem anderen Wert als dem Standardwert kann dazu beitragen, die Latenz der Datenmanipulationssprache (DML) zu reduzieren, beeinträchtigt jedoch die Haltbarkeit der Protokolldatensätze. Aufgrund dieser mangelnden Beständigkeit ist die Datenbank ACID nicht konform. Wir empfehlen, dass Ihre Datenbanken ACID konform sind, um das Risiko eines Datenverlusts bei einem Serverneustart zu vermeiden. Weitere Informationen zu diesem Parameter finden Sie unter innodb_flush_log_at_trx_commit in der Dokumentation
In Aurora My SQL wird die Redo-Log-Verarbeitung auf die Speicherschicht ausgelagert, sodass keine Protokolldateien auf der DB-Instance gespeichert werden. Wenn ein Schreibvorgang ausgeführt wird, werden Redo-Protokolle von der Writer-DB-Instance direkt an das Aurora-Cluster-Volume gesendet. Die einzigen Schreibvorgänge, die das Netzwerk passieren, sind Redo-Protokolldatensätze. Auf der Datenbankebene werden grundsätzlich keine Seiten geschrieben.
Standardmäßig wartet jeder Thread, der eine Transaktion festschreibt, auf die Bestätigung durch das Aurora-Cluster-Volume. Diese Bestätigung gibt an, dass dieser Datensatz und alle vorherigen Redo-Protokolldatensätze geschrieben wurden und das Quorum
Aurora My speichert SQL keine Protokolle in Datendateien, wie dies bei My SQL Community Edition der Fall ist. Sie können den Parameter innodb_flush_log_at_trx_commit
jedoch verwenden, um Haltbarkeitsbeschränkungen beim Schreiben von Redo-Protokolldatensätzen auf das Aurora-Clustervolume zu lockern.
Für Aurora My SQL Version 2:
-
innodb_flush_log_at_trx_commit
= 0 oder 2 — Die Datenbank wartet nicht auf die Bestätigung, dass die Redo-Log-Datensätze auf das Aurora-Cluster-Volume geschrieben wurden. -
innodb_flush_log_at_trx_commit
= 1 — Die Datenbank wartet auf die Bestätigung, dass die Redo-Log-Datensätze auf das Aurora-Cluster-Volume geschrieben wurden.
Für Aurora My SQL Version 3:
-
innodb_flush_log_at_trx_commit
= 0 — Die Datenbank wartet nicht auf die Bestätigung, dass die Redo-Log-Datensätze auf das Aurora-Cluster-Volume geschrieben wurden. -
innodb_flush_log_at_trx_commit
= 1 oder 2 — Die Datenbank wartet auf die Bestätigung, dass die Redo-Log-Datensätze auf das Aurora-Cluster-Volume geschrieben wurden.
Um in Aurora My SQL Version 3 dasselbe nicht standardmäßige Verhalten zu erzielen, das Sie mit dem Wert 0 oder 2 in Aurora My SQL Version 2 erzielen würden, setzen Sie den Parameter daher auf 0.
Diese Einstellungen können zwar die DML Latenz für den Client verringern, sie können aber auch zu Datenverlust im Falle eines Failovers oder Neustarts führen. Daher empfehlen wir, für den Parameter innodb_flush_log_at_trx_commit
den Standardwert 1 beizubehalten.
Datenverlust kann zwar sowohl in My SQL Community Edition als auch in Aurora My auftretenSQL, das Verhalten unterscheidet sich jedoch in jeder Datenbank aufgrund ihrer unterschiedlichen Architekturen. Diese Unterschiede in der Architektur können zu unterschiedlich starkem Datenverlust führen. Um sicherzustellen, dass Ihre Datenbank ACID konform ist, sollten Sie immer innodb_flush_log_at_trx_commit
auf 1 setzen.
Anmerkung
Bevor Sie in Aurora My SQL Version 3 innodb_flush_log_at_trx_commit
zu einem anderen Wert als 1 wechseln können, müssen Sie zuerst den Wert von innodb_trx_commit_allow_data_loss
auf 1 ändern. Auf diese Weise erkennen Sie das Risiko eines Datenverlusts an.
Minimierung und Behebung von Aurora My-Deadlocks SQL
Bei Benutzern, die Workloads ausführen, bei denen regelmäßig Einschränkungen für eindeutige sekundäre Indizes oder Fremdschlüssel verletzt werden, kann es bei der gleichzeitigen Änderung von Datensätzen auf derselben Datenseite zu erhöhten Deadlocks und Wartezeitüberschreitungen bei Sperren kommen. Diese Deadlocks und Timeouts sind auf eine Fehlerkorrektur in My SQL Community Edition zurückzuführen.
Dieser Fix ist in den Versionen 5.7.26 und höher von My SQL Community Edition enthalten und wurde in die Aurora SQL My-Versionen 2.10.3 und höher zurückportiert. Das Update ist notwendig, um die Serialisierbarkeit durchzusetzen, indem zusätzliche Sperren für diese Art von Data Manipulation Language (DML) -Operationen für Änderungen an Datensätzen in einer InnoDB-Tabelle implementiert werden. Dieses Problem wurde im Rahmen einer Untersuchung von Deadlock-Problemen aufgedeckt, die durch eine frühere Fehlerkorrektur in My Community Edition verursacht wurden. SQL
Mit dem Bugfix wurde die interne Behandlung für das teilweise Rollback eines Tupel- (Zeilen-)Updates in der InnoDB-Speicher-Engine geändert. Operationen, die zu Einschränkungsverstößen bei Fremdschlüsseln oder eindeutigen Sekundärindizes führen, verursachen ein partielles Rollback. Dies beinhaltet, ist aber nicht beschränkt auf gleichzeitige INSERT...ON DUPLICATE KEY UPDATE
-, REPLACE
INTO,
- und INSERT IGNORE
-Anweisungen (upserts).
In diesem Zusammenhang bezieht sich partielles Rollback nicht auf das Rollback von Transaktionen auf Anwendungsebene, sondern auf ein internes InnoDB-Rollback von Änderungen an einem gruppierten Index, wenn ein Einschränkungsverstoß auftritt. Beispielsweise wird während einer Upsert-Operation ein doppelter Schlüsselwert gefunden.
In einem normalen Einfügevorgang erstellt InnoDB automatisch gruppierte
Minimieren von InnoDB-Deadlocks
Sie können die folgenden Ansätze verwenden, um die Häufigkeit von Deadlocks in Ihrer Datenbank-Instance zu reduzieren. Weitere Beispiele finden Sie in der Dokumentation Meine SQL
-
Um die Wahrscheinlichkeit von Deadlocks zu verringern, sollten Sie für Transaktionen sofort einen Commit ausführen, nachdem Sie die entsprechenden Änderungen vorgenommen haben. Teilen Sie dazu große Transaktionen (mehrere Zeilenaktualisierungen zwischen Commits) in kleinere Transaktionen auf. Wenn Sie Zeilen stapelweise einfügen, versuchen Sie, die Größe der Stapeleinfügungen zu reduzieren, insbesondere wenn Sie die zuvor genannten Upsert-Operationen verwenden.
Um die Anzahl möglicher partieller Rollbacks zu reduzieren, können Sie einige der folgenden Ansätze ausprobieren:
-
Ersetzen Sie Batch-Einfügeoperationen durch das Einfügen einer Zeile nach der anderen. Dadurch kann die Zeit reduziert werden, in der Sperren aufgrund von Transaktionen, die möglicherweise zu Konflikten führen, aufrechterhalten bleiben.
-
Anstatt sie zu verwenden
REPLACE INTO
, schreiben Sie die SQL Anweisung als Transaktion mit mehreren Anweisungen um, z. B. wie folgt:BEGIN; DELETE
conflicting rows
; INSERTnew rows
; COMMIT; -
Anstatt zu verwenden
INSERT...ON DUPLICATE KEY UPDATE
, schreiben Sie die SQL Anweisung als Transaktion mit mehreren Anweisungen um, z. B. wie folgt:BEGIN; SELECT
rows that conflict on secondary indexes
; UPDATEconflicting rows
; INSERTnew rows
; COMMIT;
-
-
Vermeiden Sie lang dauernde Transaktionen, ob aktiv oder inaktiv, die Sperren möglicherweise aufrechterhalten. Dazu gehören interaktive „Meine SQL Kunden“ -Sitzungen, die möglicherweise über einen längeren Zeitraum geöffnet sind und eine Transaktion noch nicht festgeschrieben hat. Bei der Optimierung von Transaktionsgrößen oder Batch-Größen können die Auswirkungen in Abhängigkeit von einer Reihe von Faktoren wie Parallelität, Anzahl der Duplikate und Tabellenstruktur variieren. Alle Änderungen sollten auf der Grundlage Ihrer Workload implementiert und getestet werden.
-
In einigen Situationen können Deadlocks auftreten, wenn zwei Transaktionen versuchen, auf dieselben Datensätze, entweder in einer oder mehreren Tabellen, in unterschiedlicher Reihenfolge zuzugreifen. Um dies zu verhindern, können Sie die Transaktionen so ändern, dass sie in derselben Reihenfolge auf die Daten zugreifen, wodurch der Zugriff serialisiert wird. Erstellen Sie beispielsweise eine Warteschlange mit Transaktionen, die abgeschlossen werden sollen. Dieser Ansatz kann dazu beitragen, Deadlocks zu vermeiden, wenn mehrere Transaktionen gleichzeitig stattfinden.
-
Durch Hinzufügen sorgfältig ausgewählter Indizes zu Ihren Tabellen lässt sich die Selektivität verbessern und die Notwendigkeit, auf Zeilen zuzugreifen, reduzieren, was zu weniger Sperren führt.
-
Wenn Sie auf eine Lückensperre
stoßen, können Sie die Transaktionsisolationsstufe für die Sitzung oder Transaktion in READ COMMITTED
ändern, um dies zu verhindern. Weitere Informationen zu InnoDB-Isolationsstufen und ihrem Verhalten finden Sie unter Isolationsstufen für Transaktionenin der SQL Dokumentation Meine.
Anmerkung
Sie können zwar Vorkehrungen treffen, um die Wahrscheinlichkeit von Deadlocks zu verringern, Deadlocks sind jedoch ein erwartetes Datenbankverhalten und können dennoch auftreten. Anwendungen sollten über die erforderliche Logik zum Umgang mit Deadlocks verfügen, wenn diese auftreten. Implementieren Sie beispielsweise die Wiederholungs- und Back-Off-Logik in der Anwendung. Es ist am besten, die Ursache des Problems zu beheben. Wenn jedoch ein Deadlock auftritt, hat die Anwendung die Möglichkeit, zu warten und es erneut zu versuchen.
Überwachen von InnoDB-Deadlocks
Deadlocks
-
SHOW ENGINE
-Anweisung – DieSHOW ENGINE INNODB STATUS \G
-Anweisung enthält Detailszum letzten Deadlock, der seit dem letzten Neustart in der Datenbank aufgetreten ist. -
Wenn dieser Parameter aktiviert ist, werden Informationen über alle Deadlocks in InnoDB-Benutzertransaktionen im Aurora SQL My-Fehlerprotokoll
aufgezeichnet. -
CloudWatch Amazon-Metriken — Wir empfehlen Ihnen außerdem, Deadlocks anhand der CloudWatch Metrik proaktiv zu überwachen.
Deadlocks
Weitere Informationen finden Sie unter Metriken auf Instance-Ebene für Amazon Aurora. -
Amazon CloudWatch Logs — Mit CloudWatch Logs können Sie Metriken anzeigen, Protokolldaten analysieren und Alarme in Echtzeit erstellen. Weitere Informationen finden Sie unter Überwachen von Fehlern in Amazon Aurora My SQL und Amazon RDS for My SQL mithilfe von Amazon CloudWatch und Senden von Benachrichtigungen über Amazon SNS
. Wenn Sie CloudWatch Logs verwenden, wenn diese Option
innodb_print_all_deadlocks
aktiviert ist, können Sie Alarme so konfigurieren, dass Sie benachrichtigt werden, wenn die Anzahl der Deadlocks einen bestimmten Schwellenwert überschreitet. Wenn Sie einen Schwellenwert definieren möchten, empfehlen wir Ihnen, Ihre Trends zu beobachten und einen Wert zu verwenden, der auf Ihrer normalen Workload basiert. -
Performance Insights – Wenn Sie Performance Insights verwenden, können Sie die Metriken
innodb_deadlocks
undinnodb_lock_wait_timeout
überwachen. Weitere Informationen zu diesen Metriken, finden Sie unter Zähler für Aurora My SQL.