gpt4 book ai didi

sqlite - 有效地解锁 SQLite 数据库

转载 作者:IT王子 更新时间:2023-10-29 06:26:37 29 4
gpt4 key购买 nike

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

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

基于答案 here ,我试过:

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

db.sqlite2 是 0KB,所以这显然不起作用。灵感来自 another thread ,我也试过了

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

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

最佳答案

可能是为了事务控制,zotero使用了table based locking来防止并发访问时数据库不一致。当一个用户使用数据库时,它会锁定表,这样只有他们才能使用它,并防止他们看到数据库处于不一致的状态。然而,当它崩溃时,它并没有释放这些锁。

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

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

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

希望对您有所帮助。

关于sqlite - 有效地解锁 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419654/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com