오늘 오전부터 SVN에서 커밋 진행 하면 오류가 나오기 시작 했다. 오류 메세지는 쌩뚱 맞게 ..


Commit failed (datails follow)

 database disk image is malformed 


cleanup 부터 온갖 방법으로 해결을 도모 하였으나, 오류 메세지는 꿈쩍도 하지 않았다.


확인을 해보니 SVN에서 SQLite 를 이용하는데, 이 SQLite 에서 어떤 이유에서인지 table이 깨진 경우 이런 결과가 나온다. SVN에서 서버의 rep-cache.db 파일을 SQLite로 관리를 진행 하고 있으므로, 그 DB 안의 어떤 Table이 오류가 난 것..


해결 방법을 한참을 고민하다가 이렇게 접근을 시작했다.


머너 sqlite3 콘솔을 다운로드 받고 ( http://www.sqlite.org/ ) db 파일을 읽어본다.


커맨드창에서 아래의 명령을 입력 했을때 해당 DB의 무결성 검사를 진행 하게 된다. 만약 여기서 Ok 가 뜨지 않는다면, 해당 DB 파일에 문제가 있는 것이다.


sqlite3  rep-cache.db  "pragma integrity_check"


명령을 진행 하고, 오류가 발견 될 경우 database disk image is malformed  와 같은 오류 메세지가 다시 출력 된다. 그때 조금 저 자세한 정보(?)를 포함하고 오류를 뱉어낸다.


어떤 Table 에서 오류가 발생 했는지 확인 하기 위해서는 sqlite3에서 일일이 테이블을 확인 해봐야 한다. 


SQL로 select * [table] 등으로 진행 해보면 됨. 



해결 방법으로는 여러 방법이 있다. SVN일 경우 제일 빠르고 좋은 해결 방법은 그냥 rep-cache.db 파일을 삭제 하는 것이다. 삭제 하면 SVN이 사용시마다 자동으로 재 생성해서 만든다. 오류가 해결! 최고의 방법이었다 :)



SVN이 아닌 보존 해야 하는 데이터라면, SQLite에서 해당 table을 export 하고 다시 다른 db 파일을 생성해서 import 하는 방법이 있다. 이 경우 테이블 내에 있는 오류난 데이터는 복구 못할 가능성도 있다. 


커맨드 창에서 아래의 방법으로 복구 하면 된다.


sqlite3  [db 파일]


sqlite3> .mode insert

sqlite3> .output [export 후 저장 파일명].sql

sqlite3> .dump


해당 명령으로 [export 후 저장 파일명].sql 파일로 스크립트를 export 하고 이후에 아래 명령을 진행 하면 새 [new db 파일] 이 생성 된다.


sqlite3 [new db 파일]


sqlite3> .read [export 후 저장 파일명].sql


그리고 .exit 명령으로 나와서 해당 db를 이용하면 끝~!




posted by Yuno.org