加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

有效地解锁SQLite数据库

发布时间:2020-12-12 23:43:48 所属栏目:百科 来源:网络整理
导读:我有一个经常崩溃的程序(Zotero),它的SQLite数据库被锁定并且无法访问重启程序使用,除非我重启(我真的想避免).所以这不起作用(使用通用名称,db.sqlite代替我的实际文件,zotero.sqlite): sqlite3 db.sqlitesqlite .backup main backup.sqliteError: database
我有一个经常崩溃的程序(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可能使用基于表的锁定来防止在并发访问期间数据库不一致.当一个用户使用数据库时,它会锁定表,这样只有他们可以使用它并防止他们看到数据库处于不一致状态.然而,当它崩溃时,它不会释放这些锁.

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

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

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

我希望这有帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读