Sqlite3 从转储文件重新创建空数据库

Sqlite3 recreates empty database from dump file

我的 sqlite 数据库有问题。

首先,我的数据库不知何故崩溃了,无论我试图用它做什么,它都说:"database disk image is malformed"。这可能是因为我在 table.

的两列中写了很多带有“\n”的大文本

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

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

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 文件。正如我之前提到的,没有错误,所以我不知道发生了什么。

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

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

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

ROLLBACK; -- due to errors

COMMIT;

在最近的 SQLite 版本中,您可以使用 .recover command 代替。