当前位置: 首页 > 知识库问答 >
问题:

SQLite3。备份和。转储命令是否锁定数据库?

郁高韵
2023-03-14

我能找到的关于的唯一留档。备份。转储是由. 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.

最大的问题是:在复制/转储之前,这两个命令是否都会锁定数据库?备份是否一致?

这个答案有一些关于的信息。备份,但是有权威的留档吗?(那么、转储呢?)我能在SQLite的留档中找到的唯一东西是“在线备份应用编程接口”,但我对应用编程接口不感兴趣,我只想备份数据库。

共有2个答案

姜飞飙
2023-03-14

联机备份页实际上是最好的资源,因为。备份使用联机备份API。您可以检查shell的源代码本身:

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\u备份\u步骤

对sqlite3\u backup\u step()的每次调用都会在源数据库上获得一个共享锁,该锁将在sqlite3\u backup\u step()调用期间持续。

shell中的sqlite3\u backup\u步骤(pBackup,100)调用一次最多读取100页。

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

谈琦
2023-03-14

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

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

 类似资料:
  • 作为 Linux 系统管理员,最经常使用的备份工具就是 tar 和 cpio 命令。前面在介绍备份介质时,已经使用了 tar 命令,此命令其实是一个文件打包命令,经常在备份文件的场合中使用。 使用 cpio 命令进行数据备份,请阅读《Linux提取RPM包文件(cpio命令)》。 有关 tar 命令的基本用法,请阅读《 Linux tar压缩命令》一节,这里不再过多赘述。下面通过 tar 命令做的

  • 我正在尝试使用sqlite3命令,按照本SO答案给出的方式执行https://stackoverflow.com/a/25684912/426853. 以下操作始终在命令行中起作用: 我将其编码为Go,如下所示: 我有一个测试文件,像这样调用它: 测试报告了来自sqlite3的语法错误。 我怀疑问题出在将参数传递给shell,问题在于调用。我试着把它改成 但结果是一样的。我还尝试将放在命令前面,即

  • 问题内容: 我有一个数据库应用程序。我想使用Java中的命令创建文件。 如果我使用Prepared语句执行它: 然后,如何才能在单个String中获得整个结果。我是Java新手,因此无法找到获取该查询结果的出路,因为它不包含列名。 然后我将使用写入文件。 问题答案: 如果要将实例的内容作为 SQL脚本* 备份 到文件中,则可以直接使用。 * 如果要将其 备份 为 ZIP存档 ,则可以使用。

  • 问题内容: 我想避免mysqldump,因为它以仅便于mysql读取的形式输出。CSV似乎更通用(每个表一个文件就可以了)。但是,如果mysqldump有优势,我会很高兴。另外,我希望可以从命令行(linux)运行某些内容。如果那是mysql脚本,那么指向如何制作此类内容的指针将很有帮助。 问题答案: 如果您一次可以处理表,并且您的数据不是二进制数据,请使用命令选项。使用此选项,它将生成TSV(制

  • 问题内容: 我有一个带有数据库的应用程序。我想使用Java中的命令创建文件。 如果我使用Prepared语句执行它: 然后,如何才能在单个String中获得整个结果。我是Java的新手,因此无法找到获取该查询结果的出路,因为它不包含列名。 然后,我将使用写入文件。 问题答案: 如果要将实例的内容作为 SQL脚本* 备份 到文件中,则可以直接使用。 * 如果要将其 备份 为 ZIP存档 ,则可以使用

  • 问题内容: 我正在编写一个使用本地SQL数据库存储数据的程序。 我正在使用在这里找到的驱动程序:https : //bitbucket.org/xerial/sqlite-jdbc 我试图从数据库中读取并将tableName的内容放入这样的JTable中: 然后,稍后我尝试返回并向表中添加一行: 然后,我想用新行更新之前创建的JTable。 但是,当我尝试添加行时会导致异常: 指向这一行: …在a