如果使用预先写入事务的SQLite数据库因未检查点的事务而中断(由于电源故障或其他原因),然后在缺少临时-wal文件的情况下重新打开,数据库将完全打开到其状态最后一个检查点,还是会以某种方式被破坏?
我们正试图让SQLite与iCloud合作(是的,我们知道你不应该这样做,但我们也制作了一个Windows和一个Android应用,需要一个跨平台的数据库解决方案),我们认为WAL提供了一种避免必须维护我们数据库的两个副本的潜在方法 - 我们将-wal文件保留在iCloud之外,但将主数据库存储在其中,从而避免了iCloud备份回滚期刊(或备份)的问题数据库中期没有这些期刊的数据库。)
答案 0 :(得分:3)
file format documentation提到“热门WAL文件”,但这仅适用于未提交的数据。
数据库文件本身不包含有关-wal
文件中已提交数据的任何信息,即检查点之前的事务通常根本不会更改主数据库文件。
因此,删除-wal
文件只会将数据库恢复到最后一个检查点之后的状态(已过时,但一致);之后提交的所有交易都将丢失。
答案 1 :(得分:1)
参见" Checkpointing" SQLite的Write-Ahead Logging部分。根据我的理解,WAL文件中的数据根本就不会被提交。
换句话说,您丢失了尚未提交的.WAL文件中的数据,但主数据库本身应该完全正常。
答案 2 :(得分:0)
在检查点操作期间删除WAL文件时,可能会导致数据库损坏。如果未完成db修改,则需要WAL文件来完成更改,否则db文件处于临时状态。
DB和WAL文件创建db状态的完整图片。
它也在{ {3}}" SQLite必须查看日志文件才能从崩溃或电源故障中恢复。"