SQLite3 .backup和.dump命令是否锁定数据库?

时间:2017-01-19 14:30:37

标签: sqlite

我能找到的关于.backup.dump的唯一文档是.help显示的文档:

.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不感兴趣,我只想备份数据库。

2 个答案:

答案 0 :(得分:0)

Online Backup page实际上是最好的资源,因为.backup使用在线备份API。您可以查看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()调用的持续时间。

shell中的sqlite3_backup_step(pBackup,100)调用一次最多可读取100页。

.dump CLI (shell) documentation解释说它实际上是一个用于重新创建原始数据库的SQL脚本。

答案 1 :(得分:0)

.dump命令只是在事务中用一堆SELECT语句读取整个数据库。此事务自动锁定数据库以进行写入,但允许并发读取。

.backup命令不会打扰SQL;它将数据库页面直接复制到新文件。所有页面读取都通过正常的机制来访问数据库文件,并包含在事务中。使用多个sqlite3_backup_step()调用时,事务结束以允许其他连接访问数据库,但检测到任何更改,在这种情况下,将自动重新启动整个备份。