如何解锁SQLite数据库?
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked
如何解锁数据库以便这样做?
ryantm asked 2019-03-04T16:16:22Z
30个解决方案
226 votes
在Windows中你可以尝试这个程序[http://www.nirsoft.net/utils/opened_files_view.html]来找出处理db文件的过程。 尝试关闭该程序以解锁数据库
在Linux和macOS中,您可以执行类似的操作,例如,如果您的锁定文件是development.db:
$ fuser development.db
此命令将显示锁定文件的进程:
> development.db:5430
只是杀了这个过程......
杀了-9 5430
...并且您的数据库将被解锁。
noneno answered 2019-03-04T16:17:24Z
82 votes
我在写入过程中使应用程序崩溃导致我的sqlite数据库被锁定。 这是我如何修复它:
echo ".dump" | sqlite old.db | sqlite new.db
摘自:[http://random.kakaopor.hu/how-to-repair-an-sqlite-database]
robert answered 2019-03-04T16:17:56Z
51 votes
SQLite wiki DatabaseIsLocked页面提供了对此错误消息的良好解释。 它部分地说明争用的来源是内部的(对于发出错误的过程)。
这个页面没有解释的是SQLite如何决定你的进程中的某些东西是否存在锁定以及哪些条件可能导致误报。
converter42 answered 2019-03-04T16:18:29Z
27 votes
删除-journal文件听起来像一个糟糕的主意。 它允许sqlite在崩溃后将数据库回滚到一致状态。 如果在数据库处于不一致状态时将其删除,则会留下损坏的数据库。 引用sqlite站点的页面:
如果确实发生了崩溃或断电并且磁盘上留有热日志,则原始数据库文件和热日志必须保留在磁盘上并保留其原始名称,直到另一个SQLite进程打开数据库文件并回滚。[...]
我们怀疑SQLite恢复的常见故障模式是这样的:发生电源故障。 电源恢复后,善意的用户或系统管理员开始在磁盘上查看损坏情况。 他们看到他们的数据库文件名为“important.data”。 这个文件对他们来说可能很熟悉。 但在崩溃之后,还有一个名为“important.data-journal”的热门期刊。 然后用户删除热门日志,认为他们正在帮助清理系统。 除了用户教育之外,我们知道无法阻止这种情况。
回滚应该在下次打开数据库时自动发生,但如果进程无法锁定数据库,则会失败。 正如其他人所说,其中一个可能的原因是另一个流程目前正在开放。 如果数据库位于NFS卷上,则另一种可能性是过时的NFS锁定。 在这种情况下,解决方法是使用未在NFS服务器上锁定的新副本替换数据库文件(mv database.db original.db; cp original.db database.db)。 请注意,由于NFS文件锁定的错误实现,sqlite FAQ建议谨慎对NFS卷上的数据库进行并发访问。
我无法解释为什么删除-journal文件会让你锁定以前无法访问的数据库。 这是可重复的吗?
顺便说一下,-journal文件的存在并不一定意味着发生了崩溃或者有回滚的变化。 Sqlite有一些不同的日志模式,在PERSIST或TRUNCATE模式下,它始终保留-journal文件,并更改内容以指示是否存在要回滚的部分事务。
Aaron answered 2019-03-04T16:19:36Z
12 votes
如果进程锁定SQLite DB并崩溃,则数据库将永久锁定。 那就是问题所在。 并不是某些其他进程有锁定。
answered 2019-03-04T16:20:02Z
12 votes
如果要删除“数据库已锁定”错误,请按照下列步骤操作:
将数据库文件复制到其他位置。
用复制的数据库替换数据库。 这将取消引用正在访问数据库文件的所有进程。
vinayak jadi answered 2019-03-0