Ajuste de Aurora PostgreSQL con información proactiva de Amazon DevOps Guru
La información proactiva de DevOps Guru detecta las condiciones en sus clústeres de bases de datos de Aurora 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 de Aurora 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.
Temas
Versiones del motor admitidas
Esta información es compatible con todas las versiones de Aurora 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.
Temas
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.
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
.