PostgreSQL : TRUNCATE 후 디스크 공간이 해제되지 않습니다


12

나는 TRUNCATE거대한 (~ 120Gb) 테이블을 만들었습니다 files.

TRUNCATE files;
VACUUM FULL files;

테이블 크기는 0이지만 디스크 공간이 해제되지 않았습니다. 잃어버린 디스크 공간을 되 찾는 방법에 대한 아이디어가 있습니까?

업데이트 : 디스크 공간은 ~ 12 시간 후에 아무런 조치도 취하지 않고 해제되었습니다. 우분투 8.04 서버를 사용합니다.


나는 "vacuum it!"을 제안하려고했지만 방금 제안한 것을 고려할 때 이것을 pg-hackers 또는 pg-performance list 중 하나로 가져가는 것이 좋습니다. 하나).
Denis de Bernardy 2016 년

이 링크 ( postgresql.1045698.n5.nabble.com/… )에 대한 조언이 있습니까? 어쩌면 테이블이나 이와 유사한 것에 액세스하는 것이있을 수 있습니다.
DrColossos 2016 년

@ DrColossos : PostgreSQL이 자르려고하는 모든 연결에 알리고 필요한 리소스를 잠근다 고 소스에서 주석 (지금은 찾을 수없는 주석)을 읽었습니다. (테이블 자체, 인덱스, 시퀀스 및 토스트 테이블을 포함하여 몇 가지가 있습니다.) ExecuteTruncate ()를 통해 추적하여 주석을 일찍 찾았지만 100 % 긍정적이지 않습니다.
Mike Sherrill 'Cat Recall'6

답변:


12

에 따르면 소스에 주석 , truncate새, 빈 저장 파일을 생성하고, 커밋 시간에 오래 저장 파일을 삭제합니다. (문서에 따르면 "저장 파일"은 OS에 관한 한 파일 일 뿐이지 만 용어를 이해하지 못할 수도 있습니다.)

관계에 대해 비어있는 새 스토리지 파일을 작성하고 relfilenode 값으로 지정하십시오. 이전 스토리지 파일은 커밋시 삭제되도록 예약되어 있습니다.

파일을 삭제하는 것처럼 보이므로 기본 운영 체제에서 해당 공간을 즉시 확보하지 못할 수 있습니다. 예를 들어 스토리지 파일이 Windows의 경우 휴지통에있을 수 있습니다. 그러나 필자의 경우 PostgreSQL 9에서 테이블을 자르면 Windows의 여유 공간이 즉시 증가했습니다.

잘림도 WAL 로그에 기록됩니다. 그 효과가 얼마나 될지 모르겠습니다.


2
다른 백엔드 프로세스에는 여전히 파일 열기에 대한 파일 설명자가 있습니다. 이 문제가 다시 발생하면 다른 모든 백엔드 프로세스를 종료하여 차이가 있는지 확인합니다.
Peter Eisentraut

ExecuteTruncate ()가 일어날 수 없다는 것을 읽었습니다. 이전 스토리지 파일을 결국 삭제하는 데 필요한 자원 잠금의 모든 부분. 그러나 나는 출처에서 어디서 그것을 찾았는지 모른다. 그냥 온라인으로 탐색하고 있습니다. 그렇게 길을 잃기 쉽습니다.
Mike Sherrill 'Cat Recall'6
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.