我所能找到的关于.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",但我对它不感兴趣,我只想备份数据库。
发布于 2017-01-19 23:37:53
.dump命令只是在一个事务内使用一组SELECT语句读取整个数据库。此事务自动锁定数据库以进行写入,但允许并发读取。
.backup命令与SQL无关;它将数据库页直接复制到一个新文件中。所有页面读取都通过正常机制来访问数据库文件,并包装在一个事务中。当使用多个sqlite3_backup_step()调用时,事务将结束,以允许其他连接访问数据库,但会检测到任何更改,在这种情况下,整个备份将自动重新启动。
发布于 2017-01-19 22:58:58
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脚本。
https://stackoverflow.com/questions/41744297
复制相似问题