내가 이해하는 한, 쿼리가 잠금을 기다리고 있다는 것은 항상 잠금을 기다리고 있었고 아무것도 변경하지 않았다는 것을 의미합니다.
오른쪽-ALTER TABLE에 대해 pg_stat_activity.waiting이 "true"인 경우 대상 테이블에서 ACCESS EXCLUSIVE 잠금 및 실제 작업 (필요한 경우 테이블 다시 작성, 카탈로그 변경)을 참을성있게 기다리는 것을 의미합니다 , 색인 다시 작성 등)이 아직 시작되지 않았습니다.
ALTER TABLE 쿼리를 완전히 취소해도 안전합니까? 아니면 쿼리가 이미 무언가를 수정하고 취소하면 데이터베이스가 중간 정도의 상태가 될 수 있습니까?
PostgreSQL에서 쿼리를 취소하거나 트랜잭션을 롤백하면 특정 데이터베이스에서 발생할 수있는 데이터베이스 손상 위험이 없습니다 (예 : 이 페이지 하단의 끔찍한 경고 ). 그렇기 때문에 최근 수퍼 유저가 아닌 사용자는 다른 백엔드에서 실행되는 자체 쿼리를 자유롭게 사용 pg_cancel_backend()
하고 종료 pg_terminate_backend()
할 수 있습니다. 데이터베이스 손상에 대한 걱정없이 안전하게 사용할 수 있습니다. 결국 PostgreSQL은 OOM 킬러에서 SIGKILL, 서버 종료 등과 같은 프로세스 종료를 처리 할 준비가되어 있어야합니다. 이것이 바로 WAL 로그 입니다.
PostgreSQL에서 (다중 문) 트랜잭션 내에 중첩 된 대부분의 DDL 명령을 수행 할 수 있음을 알 수 있습니다.
BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind
(스키마 마이그레이션이 함께 또는 전혀 이루어지지 않도록하는 것이 좋습니다.) 그러나 다음과 같이 말했습니다.
우리는 거래를 포장 하지 않았습니다ALTER TABLE
.
문서 에서 단일 명령으로도 충분합니다 .
PostgreSQL은 실제로 모든 SQL 문을 트랜잭션 내에서 실행되는 것으로 취급합니다. BEGIN 명령을 발행하지 않으면, 각 개별 명령문에는 내재 된 BEGIN이 있고 (성공한 경우) COMMIT가 랩핑되어 있습니다. BEGIN 및 COMMIT로 둘러싸인 명령문 그룹을 트랜잭션 블록이라고도합니다.
제어 psql 프롬프트에서 발행 된 Ctrl-C를 ALTER TABLE
통해 pg_cancel_backend()
또는을 취소 하면 마치 마치 마치 마치
BEGIN;
ALTER TABLE ... ;
ROLLBACK;
(바람직하게 볼 수는 있지만, 고가를 취소 ALTER TABLE
하면 ROLLBACK
어쨌든 갈 때 데이터베이스를 불필요한 불필요하게 분쇄 할 수 있습니다 .)