Réglage de RDS pour PostgreSQL avec les insights proactifs Amazon DevOps Guru - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Réglage de RDS pour PostgreSQL avec les insights proactifs Amazon DevOps Guru

Les insights proactifs DevOps Guru détectent les conditions sur vos instances de base de données RDS pour PostgreSQL qui peuvent provoquer des problèmes, et vous en informent avant qu'ils surviennent. Des insights proactifs peuvent vous alerter lorsqu’une connexion reste inactive pendant une transaction de longue durée. Pour plus d’informations sur la résolution des problèmes liés aux connexions restées inactives trop longtemps pendant une transaction, consultez La base de données a une connexion de longue durée à l'état Transaction inactive

DevOps Guru peut effectuer les opérations suivantes :

  • Éviter de nombreux problèmes courants liés aux bases de données en recoupant la configuration de votre base de données par rapport aux paramètres courants recommandés.

  • Vous alerter face à des problèmes critiques dans votre flotte qui, s'ils ne sont pas vérifiés, peuvent entraîner des problèmes plus importants ultérieurement.

  • Vous alerter face à des problèmes nouvellement découverts.

Chaque insight proactif contient une analyse de la cause du problème et des recommandations d'actions correctives.

Pour plus d’informations sur Amazon DevOps Guru pour Amazon RDS, consultez Analyse des anomalies de performances avec Amazon DevOps Guru pour Amazon RDS.

La base de données a une connexion de longue durée à l'état Transaction inactive

Une connexion à la base de données est à l'état idle in transaction depuis plus de 1 800 secondes.

Versions de moteur prises en charge

Ces données d'insight sont prises en charge pour toutes les versions de RDS pour PostgreSQL.

Contexte

Une transaction à l'état idle in transaction peut contenir des verrous qui bloquent d'autres requêtes. Elle peut également empêcher VACUUM (y compris autovacuum) de nettoyer les lignes inactives, ce qui entraînerait le gonflement des index ou des tables ou le bouclage des identifiants de transactions.

Causes probables de ce problème

Une transaction initiée dans une session interactive avec BEGIN ou START TRANSACTION ne s'est pas terminée à l'aide d'une commande COMMIT, ROLLBACK ou END. Cela entraîne le passage de la transaction à l'état idle in transaction.

Actions

Vous pouvez trouver les transactions inactives en exécutant la requête pg_stat_activity.

Dans votre client SQL, exécutez la requête suivante pour répertorier toutes les connexions à l'état idle in transaction et les ordonner par durée :

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;

Nous vous recommandons différentes actions en fonction des causes de votre insight.

Arrêt de la transaction

Lorsque vous lancez une transaction dans une session interactive avec BEGIN ou START TRANSACTION, elle passe à l'état idle in transaction. Elle reste dans cet état jusqu'à ce que vous terminiez la transaction en émettant une commande COMMIT, ROLLBACK ou END, ou que vous déconnectiez complètement la connexion pour annuler la transaction.

Interruption de la connexion

Mettez fin à la connexion avec une transaction inactive à l'aide de la requête suivante :

SELECT pg_terminate_backend(pid);

pid est l'ID de processus de la connexion.

Configuration du paramètre idle_in_transaction_session_timeout

Définissez le paramètre idle_in_transaction_session_timeout dans le nouveau groupe de paramètres. La configuration de ce paramètre présente l'avantage de ne pas nécessiter d'intervention manuelle pour mettre fin à la longue période d'inactivité de la transaction. Pour plus d'informations sur ce paramètre, consultez la documentation PostgreSQL.

Le message suivant sera enregistré dans le fichier journal de PostgreSQL après l'interruption de la connexion, quand une transaction sera dans l'état idle_in_transaction pendant un temps supérieur à la durée spécifiée.

FATAL: terminating connection due to idle in transaction timeout
Vérification du statut AUTOCOMMIT

AUTOCOMMIT est activé par défaut. Mais s'il est désactivé accidentellement dans le client, veillez à le réactiver.

  • Dans votre client psql, exécutez la commande suivante :

    postgres=> \set AUTOCOMMIT on
  • Dans pgadmin, activez-la en choisissant l'option AUTOCOMMIT à partir de la flèche déroulante.

    Dans pgadmin, choisissez AUTOCOMMIT pour l'activer.
Vérification de la logique de transaction dans le code de votre application

Examinez la logique de votre application pour détecter d'éventuels problèmes. Procédez comme suit :

  • Vérifiez si la validation automatique JDBC est définie sur true dans votre application. Pensez également à utiliser des commandes COMMIT explicites dans votre code.

  • Vérifiez votre logique de gestion des erreurs pour voir si elle clôture une transaction après des erreurs.

  • Vérifiez si votre application met du temps à traiter les lignes renvoyées par une requête lorsque la transaction est ouverte. Si tel est le cas, pensez à coder l'application pour clôturer la transaction avant de traiter les lignes.

  • Vérifiez si une transaction contient de nombreuses opérations de longue durée. Si tel est le cas, divisez une transaction individuelle en plusieurs transactions.

Métriques pertinentes

Les métriques PI suivantes sont liées à cet insight :

  • idle_in_transaction_count : nombre de sessions à l'état idle in transaction.

  • idle_in_transaction_max_time : durée de la transaction la plus longue à l'état idle in transaction.