2

5 分間隔で実行される cronjob から 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;、私はめちゃくちゃです。

何か案は?sqlite3 .backupところで、と 古き良きの違いは何cp mydb.sqlite mybackup.sqliteですか?

[編集]私は組み込みシステムで nodejs を実行しているので、誰かが Ruby ラッパーを使用したsqlite オンライン バックアップ APIを提案したとしても、チャンスはありません ;(

4

2 に答える 2

3

バックアップ API を使用できない場合は、別のメカニズムを使用して、コピー中にデータベース ファイルが変更されないようにする必要があります。

BEGIN IMMEDIATEでトランザクションを開始します。

BEGIN IMMEDIATE の後、他のデータベース接続は、データベースに書き込んだり、BEGIN IMMEDIATE または BEGIN EXCLUSIVE を実行したりできなくなります。ただし、他のプロセスはデータベースからの読み取りを続行できます。

于 2013-04-19T19:20:37.957 に答える