正在使用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文件中的损坏并恢复我的全部或大部分历史记录?
答案 0 :(得分:0)
是的,我已解决问题!这就是我所做的。通过一些搜索,我发现this program called "sqlitebrowser",并且发现this other page with a section titled "How to Repair SQLite database?"解释说,有时您可以通过将数据库导出到SQL文件,然后导入SQL文件以创建新的数据库来修复SQLite数据库。数据库版本。
所以我尝试了一下,但是,当我导入SQL文件时,出现一个错误,说它由于对“会话”表的唯一约束而失败,并且正在取消事务。
不幸的是,当我完成对SQL的 export 导出后,我选择了将插入分组为尽可能少的SQL命令的选项,因此展开操作取消了整个“会话”表。后来我意识到,如果没有对插入进行分组,也许导入将已修复数据库(仅在包含重复会话的事务上失败)。
但是,当时我还不确定发生了什么,也没有想到要返回并重新导出以使用大量单个插入来重新生成SQL。
相反,我选择在SQL文件中浏览“会话”表上是否有重复的插入。实际上,通过使用某些sed
和sort
命令(sort
与sort -u
,然后是diff
),我能够确定会话227到236的位置在那里两次!
因此,我从SQL文件中删除了重复项,然后再次使用 sqlitebrowser 导入SQL文件并重新创建 IPython
history.sqlite
文件。 然后我运行ipython,发现%history magic能够再次访问我的所有历史记录。
如果此答案对任何人都有帮助,请用评论和/或投票给我。最好。