Comenzamos una ALTER TABLE
consulta hace horas y solo recientemente nos dimos cuenta (a través de pg_stat_activity
) que está esperando un bloqueo. Descubrimos la otra consulta que mantiene un bloqueo en la tabla que queremos modificar, y no la dejamos ir.
Nuestra consulta es una consulta "simple" (que cambia el tipo de datos de una columna), pero se ejecuta en una tabla masiva.
En lugar de matar el proceso que está reteniendo la cerradura, hemos decidido que preferimos matarlo ALTER TABLE
.
Nos hicieron no envolver los ALTER TABLE
en una transacción.
Según tengo entendido, el hecho de que nuestra consulta esté esperando un bloqueo significa que siempre ha estado esperando un bloqueo y nunca ha cambiado nada.
¿Es esto cierto? ¿Es seguro para nosotros cancelar por completo nuestra ALTER TABLE
consulta? ¿O es posible que la consulta ya haya modificado algo y cancelarla dejaría nuestra base de datos en algún estado intermedio?
PD: El plan es cancelarlo usando SELECT pg_cancel_backend(pid);
. Si es una mala idea, avíseme.
fuente
Respuestas:
Correcto: si ve que pg_stat_activity.waiting es "verdadero" para una TABLA DE ALTERACIÓN, eso seguramente significa que está esperando pacientemente el bloqueo ACCESS EXCLUSIVE en su tabla de destino y su verdadero trabajo (reescribiendo la tabla si es necesario, cambiando los catálogos) , reconstrucción de índices, etc.) aún no ha comenzado.
Cancelar consultas (o, de manera equivalente, deshacer una transacción) en PostgreSQL no tiene ningún peligro de corrupción de la base de datos que podría haber sido asustado en ciertas otras bases de datos (por ejemplo, la advertencia aterradora al final de esta página). Es por eso que los que no son superusuarios son, en versiones recientes, libres de usar
pg_cancel_backend()
ypg_terminate_backend()
eliminar sus propias consultas que se ejecutan en otros servidores; son seguros de usar sin preocuparse por la corrupción de la base de datos. Después de todo, PostgreSQL tiene que estar preparado para lidiar con cualquier proceso que se elimine, por ejemplo, SIGKILL del asesino OOM, el apagado del servidor, etc. Para eso está el registro WAL .También es posible que haya visto que en PostgreSQL, es posible realizar la mayoría de los comandos DDL anidados dentro de una transacción (multi-declaración), por ejemplo
(Impresionante para asegurarse de que las migraciones de esquemas se realicen juntas o no). Sin embargo, usted dijo:
Eso está bien para un solo comando: de los documentos ,
Por lo tanto, cancelar eso
ALTER TABLE
, ya sea a través depg_cancel_backend()
un Ctrl-C emitido desde el indicador de control psql, tendrá un efecto similar al que hubiera hecho(aunque como es de esperar, cancelar eso costoso
ALTER TABLE
puede salvar la base de datos de una gran cantidad de trabajo innecesario si deROLLBACK
todos modos lo hará ).fuente
Para elaborar sobre la respuesta correcta y excelente de Josh:
Si.
Sería seguro incluso si estuviera en el medio de reescribir la tabla .
Si quisieras, podrías simplemente apagar todo el servidor PostgreSQL, o de hecho la máquina en la que se ejecuta, reiniciarlo, y todo estaría bien. DDL en PostgreSQL es transaccional y a prueba de fallos.
Las operaciones DDL se registran a través de WAL y se garantiza que pueden revertirse o completarse tras la recuperación después de un bloqueo o un aborto.
fuente