Direkt zum Inhalt

Wie behebe ich „Statement Timeout“-Fehler bei Abfragen, die auf meinem Datenbank-Cluster von Aurora PostgreSQL-Compatible ausgeführt werden?

Lesedauer: 4 Minute
0

Ich möchte Anweisungs-Timeout-Fehler bei Abfragen beheben, die auf meinem Datenbank (DB)-Cluster von Amazon Aurora PostgreSQL-Compatible Edition ausgeführt werden.

Lösung

Wichtig: Performance Insights wird am 30. Juni 2026 das Ende seiner Lebensdauer erreichen. Du kannst vor dem 30. Juni 2026 ein Upgrade auf den Modus „Erweitert“ von Database Insights durchführen. Wenn du kein Upgrade durchführst, verwenden DB-Cluster, die Performance Insights verwenden, standardmäßig den Modus „Standard“ von Database Insights. Nur der Modus „Erweitert“ von Database Insights unterstützt Ausführungspläne und On-Demand-Analysen. Wenn die Cluster standardmäßig auf den Modus „Standard“ eingestellt sind, kannst du diese Funktionen möglicherweise nicht auf der Konsole verwenden. Informationen zum Aktivieren des Modus „Erweitert“ findest du unter Einschalten des Modus „Erweitert“ von Database Insights für Amazon RDS und Einschalten des Modus „Erweitert“ von Database Insights für Amazon Aurora.

Wenn Abfragen nicht innerhalb der durch den statement_timeout-Parameter angegebenen Zeit ausgeführt werden, bricht der statement_timeout-Parameter die Abfrage ab. Du erhältst die folgende Fehlermeldung:

„ERROR: canceling statement due to statement timeout.“

Gehe wie folgt vor, um den Fehler zu beheben.

Den konfigurierten statement_timeout-Parameter überprüfen

Um den statement_timeout-Parameter in der DB-Cluster-Parametergruppe oder DB-Parametergruppe zu überprüfen, führe die folgende SELECT-Abfrage aus:

SELECT name, setting, unit, context, source FROM pg_settings WHERE name = 'statement_timeout';

Erwartete Ausgabe:

       name        | setting | unit | context |       source
-------------------+---------+------+---------+--------------------
 statement_timeout | 5000    | ms   | user    | configuration file

Hinweis: In der Beispielausgabe hat der statement_timeoutParameter einen Wert von 5 000 Millisekunden. Im Feld „Quelle“ wird „configuration file“ (Konfigurationsdatei) angezeigt, was darauf hinweist, dass der Parameter auf Cluster-Parametergruppenebene festgelegt ist.

Überprüfe dann den Parameter statement_timeout auf Rollen- und Datenbankebene.

Führe die folgende Abfrage aus, um die Konfigurationen auf Rollenebene für alle Rollen im Datenbank-Cluster zu überprüfen:

SELECT r.rolname, d.datname, s.setconfig
FROM pg_db_role_setting s
JOIN pg_roles r ON r.oid = s.setrole
LEFT JOIN pg_database d ON d.oid = s.setdatabase
WHERE s.setconfig::text LIKE '%statement_timeout%'
ORDER BY r.rolname;

Führe die folgende Abfrage aus, um die Konfigurationen auf Datenbankebene für alle Datenbanken im Cluster zu überprüfen:

SELECT d.datname, rs.setconfig
FROM pg_db_role_setting rs
JOIN pg_database d ON d.oid = rs.setdatabase
WHERE rs.setrole = 0;

Überprüfe die Ausgabe, um alle statement_timeout-Konfigurationen zu identifizieren, die auf Rollen- oder Datenbankebene festgelegt sind und die Einstellung auf Clusterebene überschreiben könnten.

Hinweis: Statement_timeout-Parameter, die du mit ALTER ROLE SET festlegst, werden nicht an untergeordnete Rollen vererbt. Wenn du den Parameter statement_timeout für eine Rolle konfigurierst, kannst du den Parameter nur verwenden, wenn du dich bei dieser Rolle anmeldest. Weitere Informationen findest du unter ALTER ROLE auf der PostgreSQL-Website.

Ermitteln der abgebrochenen SQL-Abfragen

Zeige die PostgreSQL-Fehlerprotokolldatei an und stelle dann fest, ob der Parameter log_min_error_statement auf ERROR oder einen niedrigeren Schweregrad gesetzt ist. Nachdem du die fehlgeschlagene Anweisung ermittelt hast, suche nach den fehlerhaften SQL- und Tabellennamen. Weitere Informationen findest du unter Grundlegendes zum Parameter log_line_prefix.

Ermitteln der Ursache für die lange Ausführungsdauer von Abfragen

Wenn du die fehlgeschlagene SQL-Abfrage findest, verwende CloudWatch Database Insights, um blockierte Transaktionen zu ermitteln.

Gehe wie folgt vor, um CloudWatch Database Insights zur Leistungsanalyse zu verwenden:

  1. Öffne die Amazon Relational Database Service (Amazon RDS)-Konsole.
  2. Wähle im Navigationsbereich Datenbanken.
  3. Wähle deinen Aurora-PostgreSQL-DB-Cluster aus.
  4. Wähle die Registerkarte Überwachung aus.
  5. Wähle Details anzeigen für Performance Insights aus.
  6. Überprüfe die DB-Auslastung. Du kannst die DB-Auslastung nach Warteereignissen, SQL-Abfragen, Hosts oder Benutzern gruppieren, um blockierte Transaktionen zu ermitteln.

Wenn sich das Problem konsistent wiederholt, konfiguriere den Parameter log_min_duration_statement für die DB-Instance und verwende das Modul auto_explain. Weitere Informationen findest du unter Wie kann ich Ausführungspläne von Abfragen für Amazon RDS PostgreSQL oder Aurora PostgreSQL protokollieren, um die Abfrageleistung zu optimieren?

Du kannst die Befehle EXPLAIN und EXPLAIN ANALYZE verwenden, um den Abfrageausführungsplan abzurufen. Weitere Informationen findest du unter Wie identifiziere und behebe ich Leistungsprobleme und Abfragen mit langsamer Ausführung in meiner DB-Instance von Amazon RDS für PostgreSQL oder Aurora PostgreSQL-Compatible?

In Quelltabellen nach toten Zeilen suchen

Tote Zeilen oder Tupel können die SELECT-Zeit verlängern. Führe die folgende Abfrage aus, um in den Quelltabellen nach einer großen Anzahl toter Zeilen zu suchen:

SELECT * FROM pg_stat_user_tables WHERE relname = 'table_name';

Hinweis: Ersetze table_name durch den Namen der Quelltabelle.

Ähnliche Informationen

Wie beende ich Abfragen mit langer Ausführungszeit in meiner DB-Instance von Amazon RDS für PostgreSQL oder Aurora PostgreSQL-Compatible?

Wie finde ich heraus, was eine Abfrage auf meiner Datenbank-Instance von Amazon RDS PostgreSQL oder Aurora PostgreSQL blockiert hat?

AWS OFFICIALAktualisiert vor 6 Monaten