sqlite报错database is locked

668 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题描述

由于超级管理员也看不到我们组织,也没有权限更改用户的角色或邀请新用户,于是想要通过db直接修改数据的方式处理,无奈呀。。。操作流程如下:

  1. 登录Linux服务器连接sqlite数据库:sqlite3 /data1/grafana/data/grafana.db
  2. 更新用户权限:update org_user set role='Admin' where id = 483 and user_id in (222,223);
  3. 更新成功后去页面验证发现没有成功,则直接更新所有用户的角色:update org_user set role='Admin' where user_id in (222,223);
  4. 结果报错如下
sqlite> update org_user set role='Admin' where user_id in (222,223);
Error: database is locked

执行.quit退出连接后再次登录执行依然报错该异常,什么鬼?

问题定位

百度各种都是通过python脚本c语言等第三方连接后并发操作出现的异常,修改并发执行便解决了问题。但是我们没有并发执行啊。。。 但是问题定位确实是并发产生的。因为sqlite是库级别锁,只能同时有一个线程或进程执行写操作。那么看下进程咯。结果发现果然存在后台进程挂在后台

[...hostname...]$ ps -ef | grep sqlite
517       57160  55672  0 13:59 pts/2    00:00:00 sqlite3 /data1/grafana/data/grafana.db
517       64049  55672  0 14:57 pts/2    00:00:00 grep sqlite
[...hostname...]$ ps -ef | grep 57160
517       57160  55672  0 13:59 pts/2    00:00:00 sqlite3 /data1/grafana/data/grafana.db
517       64101  55672  0 14:57 pts/2    00:00:00 grep 57160
[...hostname...]$ ps -ef | grep 55672
517       55672  55671  0 13:48 pts/2    00:00:00 -bash
517       57160  55672  0 13:59 pts/2    00:00:00 sqlite3 /data1/grafana/data/grafana.db
517       64110  55672  2 14:58 pts/2    00:00:00 ps -ef
517       64111  55672  0 14:58 pts/2    00:00:00 grep 55672
[...hostname...]$ who am i
ops      pts/2        2020-06-19 13:45 (172.24.1.41)
[...hostname...]$ exit
logout
There are stopped jobs.
[...hostname...]$ exit
logout

明明已经执行了.quit退出sqlite客户端,为什么还会有后台进程在执行写操作?无奈

问题解决

问题定位后解决方法就很简单咯,杀掉后台进程即可。委婉点,我直接退出当前ssh连接重新登录跳板机,跳到目标机器再次执行。木有异常了^_^