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

spr*_*aff 3 sqlite qt

我有一个应用程序,它使用QSQLITE驱动程序和本地文件系统上的文件上的QSqlDatabse.我想写一个备份函数,它将保存数据库的快照.

简单地复制文件似乎是一种明显,简单的方法,但我不确定何时这样做是安全的.

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

我在Qt将数据库提交到磁盘时找不到任何文档.我想QSqlDatabase析构函数会这样做,但即便如此,我也不知道(在Windows或Linux上)复制文件是否保证会导致最近的更改被复制(而不是仅仅是那些更改)已在文件系统期刊中定稿).有人可以确认或否认吗?如果在执行复制之前关闭写文件句柄会有什么不同吗?

也许唯一安全的方法是进行在线复制,但我已经在使用Qt API而不知道这将如何互动.

任何意见,将不胜感激.

Nej*_*jat 5

复制一个SQLite数据库是微不足道的,但以一种不会破坏它的方式执行此操作并不是一件容易的事.这将为您提供一个很好的干净备份,确保处于正确的状态,因为在复制过程的中途写入数据库是不可能的.

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

QFile::copy(databaseName, destination);

qry.prepare( "ROLLBACK;");
qry.exec();
Run Code Online (Sandbox Code Playgroud)

在BEGIN IMMEDIATE之后,没有其他数据库连接可以写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE.