Optimierung von RDS für PostgreSQL mit proaktiven Einblicken 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.

Optimierung von RDS für PostgreSQL mit proaktiven Einblicken von Amazon DevOps Guru

Proaktive DevOps-Guru-Einblicke erkennen Zustände auf Ihren RDS-für-PostgreSQL-DB-Instances , die Probleme verursachen können, und informiert Sie darüber, bevor diese auftreten. Proaktive Einblicke können Sie auf eine seit langem inaktive Transaktionsverbindung aufmerksam machen. Weitere Informationen zur Fehlerbehebung von seit langem inaktiven Transaktionsverbindungen finden Sie unter Die Datenbank läuft seit langem inaktiv in Transaktionsverbindung.

DevOps Guru 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 unter Analysieren von Leistungsanomalien mit 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 Einblick-Informationen werden für alle Versionen von RDS für PostgreSQL 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 BEGIN oder START TRANSACTION initiiert wurde, wurde nicht mit einem COMMIT-, ROLLBACK- oder END-Befehl beendet. 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 Status idle in transaction aufzulisten und sie nach Dauer zu sortieren:

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 START TRANSACTION initiieren, wechselt sie in den Status idle in transaction. Sie verbleibt in diesem Status, bis Sie die Transaktion beenden, indem Sie einen COMMIT-, ROLLBACK-, END-Befehl ausführen 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 finden Sie in der PostgreSQL-Dokumentation.

Die folgende Meldung wird in der PostgreSQL-Protokolldatei angezeigt, 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 AUTOCOMMIT-Status

AUTOCOMMIT ist 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 dies in pgadmin ein, indem Sie die Option AUTOCOMMIT über den Abwärtspfeil wählen.

    Wählen Sie in pgadmin AUTOCOMMIT, um es zu aktivieren.
Ü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 das JDBC-Autocommit 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.