【问题标题】:Sqlite3 recreates empty database from dump fileSqlite3 从转储文件重新创建空数据库
【发布时间】:2017-11-20 00:41:19
【问题描述】:

我的 sqlite 数据库有问题。

首先,我的数据库以某种方式崩溃了,无论我试图用它做什么,它都会显示:“数据库磁盘映像格式错误”。这可能是因为我正在将包含大量“\n”的大量文本写入表格的两列。

所以我在这里和其他网站上阅读了一些主题,我想转储数据库并重新创建它,但它说“行太长(最多 1000 个字符)” - 现在我无法重新创建这个错误。但奇怪的是我使用的是 3.19.3 版本的 sqlite3,我在另一个线程上看到,在以前的版本中,“\n”字符的问题已经解决了。

现在我的另一种方法是查看转储文件并使用正则表达式来删除所有这些文本。现在我的转储文件的大小从 750 Mb 减少到 3,5 Mb。当我试图从新的转储文件和旧的(这个大的)重新创建 db 时,结果是一个空文件。控制台不会为我提供任何类型的结果或错误。所以下面我将发布我在这个过程中的每一步。

sqlite3> .open testDatabase.sqlite
sqlite3> .mode insert
sqlite3> .output dump.sql
sqlite3> .exit

mv testDatabase.sqlite corruptDatabase.sqlite

sqlite3> .open testDatabase.sqlite
sqlite3> .read dump.sql

*gets rid of huge text values*
sqlite3> .open testDatabase.sqlite
sqlite3> .read small_dump.sql

两者都会导致一个空的 testDatabase.sqlite 文件。正如我之前提到的,没有错误,所以我不知道发生了什么。

请帮忙,我不知道该怎么办。

【问题讨论】:

  • “空文件”是指0字节吗?
  • 是的,完全正确。在此过程中会创建带有 *.journal 扩展名的文件,但随后会自动删除。
  • 如果没有收到错误消息,这应该是不可能的。
  • 那么我有可能在我的 CLI 中打开了某种“静音”模式吗?我是从官方 SQLite 页面下载的。

标签: database sqlite malformed


【解决方案1】:

.dump 命令遇到损坏的数据库时,它会输出 SQL 命令(尽可能生成它们),然后输出 ROLLBACK 命令以防止创建不完整的数据库。

如果您真的想从转储文件中获取不完整的数据,请对其进行编辑并更改最后一行

ROLLBACK; -- due to errors

COMMIT;

在最近的 SQLite 版本中,您可以改用 .recover command

【讨论】:

  • 就是这样!非常感谢
  • 没有可以设置的标志让sqlite3自己做这个吗?
  • @ZN13 不行。如果数据库损坏,您必须手动检查 SQL 并修复任何错误。
  • 有点像.recover 解决了这个问题。如果我做.dump 有一个回滚,但不是.recover
猜你喜欢
  • 2014-05-21
  • 2017-09-14
  • 1970-01-01
  • 2011-02-02
  • 2017-08-08
  • 1970-01-01
  • 2012-05-19
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多