我有一个经常崩溃的程序(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
我想知道这个解决方案是否有任何缺点,以及为什么在这个解决方案之前提出了其他方法。