Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

SQLite “database disk image is malformed”? 복구 전에 원본부터 보존하세요

SQLITE_CORRUPT를 preservation incident로 다루세요. writers를 중지하고 journal/WAL과 DB를 함께 보존해 read-only copy를 hash한 뒤 새 파일로만 recover하고 검증합니다.

SQLite “database disk image is malformed”? 복구 전에 원본부터 보존하세요
원본 기술 일러스트: evidence and working-copy boundary. Watch at Ease

SQLITE_CORRUPT를 preservation incident로 다루세요. writers를 중지하고 journal/WAL과 DB를 함께 보존해 read-only copy를 hash한 뒤 새 파일로만 recover하고 검증합니다.

import 성공은 SQL 실행 증거일 뿐 모든 recovered value의 정확성을 증명하지 않습니다.

1. 변경 중지와 정확한 files 확인

application과 모든 writers를 중지하고 resolved path, SQLite library/CLI version, size, timestamp, 첫 전체 error를 기록합니다. 유일한 copy에 VACUUM, REINDEX, write pragma를 실행하지 마세요.

rollback journal/WAL 사용 시 matching -journal, -wal, -shm을 DB와 함께 보존합니다. hot journal/WAL 분리는 automatic recovery를 방해합니다.

2. evidence와 working copies 생성

original set을 hash하고 read-only로 두며 recovery는 별도 working copy에서만 합니다. 일반 file copy는 writers 중지 후에만 안전하고 live healthy DB에는 backup API, VACUUM INTO, sqlite3_rsync를 씁니다.

untouched evidence를 남기고 command, tool version, output filename을 기록합니다. partial success로 original을 덮지 말고 storage failure 의심 시 device evidence를 먼저 보존합니다.

3. copy 진단, repair 약속 금지

working copy에서 PRAGMA integrity_check를 실행해 모든 rows를 저장합니다. structure, missing/duplicate pages, 여러 constraints를 검사하지만 foreign keys는 foreign_key_check가 필요합니다.

다른 copy의 ok가 original 정상 증명은 아닙니다. 실제 file, schema, page count, critical tables를 확인하고 I/O error와 SQLITE_CORRUPT를 분리합니다.

4. backup restore 우선, 그다음 salvage

known-good backup을 먼저 검증합니다. 없다면 working copy에 .recover를 실행해 SQL을 새 file로 저장하고 또 다른 새 DB에 import합니다. original을 덮지 마세요.

Recovery는 salvage입니다. deleted rows가 되살아나거나 values가 바뀌고 constraints가 깨지며 lost_and_found가 생길 수 있습니다. .recover가 더 많이 구해도 정확성을 보장하지 않습니다.

5. service 복귀 전 검증

recovered DB에서 integrity_check, foreign_key_check, UNIQUE/CHECK, row counts, relationships, balances, critical totals, lost_and_found를 검토합니다.

application test 뒤 새 backup과 rollback plan으로 전환합니다. original evidence를 유지하고 data loss를 기록하며 unsafe copy, journal separation, filesystem, rogue write를 조사합니다.

SQLite “database disk image is malformed”? 복구 전에 원본부터 보존하세요
원본 기술 일러스트: recovered-file validation and return-to-service boundary. Watch at Ease