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.
Optimiert RDSfür Postgre SQL mit proaktiven Erkenntnissen von Amazon DevOps Guru
DevOpsGuru Proactive Insights erkennt Bedingungen in Ihren , die Probleme verursachen können, und informiert Sie darüber, bevor sie auftreten. Proaktive Einblicke können Sie auf einen seit langem laufenden Leerlauf in der Transaktionsverbindung aufmerksam machen. Weitere Informationen zur Behebung von Problemen mit lang andauerndem Leerlauf bei Transaktionsverbindungen finden Sie unter Die Datenbank läuft seit langem inaktiv in Transaktionsverbindung
DevOpsGuru kann Folgendes tun:
-
Vermeiden vieler häufig auftretender Datenbankprobleme durch Abgleich der Datenbankkonfiguration mit den allgemein empfohlenen Einstellungen.
-
Warnen vor kritischen Problemen in der Flotte, die, wenn sie nicht überprüft werden, später zu größeren Problemen führen können.
-
Benachrichtigung bei neu erkannten Problemen.
Jeder proaktive Einblick beinhaltet eine Analyse der Problemursache und Empfehlungen für Korrekturmaßnahmen.
Weitere Informationen zu Amazon DevOps Guru für Amazon RDS finden Sie unterAnalysieren von Leistungsanomalien mit Amazon DevOps Guru für Amazon RDS.
Die Datenbank läuft seit langem inaktiv in Transaktionsverbindung
Eine Verbindung zur Datenbank befindet sich sein mehr als 1800 Sekunden im Status idle in transaction
.
Themen
Unterstützte Engine-Versionen
Diese Insight-Informationen werden für alle Versionen von RDSfür Postgre SQL unterstützt.
Kontext
Eine Transaktion im Status idle in transaction
kann Sperren enthalten, die andere Abfragen blockieren. Sie kann auch verhindern, dass VACUUM
(einschließlich Autovacuum) tote Zeilen bereinigt, was zu einer Überlastung von Index oder Tabellen oder zu einem Wraparound der Transaktions-ID führt.
Mögliche Ursachen für dieses Problem
Eine Transaktion, die in einer interaktiven Sitzung mit einemCOMMIT, BEGIN START TRANSACTION oder -Befehl initiiert wurde oder END nicht beendet wurde. ROLLBACK Dadurch wird die Transaktion in den Status idle in
transaction
versetzt.
Aktionen
Sie können ungenutzte Transaktionen finden, indem Sie pg_stat_activity
abfragen.
Führen Sie in Ihrem SQL Client die folgende Abfrage aus, um alle Verbindungen im idle in transaction
Status aufzulisten und sie nach Dauer zu ordnen:
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;
Abhängig von den Ursachen Ihres Einblicks empfehlen wir verschiedene Aktionen.
Themen
Transaktion beenden
Wenn Sie eine Transaktion in einer interaktiven Sitzung mit BEGIN oder initiieren STARTTRANSACTION, wechselt sie in den idle in transaction
Status. Sie bleibt in diesem Zustand, bis Sie die Transaktion beenden, indem Sie einenCOMMIT,ROLLBACK, END Befehl ausgeben oder die Verbindung vollständig trennen, um die Transaktion rückgängig zu machen.
Die Verbindung beenden
Beenden Sie die Verbindung mit einer inaktiven Transaktion mit der folgenden Abfrage:
SELECT pg_terminate_backend
(pid)
;
pid ist die Prozess-ID der Verbindung.
Konfigurieren Sie den Parameter idle_in_transaction_session_timeout
Stellen Sie den Parameter idle_in_transaction_session_timeout
in der Parametergruppe ein. Der Vorteil der Konfiguration dieses Parameters besteht darin, dass kein manueller Eingriff erforderlich ist, um die lang dauernde inaktive Transaktion zu beenden. Weitere Informationen zu diesem Parameter finden Sie in der SQL Postgre-Dokumentation
Die folgende Meldung wird in der SQL Postgre-Protokolldatei gemeldet, nachdem die Verbindung beendet wurde, wenn sich eine Transaktion länger als die angegebene Zeit im Status idle_in_transaction befindet.
FATAL: terminating connection due to idle in transaction timeout
Überprüfen Sie den Status AUTOCOMMIT
AUTOCOMMITist standardmäßig aktiviert. Wenn dies jedoch versehentlich im Client deaktiviert wurde, stellen Sie sicher, dass Sie es wieder aktivieren.
-
Führen Sie in Ihrem psql-Client den folgenden Befehl aus:
postgres=>
\set AUTOCOMMIT on
-
Schalten Sie es in pgadmin ein, indem Sie die AUTOCOMMIT Option mit dem Abwärtspfeil auswählen.
Überprüfen Sie die Transaktionslogik in Ihrem Anwendungscode
Untersuchen Sie Ihre Anwendungslogik auf mögliche Probleme. Berücksichtigen Sie die folgenden Aktionen:
-
Prüfen Sie, ob der JDBC Auto-Commit in Ihrer Anwendung auf true gesetzt ist. Erwägen Sie auch, explizite
COMMIT
-Befehle in Ihrem Code zu verwenden. -
Überprüfen Sie Ihre Fehlerbehandlungslogik, um festzustellen, ob eine Transaktion nach einem Fehler geschlossen wird.
-
Prüfen Sie, ob Ihre Anwendung lange braucht, um die von einer Abfrage zurückgegebenen Zeilen zu verarbeiten, während die Transaktion geöffnet ist. Wenn dies der Fall ist, erwägen Sie, die Anwendung so zu codieren, dass die Transaktion geschlossen wird, bevor die Zeilen verarbeitet werden.
-
Prüfen Sie, ob eine Transaktion viele lang laufende Operationen enthält. Wenn dies der Fall ist, teilen Sie eine einzelne Transaktion in mehrere Transaktionen auf.
Relevante Metriken
Die folgenden PI-Metriken beziehen sich auf diesen Einblick:
-
idle_in_transaction_count – Anzahl der Sitzungen im Status
idle in transaction
. -
idle_in_transaction_max_time – Die Dauer der am längsten laufenden Transaktion im Status
idle in transaction
.