丢失 ipython 历史 - 数据库已锁定

lost ipython history - database locked

正在玩 ipython 历史命令,尝试结合使用 -l 和 -g 搜索有限数量的历史记录,并使用 -n 查看命令来自哪个会话。

突然我收到一个错误(我希望我的屏幕上仍然有准确的文本)...关于历史线程遇到的错误并停止,并且不会保存更多历史记录。它也说了一些关于 "database locked" 的事情。在那之后,%history 将不会回忆起任何历史。

所以我停止并重新启动 ipython,发现它只有来自新重新启动的会话的历史记录。我停止并再次重新启动,甚至尝试关闭并重新打开我的 WSL-Ubuntu window 但没有成功。看来我丢失了几个月又几个月的历史。

然后我决定寻找 ipython 历史文件,找到了这个 gem:

dino@DINO:~$ ls -l $( ipython locate profile default )
total 14132
drwxrwxrwx 1 dino dino      512 Jul 17  2019 db
-rw-r--r-- 1 dino dino 14442496 Mar 24 14:16 history-corrupt-2020-03-24T14.17.27.480963.sqlite
-rw-r--r-- 1 dino dino    28672 Mar 24 14:24 history.sqlite
drwxrwxrwx 1 dino dino      512 Mar 18  2019 log
drwx------ 1 dino dino      512 Mar 18  2019 pid
drwx------ 1 dino dino      512 Mar 18  2019 security
drwxrwxrwx 1 dino dino      512 Mar 18  2019 startup

哇!看那个! 14442496 Mar 24 14:16 history-corrupt-2020-03-24T14.17.27.480963.sqlite 看起来 ipython 真的保存了所有的历史! 现在的问题是,有没有人知道我如何找到并删除 sqlite 文件中的损坏并恢复我的全部或大部分历史记录??

耶,我修好了!这就是我所做的。通过谷歌搜索,我发现 this program called "sqlitebrowser" and I found this other page with a section titled "How to Repair SQLite database?" 解释了有时您可以通过 将数据库导出到 SQL 文件,然后导入 SQL 来修复 SQLite 数据库=] 文件创建新版本的数据库。

所以我试过了,但是,当我导入 SQL 文件时,我收到一条错误消息,指出由于 "sessions" table 上的 UNIQUE 约束而失败,并且它正在解除 t运行saction。

不幸的是,当我完成 导出 到 SQL 时,我选择了将插入分组到尽可能少的 SQL 命令中的选项,所以展开解除了整个 "sessions" table。我后来意识到,如果我没有对插入进行分组,也许 import 修复了数据库(只是在那些包含重复会话的 t运行saction 上失败)。

但是当时我还不确定发生了什么,也没有想回去重新导出以重新生成带有大量单独插入的 SQL。

相反,我选择查看 SQL 文件以查找 "sessions" table 上的任何重复插入。事实上,通过一些 sedsort 命令(sort vs sort -u,然后是 diff),我能够确定会话 227 到 236 不知何故在那里两次!

所以我从 SQL 文件中删除了重复项,然后再次使用 sqlitebrowser 导入 SQL 文件并重新创建 IPython history.sqlite 文件。 然后我 运行 ipython 发现 %history magic 能够再次访问我的所有历史记录。

如果这个答案对任何人有帮助,请通过评论让我知道and/or。祝一切顺利。