2017-01-19 19 views
0

私はおよそ.backup.dumpを見つけることができました唯一のドキュメントは.helpで示されるものである:SQLite3の.backupおよび.dumpコマンドはデータベースをロックしますか?

.backup ?DB? FILE  Backup DB (default "main") to FILE 
.dump ?TABLE? ...  Dump the database in an SQL text format 
         If TABLE specified, only dump tables matching 
         LIKE pattern TABLE. 

大きな問題は次のとおりです。両方のこれらのコマンドは、ダンプ/コピーする前に、データベースをロックしますか?バックアップは一貫していますか?

This answerには.backupに関する情報がありますが、そこには信頼できるドキュメントがありますか? (そして.dumpについては?)私がSQLiteのドキュメントで見つけた唯一のことは、 "Online Backup API"ですが、私はAPIに興味がありません。データベースをバックアップしたいだけです。

答えて

0

.backupはOnline Backup APIを使用しているため、実際にはOnline Backup pageが最適なリソースです。あなたはshell's source自体をチェックすることができます。

pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 
if(pBackup==0){ 
    utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 
    sqlite3_close(pDest); 
    return 1; 
} 
while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK){} 
sqlite3_backup_finish(pBackup); 

ドキュメントが言うように:

ソースデータベースは、一度ときにそれを短期間のため、コピーの期間のためにロックする必要はありません。実際には読んでいる。

と、sqlite3_backup_stepにsqlite3_backup_step

からのすべての呼び出しは()sqlite3_backup_step()呼び出しの期間続く、ソース・データベースに対する共有ロックを取得します。

シェル内のsqlite3_backup_step(pBackup,100)コールでは、一度に100ページを読み込みます。

CLI (shell) documentationは、実際には元のデータベースを再作成するために使用されるSQLスクリプトだと説明しています。

0

.dumpコマンドは、トランザクション内で一連のSELECT文を使用してデータベース全体を読み取るだけです。このトランザクションは自動的にデータベースを書き込み用にロックしますが、同時読み取りを許可します。

.backupコマンドはSQLを気にしません。データベースページを新しいファイルに直接コピーします。すべてのページ読み取りは、通常のメカニズムを介してデータベースファイルにアクセスし、トランザクション内でラップされます。複数のコールを使用すると、トランザクションは終了し、他の接続がDBにアクセスできますが、変更が検出されます。この場合、バックアップ全体が自動的に再開されます。

関連する問題