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

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

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


1
“空文件”是指0字节吗? - CL.
是的,没错。在这个过程中会创建一个扩展名为*.journal的文件,但随后会自动删除。 - P. Kudła
这应该是不可能的,否则会出现错误信息。 - CL.
那么我在CLI中是否可能开启了某种“静默”模式?我是从官方SQLite页面下载的。 - P. Kudła
1个回答

8
.dump命令遇到损坏的数据库时,它会输出SQL命令(只要它能生成),然后输出ROLLBACK命令以防止创建不完整的数据库。
如果您确实想从转储文件中获取不完整的数据,请编辑它并将最后一行更改为:
ROLLBACK; -- due to errors

COMMIT;

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


就是这样!非常感谢。 - P. Kudła
有没有可以设置的标志,让sqlite3自己执行这个操作? - ZN13
@ZN13 不行。如果数据库损坏了,你必须手动检查SQL并修复任何错误。 - CL.
似乎.recover可以解决这个问题。如果我使用.dump,会出现ROLLBACK,但是使用.recover则不会。 - ZN13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接