首页 > 解决方案 > 丢失 ipython 历史记录 - 数据库锁定

问题描述

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

突然我得到一个错误(我希望我的屏幕上仍然有确切的文本)......关于历史线程遇到的错误并停止,并且不会保存更多历史记录。它还谈到了“数据库锁定”。在那之后,%history 不会回忆任何历史。

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

然后我决定查找 ipython 历史文件,并找到了这个小宝石:

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 文件中找到并删除损坏并恢复我的全部或大部分历史记录?

标签: sqliteipythonipython-magic

解决方案


耶,我修好了!所以这就是我所做的。通过一些谷歌搜索,我发现了这个名为“sqlitebrowser”的程序,我发现了另一个页面,其中有一个标题为“如何修复 SQLite 数据库?”的部分。这解释了您有时可以通过将数据库导出到 SQL 文件来修复 SQLite 数据库,然后导入 SQL 文件以创建数据库的新版本。

所以我尝试了,但是当我导入 SQL 文件时,我收到一个错误,说它由于“会话”表上的 UNIQUE 约束而失败,并且它正在展开事务。

不幸的是,当我完成对 SQL 的导出时,我选择了将插入分组到尽可能少的 SQL 命令中的选项,因此展开取消了整个“会话”表。后来我意识到,如果我没有对插入进行分组,那么导入可能会修复数据库(只是在那些包含重复会话的事务上失败)。

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

相反,我选择在 SQL 文件中查找“会话”表上的任何重复插入。sed实际上,通过一些sort命令(sortvs sort -u,后跟diff),我能够确定会话 227 到 236 以某种方式在那里两次!

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

如果此答案对任何人有帮助,请通过评论和/或投票告诉我。 一切顺利。


推荐阅读