2013-04-19 6 views
1

5 분 간격으로 실행되는 cronjob에서 sqlite 데이터베이스를 백업하려고합니다. 데이터베이스는 "라이브"이므로 백업을 수행 할 때 실행중인 쿼리가 있습니다.SQLite 백업 전략

제가 백업에 의존 할 수 있도록 데이터베이스를 백업 할 때 올바른 모양인지 확인하고 싶습니다. (의사의)

나의 현재 전략 : 이제

function backup() 
{ 
    #try to acquire the lock for 2 seconds, then check the database integrity 
    sqlite3 mydb.sqlite '.timeout 2000' 'PRAGMA integrity_check;' 
    if (integrity is ok and database was not locked) 
    { 
     #perform the backup to backup.sqlite 
     sqlite3 mydb.sqlite '.timeout 2000' '.backup backup.sqlite' 

     if (backup could be performed) 
     { 
      #Check the consistency of the backup database 
      sqlite3 backup.sqlite 'PRAGMA integrity_check;' 
      if (ok) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

, 내 전략과 몇 가지 문제가 있습니다 : 라이브 데이터베이스가 잠겨있는 경우

  • , 나는이 문제에 실행 내가 때문에 그러면 백업을 수행 할 수 없습니다. 어쩌면 거래가 도움이 될 수 있을까요?
  • PRAGMA integrity_check;과 백업간에 문제가 발생하면 나는 해결할 수 없습니다.

아이디어가 있으십니까? 그리고 그런데 과 좋은 오래된 cp mydb.sqlite mybackup.sqlite의 차이점은 무엇입니까?

[편집] 사람이 어떤 루비 래퍼로 sqlite online backup api 제안 그래서 만약 내가, 임베디드 시스템에 nodejs를 실행 해요 - 아니 기회를 (

답변

1

백업 API를 사용할 수없는 경우 다른 메커니즘을 사용하여 복사하는 동안 데이터베이스 파일이 수정되지 않도록해야합니다.

BEGIN IMMEDIATE으로 거래를 시작

: A는 IMMEDIATE BEGIN

후, 다른 데이터베이스 연결은 데이터베이스에 기록 또는 즉시 시작하거나 배타적 BEGIN 할 수 없습니다. 그러나 다른 프로세스는 데이터베이스에서 계속 읽을 수 있습니다.

3

쿼리를 실행하는 동안 백업 할 경우에 필요 백업 API를 사용하십시오. The documentation에는 실행중인 데이터베이스의 온라인 백업에 대한 예제가 있습니다 (예제 2). Ruby 참조를 이해할 수 없으며 프로그램에 통합하거나 작은 C 프로그램으로 실행합니다 실제 응용 프로그램 - 나는 두 가지 모두를 수행했습니다.

백업의 명시 적 integrity_check은 과도합니다. 백업 API는 대상 데이터베이스가 일관되고 최신 상태인지 확인합니다. (그 동전의이면은 백업이 실행되는 동안 DB를 너무 자주 업데이트하면 백업이 완료되지 않을 수도 있다는 것입니다.)

'cp'를 사용하여 백업을 만들 수 있지만 실행중인 데이터베이스. 백업의 전체 기간 동안 독점적 인 잠금 장치가 있어야하므로 실제로 '라이브'가 아닙니다. 또한 sqlite의 임시 파일과 주 데이터베이스를 모두 복사하는 데주의해야합니다.

sqlite3 ".backup"명령이 백업 API를 사용하기를 기대합니다.