← 홈Setup Tip

Setup Tip

Setup Tip — 빈 파일도 무결성 검사를 통과한다

백업에서 복원하기 전에 무결성 검사를 돌리는 것만으로는 부족하다. 0바이트 파일은 형식상 유효한 빈 데이터베이스이고, 검사는 거기에 ok를 돌려준다. 구조가 온전한지와 내용이 존재하는지는 다른 질문이며, 복원 게이트는 둘 다 물어야 한다.

문제

자동 백업에서 복원하는 경로에는 거의 항상 게이트가 하나 붙는다. 망가진 파일을 살아 있는 데이터 위에 덮어쓰지 않기 위해서다. 가장 자연스러운 선택은 엔진이 제공하는 무결성 검사를 돌리고 ok가 나오면 진행하는 것이다. 이 게이트는 실제로 손상된 파일을 잡아낸다. 문제는 가장 흔한 사고 형태, 즉 아무것도 들어 있지 않은 백업 파일을 그대로 통과시킨다는 데 있다.

빈 파일은 유효한 데이터베이스다

길이가 0인 파일을 열면 엔진은 이를 손상으로 보지 않는다. 아직 페이지가 하나도 없는 새 데이터베이스로 간주하고 정상적으로 연다. 그 상태에서 무결성 검사를 돌리면 검사할 페이지가 없으므로 위반도 없고, 결과는 ok다. 백업 작업이 디스크가 꽉 차서 중간에 죽었든, 잘못된 경로를 가리켰든, 스냅샷이 시작만 하고 끝나지 않았든, 남는 산출물의 형태는 똑같다. 게이트 입장에서 이 파일은 완벽하게 건강하다.

검사는 구조를 보지 내용을 보지 않는다

무결성 검사가 답하는 질문은 "이 파일의 페이지와 인덱스가 자기 자신과 일관적인가"이다. "이 파일이 내가 잃어버린 데이터를 담고 있는가"가 아니다. 두 질문은 자주 함께 참이기 때문에 하나가 다른 하나를 대신할 수 있다고 착각하기 쉽다. 복원은 정확히 둘이 갈라지는 순간에 실행되는 작업이다. 그래서 복원 게이트는 검증 도구의 계약을 읽고, 그 도구가 답하지 않는 질문을 따로 물어야 한다.

복원 전에 무엇을 확인할 것인가

최소 네 가지를 순서대로 확인한다. 첫째, 파일 크기와 페이지 수가 0보다 큰가. 둘째, 기대하는 스키마 객체가 실제로 존재하는가. 셋째, 핵심 테이블의 행 수가 미리 정해 둔 하한 이상인가. 넷째, 실제 읽기 질의 하나가 그럴듯한 값을 돌려주는가. 이 검사는 원본 위가 아니라 복사본 위에서 수행하고, 통과한 뒤에야 파일을 교체한다. 교체 대상 파일은 지우지 말고 옆으로 옮겨 둔다. 되돌릴 경로가 없는 복원은 복원이 아니라 두 번째 사고다.

픽스처는 진짜 산출물이어야 한다

이 게이트를 테스트할 때 헤더 몇 바이트만 흉내 낸 가짜 파일을 픽스처로 쓰면, 나중에 진짜 검증이 추가되는 순간 그 테스트가 먼저 깨진다. 더 나쁜 경우에는 깨지지 않고, 게이트가 실제로는 통과시키지 않을 입력을 통과시킨다고 주장한다. 픽스처는 실제 엔진으로 만든 진짜 파일이어야 한다. 정상 백업 하나, 0바이트 하나, 중간에서 잘린 것 하나, 스키마는 맞지만 비어 있는 것 하나. 네 개를 모두 만들어 두면 이 결함군 전체가 한 번에 고정된다.

회귀를 고정한다

고친 다음에는 사고 모양 그 자체를 테스트로 남긴다. 길이 0인 백업 파일을 복원 경로에 넣었을 때 거부되어야 하고, 거부 사유가 "무결성 실패"가 아니라 "내용 없음"으로 구분되어 기록되어야 한다. 이 구분이 없으면 다음 사람은 같은 알람을 보고 엉뚱한 곳을 디버깅한다. 알람 문구까지가 테스트 범위다.

완료 기준

복원 게이트가 무결성과 존재 여부를 각각 독립적으로 검사하고, 빈 백업이 명시적 사유와 함께 거부되며, 픽스처가 손으로 만든 바이트가 아니라 실제 엔진 산출물이고, 교체된 원본이 되돌릴 수 있는 위치에 남아 있을 때 완료다. 그 전까지 이 게이트는 백업이 존재한다는 사실만 확인해 주고 있다.