Optimiert RDSfür Postgre SQL mit proaktiven Erkenntnissen von Amazon DevOps Guru - Amazon Relational Database Service

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.

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.

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.

    Wählen Sie in pgadmin, ob Sie es einschalten AUTOCOMMIT möchten.
Ü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.