2011-01-09 3 views
3

나는 어떤 식 으로든 SQLite 데이터베이스 파일이 업데이트되었는지 여부를 알 수 있기를 원합니다. 어떻게 구현할 것인가?SQLite 데이터베이스의 체크섬?

내가 생각하는 첫 번째 솔루션은 체크섬을 비교하는 것이지만 체크섬을 사용하는 데 실제로 경험이 없습니다.

답변

1

데이터베이스의 크기에 따라 체크섬을 지속적으로 폴링하고 생성하는 작업이 컴퓨터에 너무 집중적 일 수 있습니다.

OS 파일 시스템에 저장된 마지막으로 수정 된 메타 데이터를 모니터링하는 것이 좋습니다.

6

http://www.sqlite.org/fileformat.html에 따르면 SQLite3은 데이터베이스 파일의 24..27 바이트에 file change counter을 유지 관리합니다. 그것은 예를 들어, 아무것도 전혀 변경되지 동안 복원하거나 롤백 진 후 변경, 파일 변경 시간의 독립적 인 :

$ sqlite3 test.sqlite 'create table test (test)' 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000001 
$ sqlite3 test.sqlite "insert into test values ('hello world');" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000002 
$ sqlite3 test.sqlite "delete from test;" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000003 
$ sqlite3 test.sqlite "begin exclusive; insert into test values (1); rollback;" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000003 

두 개의 데이터베이스 파일이 "동일"입니다 정말 확실히 당신은 할 수 있습니다 파일을 덤프 (.dump) 한 후 출력을 INSERT 문으로 줄이고 그 결과를 비교 (아마도 암호로 안전한 체크섬에 의해)하기 위해 정렬하십시오. 그러나 그것은 평범한 과잉이다.

+0

+1은 내가 생각하지 못했던 방식으로 od를 사용합니다. –

+0

감사합니다. BTW'sed | tr' 구조는'awk '를 읽도록 "최적화"될 수 있습니다 NR == 1 {print $ 2 $ 3 $ 4 $ 5}'' – Tino

1

sqlite 데이터베이스 중 하나가 사본으로 만 사용되는 경우 (읽기 전용) 사본을 업데이트 할 수 있도록 원본 데이터베이스 파일이 업데이트되었는지 확인하려는 경우 (예 : 웹에서 다운로드하지 않고도) 원본 파일과 다르지 않은 경우 원래 파일) 데이터베이스 파일의 첫 번째 100 바이트를 비교할 수 있습니다 http://www.sqlite.org/fileformat.html

데이터베이스 헤더의 바이트 24..27에 대해 SQlite doc은 다음과 같이 말합니다.

24..27 4
파일 변경 카운터. 데이터베이스 트랜잭션이 커밋 될 때마다이 필드에 저장된 32 비트 부호없는 정수 값이 증가합니다.

데이터베이스 트랜잭션이 커밋 될 때 파일 변경 카운터가 증가하지 않지만 select 문을 포함합니다. select 문은 트랜잭션에서 선택을 래핑하고 트랜잭션을 끝내기 위해 커밋하는 경우에 원하는 동작입니다.

관련 문제