- PostgreSQL에서 컬럼을 DROP 해도 실제로 데이터는 삭제되지 않음 — 단지 메타데이터에서 "숨김 처리" 됨
- DROP COLUMN 후에도 내부적으로 컬럼은 존재하기 때문에, 1600개 컬럼 제한에 도달할 수 있음
- 데이터를 완전히 제거하려면
VACUUM FULL 또는 수동 테이블 재작성이 필요함
- 이는 성능 최적화를 위한 설계지만, GDPR과 같은 컴플라이언스 관점에서는 주의 필요
- "실제로 무슨 일이 일어나는가"를 이해하면 문제 해결, 성능 최적화, 데이터 관리 측면에서 유리함
PostgreSQL에서 DROP COLUMN의 실제 작동 방식
문제 상황: 컬럼을 반복해서 추가/삭제하면?
PostgreSQL 내부에서 무슨 일이 벌어지나?
컬럼 삭제는 "진짜 삭제"가 아님
- PostgreSQL은 데이터를 8KB 페이지 단위로 저장
- 컬럼을 물리적으로 삭제하려면 전체 테이블을 다시 작성해야 하므로 비효율적
- 대신, 컬럼을 메타데이터에서 'dropped' 상태로 표시하고 무시함
pg_attribute 시스템 테이블로 확인 가능
SELECT attnum, attname, attisdropped FROM pg_attribute WHERE attrelid = 'test2'::regclass AND attnum > 0;
데이터 파일에서 확인하기 (pg_filedump 활용)
- PostgreSQL 데이터 파일을 분석하면, 삭제된 컬럼의 값이 실제로 남아 있는 것을 확인 가능
- 예전 데이터(
Item 1)에는 3개의 컬럼 값이 존재
- 삭제 후 삽입된 데이터(
Item 3)에는 해당 컬럼 값이 없고, NULL로 처리됨
삭제된 컬럼의 실제 제거 방법
1. VACUUM FULL
- 전체 테이블을 재작성하며 삭제된 컬럼의 데이터도 제거
- 단점: 컬럼 자체는 여전히 pg_attribute에 존재하며 ‘dropped’ 상태
2. 수동 테이블 재작성
컬럼 DROP과 GDPR '잊혀질 권리' 문제
주의사항
- PostgreSQL은 MVCC 방식이기 때문에, 행 삭제 후에도 VACUUM이 완료되기 전까지 데이터가 남아있음
- 운영체제 레벨에서도 물리적 삭제가 아닌 "삭제 플래그" 처리일 수 있음
- 법적으로는 “합리적인 삭제 노력”이 중요하며, 물리 디스크를 완전히 지우는 수준은 대부분 요구되지 않음
결론: DROP COLUMN은 “숨기기”일 뿐 “삭제”가 아님
- 성능을 위한 설계지만, 컬럼이 쌓이면 1600개 제한에 걸릴 수 있음
- 필요한 경우
VACUUM FULL 또는 테이블 재작성으로 데이터 정리 필요
- 시스템 설계나 컴플라이언스 관점에서 PostgreSQL의 내부 동작 이해는 매우 유용
참고 자료