Ajuste de RDS para PostgreSQL con información proactiva de Amazon DevOps Guru - Amazon Relational Database Service

Ajuste de RDS para PostgreSQL con información proactiva de Amazon DevOps Guru

La información proactiva de DevOps Guru detecta las condiciones en sus instancias de base de datos de RDS para PostgreSQL que pueden causar problemas y le permiten conocerlos antes de que se produzcan. La información proactiva puede alertarle sobre algún elemento que lleve tiempo inactivo en la conexión de la transacción. Para obtener más información sobre cómo resolver un problema relacionado con una inactividad prolongada en las conexiones de transacciones, consulte La base de datos lleva mucho tiempo inactiva en la conexión de la transacción.

DevOps Guru puede hacer lo siguiente:

  • Evitar muchos problemas comunes en las bases de datos cotejando la configuración de la base de datos con la configuración habitual recomendada.

  • Alertar sobre problemas críticos en su flota que, si no se comprueban, pueden provocar problemas mayores en el futuro.

  • Avisarle de los problemas que acaban de descubrirse.

Cada información proactiva contiene un análisis de la causa del problema y recomendaciones para las acciones correctivas.

Para obtener más información sobre Amazon DevOps Guru para Amazon RDS, consulte Análisis de anomalías de rendimiento con Amazon DevOps Guru para Amazon RDS.

La base de datos lleva mucho tiempo inactiva en la conexión de la transacción

Una conexión a la base de datos lleva en el estado idle in transaction más de 1800 segundos.

Versiones del motor admitidas

Esta información es compatible con todas las versiones de RDS para PostgreSQL.

Context

Una transacción en el estado idle in transaction puede contener bloqueos que bloqueen otras consultas. También puede evitar que VACUUM (incluido autovacuum) limpie las filas inactivas, lo que provoca una sobrecarga de índices o tablas o un resumen de los ID de transacciones.

Causas probables de este problema

Una transacción iniciada en una sesión interactiva con BEGIN o START TRANSACTION no ha finalizado con los comandos COMMIT, ROLLBACK o END. Esto hace que la transacción pase al estado idle in transaction.

Acciones

Para encontrar transacciones inactivas, consulte pg_stat_activity.

En su cliente SQL, ejecute la siguiente consulta para ver todas las conexiones en el estado idle in transaction y ordenarlas por duración:

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;

Recomendamos diferentes acciones en función de las causas.

Finalización de la transacción

Al iniciar una transacción en una sesión interactiva con BEGIN o START TRANSACTION, esta pasa al estado idle in transaction. Permanecerá en este estado hasta que finalice la transacción al emitir los comandos COMMIT, ROLLBACK, END o hasta que finalice la conexión por completo para revertir la transacción.

Finalización de la conexión

Finalice la conexión con una transacción inactiva mediante la siguiente consulta:

SELECT pg_terminate_backend(pid);

pid es el ID del proceso de la conexión.

Configure el parámetro idle_in_transaction_session_timeout

Configure el parámetro idle_in_transaction_session_timeout en el grupo de parámetros. La ventaja de configurar este parámetro es que no requiere una intervención manual para finalizar el periodo de inactividad prolongado de la transacción. Para obtener más información sobre este parámetro, consulte la documentación de PostgreSQL.

El siguiente mensaje aparecerá en el archivo de registro de PostgreSQL una vez finalizada la conexión y cuando haya una transacción en el estado idle_in_transaction durante más tiempo del especificado.

FATAL: terminating connection due to idle in transaction timeout
Compruebe el estado AUTOCOMMIT

AUTOCOMMIT está activado de forma predeterminada. Pero si se desactiva accidentalmente en el cliente, asegúrese de volver a activarlo.

  • En su cliente psql, ejecute el siguiente comando:

    postgres=> \set AUTOCOMMIT on
  • En pgadmin, para activarlo, seleccione la opción AUTOCOMMIT en la flecha hacia abajo.

    En pgadmin, elija AUTOCOMMIT para activarlo.
Compruebe la lógica de la transacción en el código de su aplicación

Investigue la lógica de su aplicación para detectar posibles problemas. Considere las siguientes acciones:

  • Compruebe si la confirmación automática de JDBC está activada en su aplicación. Además, considere la posibilidad de usar comandos COMMIT explícitos en su código.

  • Compruebe su lógica de gestión de errores para ver si cierra una transacción después de que se produzcan errores.

  • Compruebe si su aplicación tarda mucho en procesar las filas devueltas por una consulta mientras la transacción está abierta. Si es así, considere la posibilidad de programar la aplicación para que cierre la transacción antes de procesar las filas.

  • Compruebe si una transacción contiene muchas operaciones de larga duración. Si es así, divida una sola transacción en varias transacciones.

Métricas relevantes

Las siguientes métricas de PI están relacionadas con esta información:

  • idle_in_transaction_count: número de sesiones en el estado idle in transaction.

  • idle_in_transaction_max_time: la duración de la transacción en ejecución de más larga duración en el estado idle in transaction.