正在使用ipython历史命令,尝试将-l和-g结合起来搜索有限的历史记录,并使用-n查看命令来自哪个会话。
突然,我发现了一个错误(我希望我的屏幕上还有准确的文本).一些关于历史线程遇到的错误和停止,不会保存更多的历史记录。它还提到了一些关于“数据库锁定”的内容。在此之后,%历史记录将不记得任何历史记录。
因此,我停止并重新启动了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 startup14442496 Mar 24 14:16 history-corrupt-2020-03-24T14.17.27.480963.sqlite看起来真的保存了所有的历史!现在的问题是,有谁知道我如何从sqlite文件中找到并清除腐败并恢复我的全部或大部分历史??
发布于 2020-03-25 03:32:31
耶,我修好了!所以我就是这么做的。通过谷歌搜索,我找到了这个叫做"sqlitebrowser“的程序,我找到了另一个页面的标题是“如何修复SQLite数据库?”,它解释说,有时可以通过将数据库导出到SQL文件,然后导入SQL文件来创建数据库的新版本,从而修复SQLite数据库。
所以我尝试了一下,但是当我导入SQL文件时,我发现了一个错误,它由于对"sessions“表的唯一约束而失败,并且它正在解除事务。
不幸的是,当我完成对SQL的导出时,我选择将插入分组到尽可能少的SQL命令中,因此展开整个“会话”表。后来我意识到,如果我没有对插入进行分组,那么这个导入可能已经修复了数据库(只是在那些包含重复会话的事务上失败了)。
但是,当时我还不确定发生了什么,也不认为返回并再导出来用大量的单独插入来重新生成SQL。
相反,我选择在SQL文件中查找“会话”表中的任何重复插入。实际上,使用一些sed和sort命令(sort vs sort -u,然后是diff),我能够确定227到236号会话中有两次!
因此,我从SQL文件中删除了副本,然后再次使用sqlitebrowser导入SQL文件并重新创建IPython history.sqlite文件。然后运行ipython,发现%历史魔术再次能够访问我的所有历史记录。
如果这个答案对任何人有帮助的话,请告诉我一声评论和/或投票表决。万事如意。
https://stackoverflow.com/questions/60837351
复制相似问题