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

何时可以安全地复制当前打开的SQLite数据文件?

段干博明
2023-03-14

我有一个应用程序,它在本地文件系统的一个文件上使用带有QSQLDatabase的QSQLITE驱动程序。我想写一个备份函数来保存数据库的快照。

简单地复制文件似乎是一种显而易见的简单方法,但我不确定什么时候这样做是安全的。

应用程序在定义良好的点修改数据库。每次都会创建、使用并立即销毁一个新的QSqlQuery对象。显式锁定/刷新是一种可接受的解决方案,但qtapi似乎没有公开这一点。

当Qt将数据库提交到磁盘时,我找不到任何留档。我想QSqlDatabase析构函数会这样做,但即使这样,我也不知道(在视窗或Linux上)复制文件是否保证会导致最近的更改被复制(相对于,比如说,只有那些已在文件系统日志中完成)。有人能证实或否认这一点吗?如果在执行副本之前关闭写入文件句柄,会有什么不同吗?

也许唯一安全的方法是在线复制,但我已经在使用Qt应用编程接口,不知道这将如何交互。

如有任何建议,将不胜感激。

共有2个答案

督灿
2023-03-14

这与Qt关系不大。它与数据库相关。此过程将适用于任何符合ACID的数据库,SQLite就是其中之一。

从…起http://www.sqlite.org/transactional.html

SQLite是事务性的

事务性数据库是一个所有更改和查询都显示为原子、一致、隔离和持久(ACID)的数据库。SQLite实现原子、一致、隔离和持久的可序列化事务,即使事务因程序崩溃、操作系统崩溃或计算机断电而中断。

这并不意味着你可以复制文件,它将是一致的。在复制之前,您可能应该为此使用块级快照。如果你正在使用Linux,读这个,

http://tldp.org/HOWTO/LVM-HOWTO/snapshotintro.html

那么程序就是,,

  1. 快照
  2. 将数据库从快照复制到备份设备
  3. 删除快照卷

快照是文件系统的全局“冻结”,这是一致的,因为ACID。文件复制是线性操作,如果在复制期间不停止所有数据库操作,就不能保证一致。这意味着直接复制对于在线数据库(通常)是不安全的。

武成和
2023-03-14

复制SQLite数据库很简单,但以不损坏它的方式进行复制就不那么简单了。这将为您提供一个良好的干净备份,确保备份处于正确的状态,因为在复制过程中途写入数据库是不可能的。

QSqlQuery qry(db);
qry.prepare( "BEGIN IMMEDIATE;");
qry.exec();

QFile::copy(databaseName, destination);

qry.prepare( "ROLLBACK;");
qry.exec();

在BEGIN IMMEDIATE之后,没有其他数据库连接能够写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE。

 类似资料:
  • 问题内容: 我目前正在编写一个小脚本,供在使用Python的一台服务器上使用。该服务器仅安装了Python 2.4.4。 直到2.5版本问世,我才开始使用Python,所以我习惯了这种形式: 但是,在2.5之前没有声明,而且我很难找到有关手动清理文件对象的正确方法的示例。 使用旧版本的python时安全处置文件对象的最佳实践是什么? 问题答案: 参见docs.python.org: 处理完文件后,

  • 我用的是Android平板,上面有Xamarin/C#应用。我试图用这款平板电脑访问驻留在我的Windows 10机器上的SQLite数据库。我选择使用USB/Android而不是Android模拟器,应用程序仍然驻留在Windows 10机器上。这似乎无关紧要,但我也尝试过映射驱动器、共享文件夹和创建网络连接。项目参考 这是代码: 命名空间CicoAndroid{公共部分类MainPage: C

  • 我的代码在Android2.3上运行良好,但我不知道为什么在Android4.2上不运行 我的异常日志在这里 我的mainactivity.java 我的DatabaseHelper.java

  • 问题内容: 我在测试一些CSS3东西时,发现有些属性不再需要供应商前缀(至少在最新的浏览器中)。 我的下一个网站只会定位到最新的浏览器,例如IE9 / Chrome 15 + / FF8 +,因此我想知道: 是否有当前CSS3属性的列表,在其中我可以安全地删除供应商前缀? 注意:我对自动插入带前缀属性的JS hack不感兴趣。 问题答案: 我什么时候可以使用…包含浏览器支持表,其中带有方便的指示符

  • 问题内容: 能后可重复使用被称为? 这play.golang.org/p/QLsvA-b4Ae按预期运行,但它保证是安全的吗?文档没有这么说,但也许我只是偏执。 问题答案: 是的,这很安全。实际上,它比这更安全。您可以同时从多个goroutine中进行选择,并可以根据您的用例进行适当的互换和调用。只要发生在之前,您就应该是安全的。 出于好奇,现在使用互斥锁,两个int32s计数器和一个信号量来实现

  • 问题内容: 在 SQLite 3* 命令行工具中将其附加到命令后,可以使用哪种 SQL 列出表以及这些表中的行在 SQLite 数据库文件中? * 问题答案: 在和“辅助”功能不考虑附加的数据库:他们只是查询表“主”数据库。因此,如果您使用 那你需要做 请注意,临时表都不会显示:您必须为此列出: