sql >> Base de Datos >  >> RDS >> PostgreSQL

El cliente de Postgres se bloquea al crear una nueva tabla

Si reiniciar Postgres es una opción, lo más probable es que eso resuelva el problema y le evitará perder tiempo leyendo el resto de esta respuesta :-)

Compruebe la pg_stat_activity vista, probablemente haya alguna otra transacción que bloquee el cambio de esquema.

select * from pg_stat_activity 
where 
wait_event_type is NULL and xact_start is not NULL order by xact_start;

(pg_stat_activity se cambia un poco en cada versión principal de pg, intente esto para versiones anteriores):

select * from pg_stat_activity 
where 
not waiting and xact_start is not NULL order by xact_start;

La primera fila que aparece es probablemente la que causa problemas. A menudo es una "transacción inactiva":esto puede muy bien contener bloqueos, y si es una transacción anterior, también puede matar el rendimiento. Probablemente el programador olvidó asegurarse de finalizar la transacción con "commit" o "rollback", o tal vez alguna sesión de db se atascó debido a problemas de red.

Para terminar la transacción con pid 1234, use select pg_cancel_backend(1234); , si eso falla, select pg_terminate_backend(1234) . Con acceso de shell, los comandos equivalentes son kill -INT 1234 y kill 1234 . (recuerde, kill -9 1234 es una muy mala idea).

También hay una vista pg_locks lo que puede dar una idea, aunque probablemente no sea tan fácil obtener información útil. Si granted es verdadero, el bloqueo se mantiene cuando granted es falso, significa que la consulta está esperando el bloqueo. Aquí hay algunos consejos más sobre cómo extraer información útil de pg_locks:http://wiki.postgresql. org/wiki/Lock_Monitoring

Si todo lo demás falla, entonces probablemente sea el momento de buscar la solución simple, reiniciar ese servidor de base de datos.