当我输入这个查询: 删除邮件中id = 71的所有邮件
SQLite返回以下错误:
SQL error: database is locked
我如何解锁数据库,以便这个查询将工作?
当我输入这个查询: 删除邮件中id = 71的所有邮件
SQLite返回以下错误:
SQL error: database is locked
我如何解锁数据库,以便这个查询将工作?
当前回答
我在谷歌Chrome浏览器中查看存储的密码时遇到了这个错误。
# ~/.config/google-chrome/Default
$ sqlite3 Login\ Data
SQLite version 3.35.5 2021-04-19 18:32:05
sqlite> .tables
Error: database is locked
如果你不是特别关心父进程,或者你不想停止当前正在使用数据库的chrome进程,只需将文件复制到其他地方。
$ cp Login\ Data ~/tmp/ld.sql
$ sqlite3 ~/tmp/ld.sql .tables
field_info meta sync_model_metadata
insecure_credentials stats
logins sync_entities_metadata
这样做将允许您读取数据库的内容,而不打扰或停止主chrome进程。
其他回答
在选择重新启动选项之前,有必要看看能否找到sqlite数据库的用户。
在Linux上,可以使用fuser:
$ fuser database.db
$ fuser database.db-journal
在我的案例中,我得到了如下的回应:
philip 3556 4700 0 10:24 pts/3 00:00:01 /usr/bin/python manage.py shell
这表明我有另一个使用数据库的pid 3556 (manage.py)的Python程序。
这是因为该数据库上正在运行其他一些查询。SQLite是一个同步执行查询的数据库。如果其他人正在使用该数据库,那么如果你执行查询或事务,它就会给出这个错误。
因此,停止正在使用特定数据库的进程,然后执行查询。
我在谷歌Chrome浏览器中查看存储的密码时遇到了这个错误。
# ~/.config/google-chrome/Default
$ sqlite3 Login\ Data
SQLite version 3.35.5 2021-04-19 18:32:05
sqlite> .tables
Error: database is locked
如果你不是特别关心父进程,或者你不想停止当前正在使用数据库的chrome进程,只需将文件复制到其他地方。
$ cp Login\ Data ~/tmp/ld.sql
$ sqlite3 ~/tmp/ld.sql .tables
field_info meta sync_model_metadata
insecure_credentials stats
logins sync_entities_metadata
这样做将允许您读取数据库的内容,而不打扰或停止主chrome进程。
从您之前的评论中,您说存在一个-journal文件。
这可能意味着您已经打开和(EXCLUSIVE?)事务,还没有提交数据。是你的程序或者其他进程留下了-journal吗?
重新启动sqlite进程将查看日志文件,清除任何未提交的操作并删除-journal文件。
我在多线程应用程序中也有“数据库被锁定”错误,这似乎是SQLITE_BUSY结果代码,我通过将sqlite3_busy_timeout设置为适当的长度(如30000)来解决这个问题。
(顺便说一句,对于一个7年前的问题,居然没有人发现这一点,这真奇怪!SQLite真的是一个奇特而神奇的项目…)