Postgresql Auto vaccum 수행중일 때 Full vaccum 이 돌면?
Q. auto vacuum 이 돌고 있는 상태에서 full vacuum 작업 실행이 가능할까?
auto vacuum 을 중지하고 full vacuum 을 해야 작업이 실행될까?
A. 일단 운영중에 full vacuum 을 돌리면 시스템이 멈춘다.
full vacuum 작업은 말그대로 dead tuple, gabage 공간을 새로 파일에 쓰는 작업이라 이해하면 된다.
서버 스펙에 따라 다르겠지만, 보통 auto vacuum 과 full vacuum 은 따로 돌아가게 된다.
그런데 auto vacuum 이 일어난다는건, deal tuple 이 많이 발생했다는건데 시스템 중단이 일어난 시점에 auto vacuum 이 돌 수 있을까? 중단된 시점에 auto vacuum 이 돌지 않는다는 것이다.
A. 경험상 full vacuum 이던 다른 manual vacuum 이던 auto vacuum에 wait 걸려서 kill 하고 수행했었다.
Q. 그럼 서비스 내리기 전에 돌아가던 auto vacuum 같은 경우 서비스 내리고 수동으로 kill 해줘야 할까?
A. 네 돌고 있으면 kill 이고 중간에 돌던 auto vacuum 이라도 kill 시 이후 full vacuum 을 돌린다면 영향도는 없을것이다.
Q. 혹시 어느 쿼리에 의해 full vacuum 작업이 wait 상태에 빠지게 됐을 때 wait 를 유발한 쿼리를 찾는 쿼리문이 있을까?
A. full vacuum 자체가 블록킹 하는거라 다른 쿼리가 안된다.
Q. full vacuum 완료 후 예상 테이블 사이즈 조회 가능할까?
A. 가능. 아주 정확한 사이즈까진 아니어도 대략적인 사이즈는 구할 수 있다.
full vacuum 테이블 재적재 과정
vacuum full A -> create temp A_temp -> insert into A_temp as select * from A -> rename A to temp_B -> rename A_temp to A -> delete temp_B
스토리지를 확인하면 원본 A 테이블이 100g 였다면, 100g 만큼의 파일 데이터를 또 발생시킨다. (물론 정확한 크기는 다를수 있지만) 재적재 할 때 그 ㅌ이블 사이즈만큼 스토리지 용량이 있어야 한다.
Q. vacuum full 테이블명 은 해당 테이블만 락을 잡을까?
A. 테이블만 잡는다. 근데 vacuum full대상 테이블로 고려될 정도로 블로팅이 높다는건 dml이 매우 잦을거고 다른 테이블과 연동될 가능성도 높기때문에 보통 서비스 다운하고 진행한다. 온라인 vacuum full 을 지원하는 pg_repack이라는 익스텐션도 있다. pg_repack 은 vacuum full 과는 달리 시작과 끝에만 락을 잡는다.
잘 아시겠지만 베큠 풀은 결국 새로운 테이블 만들어서 라이브 튜플만 옮기는 겁니다. 결국 베큠 풀이나 피지 리팩은 결과 아웃픗 동일합니다
리오그나 베큠풀이나 같아요 리인덱스 처리해주는것까지 유저테이블은 운영 단에 그냥 alter 리오그/통계 하시면되고
시스템테이블(카탈로그)은 오프라인 별도 잡고 베큠풀 하시면돼요. 시스템테이블은 리오그가안돼서 배큠풀.