본문 바로가기
파일 형식 백과사전

기록을 지웠는데 db 파일 크기가 1바이트도 안 줄었습니다

by 무나주 2026. 9. 27.

메신저나 가계부 같은 앱이 만든 .db 파일이 무거워져서 오래된 기록을 한 번에 지웠다고 해 보겠습니다. 그런데 파일 속성을 다시 열어 보면 크기가 조금도 변하지 않았습니다.

삭제가 실패한 것은 아닙니다. SQLite는 파일을 고정 크기 페이지로 잘라 쓰고, 삭제는 그 페이지의 내용만 비울 뿐 페이지 자체를 파일에서 떼어내지 않습니다. 같은 파일 하나를 단계마다 다시 재고 안쪽 페이지 상태까지 읽어 확인했습니다.

 

SQLite 파일 크기 단계별 실측 표. 30,000행을 넣으면 3,014,656바이트가 되고 빈 페이지는 0장이다. 27,000행을 지워도 크기는 3,014,656바이트로 100.0% 그대로이고 빈 페이지만 660장 생긴다. 지운 자리에 다시 27,000행을 넣어도 여전히 3,014,656바이트이고 빈 페이지는 0장으로 돌아간다. 다시 지우고 VACUUM을 걸면 311,296바이트, 처음의 10.3%로 줄어든다. 측정 환경은 윈도우 11, 파이썬 3.14.6, sqlite3 3.50.4

 

세 번을 재는 동안 숫자가 하나도 안 움직였습니다

주문 기록 3만 행을 넣은 db 파일로 시작했습니다. 이 파일은 3,014,656바이트이고, 4,096바이트짜리 페이지 736장으로 이루어져 있습니다.

단계 남은 행 파일 크기 빈 페이지
3만 행 넣고 저장 30,000 3,014,656 B 0장
2만 7천 행 삭제 3,000 3,014,656 B 660장
지운 자리에 다시 넣기 30,000 3,014,656 B 0장
다시 지우고 VACUUM 3,000 311,296 B 0장

90%를 지웠는데 크기가 1바이트도 안 변했습니다. 대신 빈 페이지가 660장 생겼습니다. 지운 자리가 파일 안에 빈칸으로 남아 있다는 뜻입니다.


그 빈칸은 버려지는 것이 아닙니다

표의 세 번째 줄이 이 구조의 핵심입니다. 지운 자리에 새 기록 2만 7천 건을 다시 넣었더니, 파일은 여전히 3,014,656바이트였고 빈 페이지 수는 660장에서 0장으로 돌아갔습니다.

새 공간을 요구하지 않고 비어 있던 페이지를 그대로 재활용한 것입니다. 앱이 기록을 계속 쌓고 지우기를 반복하는 동안 파일이 무한정 커지지 않는 이유가 여기에 있습니다. 파일 크기는 그 앱이 지금까지 한 번에 가장 많이 담았던 양을 기억하는 눈금에 가깝습니다.

정말 줄이고 싶을 때 쓰는 한 줄

빈칸을 실제로 걷어내려면 파일을 처음부터 다시 쓰라고 지시해야 합니다. VACUUM이 그 명령입니다. 아래는 파일 상태를 먼저 확인하고 정리까지 하는 코드입니다.

import os, sqlite3

db = r"C:\경로\app.db"
con = sqlite3.connect(db)
size = os.path.getsize(db)
free = con.execute("PRAGMA freelist_count").fetchone()[0]
page = con.execute("PRAGMA page_size").fetchone()[0]
print(f"{size:,} 바이트 중 빈칸 {free * page:,} 바이트")

con.execute("VACUUM")
con.close()
print(f"정리 후 {os.path.getsize(db):,} 바이트")

빈 페이지 수에 페이지 크기를 곱하면 되찾을 수 있는 양이 바로 나옵니다. 위 실측에서는 660장 곱하기 4,096바이트로 2,703,360바이트였고, VACUUM 뒤 실제로 그만큼이 사라졌습니다.

어떤 파일이 여기에 해당하나

확장자가 .db 나 .sqlite 인 파일이 대개 이 구조입니다. 메모장 앱, 가계부, 메신저, 브라우저가 기록을 담아 두는 파일이 흔히 여기에 속합니다. 이름은 제각각이라 확장자만으로 단정하기는 어렵고, 앞에서 쓴 코드가 오류 없이 열린다면 SQLite 파일이 맞습니다.

파일 옆에 같은 이름의 -wal 이나 -shm 파일이 함께 보인다면 그 앱이 지금 이 db 를 쓰고 있다는 뜻입니다. 그 상태에서 정리를 시도하면 잠겨 있다는 오류가 납니다. 앱을 완전히 닫은 뒤에 해야 합니다.

주의할 점 하나

VACUUM은 임시로 같은 크기의 파일을 하나 더 만들었다가 바꿔치우는 방식입니다. 디스크에 원본만큼의 여유가 없으면 실패하고, 실행 중에는 그 db를 쓰는 앱을 닫아 두어야 합니다. 앱이 쓰고 있는 파일을 다루기 전에 db 파일 안을 먼저 들여다보는 방법으로 무엇이 들었는지 확인해 두면 안전합니다. CSV를 db로 옮겨 쓰는 경우라면 SQLite에 불러와 조회하는 쪽이 함께 참고가 됩니다.

 

파일 크기가 안 줄었다고 삭제를 다시 누를 필요는 없습니다. 지워진 것은 지워졌고, 남은 것은 빈칸을 언제 걷어낼지 정하는 일뿐입니다.

 

위 크기와 페이지 수는 윈도우 11에서 파이썬 3.14.6의 표준 라이브러리 sqlite3 3.50.4로 db 파일 하나를 만들어 단계마다 다시 잰 값입니다. 페이지 크기는 기본값 4,096바이트였고, 행 개수와 문자열 길이가 다르면 절대 크기는 달라집니다.