問題描述
由於超級管理員也看不到我們組織,也沒有權限更改用戶的角色或邀請新用戶,於是想要通過db直接修改數據的方式處理,無奈呀。。。操作流程如下:
- 登錄Linux服務器連接sqlite數據庫:sqlite3 /data1/grafana/data/grafana.db
- 更新用戶權限:update org_user set role=‘Admin’ where id = 483 and user_id in (222,223);
- 更新成功後去頁面驗證發現沒有成功,則直接更新所有用戶的角色:update org_user set role=‘Admin’ where user_id in (222,223);
- 結果報錯如下
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連接重新登錄跳板機,跳到目標機器再次執行。木有異常了_