当我输入这个查询: 删除邮件中id = 71的所有邮件

SQLite返回以下错误:

SQL error: database is locked

我如何解锁数据库,以便这个查询将工作?


当前回答

如果你试图解锁Chrome数据库,用SQLite查看它,然后只需关闭Chrome。

窗户

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data

or

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Chrome Web Data

Mac

~/Library/Application Support/Google/Chrome/Default/Web Data

其他回答

应该是数据库的内部问题… 对我来说,这是在尝试用“SQLite管理器”浏览数据库后表现出来的… 所以,如果你找不到另一个连接到数据库的进程,你也无法修复它, 试试这个激进的解决方案:

提供导出您的表(您可以在Firefox上使用“SQLite管理器”) 如果迁移改变了数据库方案,请删除上次失败的迁移 重命名“数据库”。sqlite”文件 执行“rake db:migrate”创建一个新的工作数据库 提供给正确的权限数据库表的导入 导入备份的表 编写新的迁移 执行"rake db:migrate"

我刚才在远程服务器上使用存储在NFS挂载上的SQLite数据库时遇到了这个问题。当我使用的远程shell会话在数据库打开时崩溃后,SQLite无法获得锁。

上面建议的恢复方法对我不起作用(包括先移动然后再复制数据库的想法)。但是在将其复制到非nfs系统后,数据库变得可用,数据似乎没有丢失。

我在多线程应用程序中也有“数据库被锁定”错误,这似乎是SQLITE_BUSY结果代码,我通过将sqlite3_busy_timeout设置为适当的长度(如30000)来解决这个问题。

(顺便说一句,对于一个7年前的问题,居然没有人发现这一点,这真奇怪!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进程。

如果你想删除一个“database is locked”错误,请按照以下步骤执行:

将数据库文件复制到其他位置。 用复制的数据库替换数据库。这将解除对访问数据库文件的所有进程的引用。