首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite3 .backup和.dump命令是否锁定数据库?

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

Stack Overflow用户
提问于 2017-01-19 22:30:37
回答 2查看 4.7K关注 0票数 10

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

代码语言:javascript
复制
.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",但我对它不感兴趣,我只想备份数据库。

EN

回答 2

Stack Overflow用户

发布于 2017-01-19 23:37:53

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

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

票数 9
EN

Stack Overflow用户

发布于 2017-01-19 22:58:58

Online Backup page实际上是最好的资源,因为.backup使用在线备份API。您可以检查shell's source本身:

代码语言:javascript
复制
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个页面。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41744297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档