6

我有一个经常崩溃的程序(Zotero),它的 SQLite 数据库被锁定并且无法被重新启动的程序使用,除非我重新启动(我真的想避免)。所以这不起作用(db.sqlite在我的情况下使用通用名称代替实际文件,zotero.sqlite):

sqlite3 db.sqlite
sqlite> .backup main backup.sqlite
Error: database is locked

根据此处的答案,我尝试了:

echo ".dump" | sqlite3 db.sqlite | sqlite3 db.sqlite2
mv db.sqlite2 db.sqlite

db.sqlite2是 0KB,所以这显然不起作用。受另一个线程的启发,我也尝试过

echo '.dump' | sqlite3 db.sqlite > db.dump
cat db.dump | sqlite3 db.sqlite2
mv db.sqlite2 db.sqlite

这导致db.sqlite2其文件大小略小到db.sqlite,并且 Zotero(需要数据库的文件)无法识别其内容。

因此,这似乎是一种非常蛮力的做法,但有效:

cp -pv db.sqlite db.sqlite2
rm -f db.sqlite
mv db.sqlite2 db.sqlite

我想知道这个解决方案是否有任何缺点,以及为什么在这个解决方案之前提出了其他方法。

4

1 回答 1

2

对于事务控制,zotero 可能使用基于表的锁定来防止并发访问期间的数据库不一致。当一个用户使用数据库时,它会锁定表,以便只有他们可以使用它,并防止他们看到数据库处于不一致的状态。但是,当它崩溃时,它不会释放这些锁。

在崩溃时设置良好的数据库中,事务应该回滚(撤消)并释放锁定以防止数据处于不一致状态或表被锁定并且您必须手动释放它们。

我在互联网上读到,将数据库存储在网络文件系统上可能会干扰 SQLite 锁定机制,通过将数据库位置更改为无网络位置,您应该能够避免这些问题,除非它在其他地方。

如果它在其他地方,我建议您复制您的数据库并使用 zotero 数据库修复工具来尝试识别设置等中可能导致此问题的任何故障并修复它们:https ://www.zotero.org/utils /dbfix/

我希望这有帮助。

于 2013-05-27T19:39:38.390 回答