sqlite - 丢失 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 文件中找到并删除损坏并恢复我的全部或大部分历史记录?
解决方案
耶,我修好了!所以这就是我所做的。通过一些谷歌搜索,我发现了这个名为“sqlitebrowser”的程序,我发现了另一个页面,其中有一个标题为“如何修复 SQLite 数据库?”的部分。这解释了您有时可以通过将数据库导出到 SQL 文件来修复 SQLite 数据库,然后导入 SQL 文件以创建数据库的新版本。
所以我尝试了,但是当我导入 SQL 文件时,我收到一个错误,说它由于“会话”表上的 UNIQUE 约束而失败,并且它正在展开事务。
不幸的是,当我完成对 SQL 的导出时,我选择了将插入分组到尽可能少的 SQL 命令中的选项,因此展开取消了整个“会话”表。后来我意识到,如果我没有对插入进行分组,那么导入可能会修复数据库(只是在那些包含重复会话的事务上失败)。
但是当时,我还不确定发生了什么,也没有想过要返回并重新导出以重新生成带有大量单独插入的 SQL。
相反,我选择在 SQL 文件中查找“会话”表上的任何重复插入。sed
实际上,通过一些sort
命令(sort
vs sort -u
,后跟diff
),我能够确定会话 227 到 236 以某种方式在那里两次!
所以我从 SQL 文件中删除了重复项,然后再次使用sqlitebrowser导入 SQL 文件并重新创建IPython
history.sqlite
文件。 然后我运行 ipython 并发现 %history 魔法能够再次访问我的所有历史记录。
如果此答案对任何人有帮助,请通过评论和/或投票告诉我。 一切顺利。
推荐阅读
- python - 我可以在 Python 中获取整数的最后一位吗
- php - 如何获取最后 2 个数字并将其转换为月份
- unit-testing - 在 Clojure 中,如何对异步基座拦截器进行单元测试?
- javascript - 如何以编程方式提交/自动保存 SharePoint 快速编辑表单
- node.js - VueJS 构建和 Elastic Beanstalk 环境变量
- reactjs - 分叉和自定义第 3 方 React 组件在 react js 中不起作用
- android - 如何从 RecyclerView 更改此回收器视图中显示的变量值
- c# - 如何删除 wpf C# 上的树视图项?
- sql - 创建学生 ID、名字、课程名称的视图
- c++ - std::enable_if 与非即时上下文中的硬错误