我花了一个小时来研究这个确切的问题并尝试应用其他解决方案,但是一半的线程说问题是磁盘已满(不是),而其余的我无法了解答案,否则对我不起作用。
我的数据库文件为8MB,而我的SSD有314GB的可用空间。唯一的其他卷是我的iCloud Drive,它具有237MB的可用空间。
其他线程建议更改临时目录所在的卷,但是:
(1)我的两个卷都有足够的可用空间。
(2)我找不到操作方式设置临时目录的说明。尝试使用如下语法给出语法错误:SQLITE_TMPDIR ='/ path /'
(3)我找不到如何显示当前临时目录是什么的说明。 [更新:在终端上输入“ env”会显示TMPDIR = / var / folders ...,该文件位于我的SSD上,没有我知道的空间限制。]
更新:运行pragma_integrity_check,我得到:
On tree page 1206 cell 0: invalid page number 1658652726
On tree page 746 cell 0: invalid page number 205562142
On tree page 94 cell 0: invalid page number 1932643690
Page 1051 is never used
Page 1079 is never used
Page 1385 is never used
更新: 尝试恢复损坏的数据库的各种建议方法都失败了。
(1)恢复。在下面的代码中,“ sqlite>”是命令提示符。我通过在终端中输入“ sqlite3”来实现。
sqlite> $ sqlite3 -batch bad.db .recover> salvaged.sql; #无法识别的令牌$
sqlite> sqlite3 -batch bad.db .recover> salvaged.sql; #错误:“ sqlite3”附近:语法错误
sqlite> -batch bad.db .recover> salvaged.sql; #错误:“-”附近:语法错误
(2)真空注入
出现语法错误。发现我的SQLite版本太旧。下载了新版本,以查找有关升级的说明。发现“酿酒更新sqlite”。试了一下,出错了,Ruby太老了。更新了Ruby。再次尝试“ brew update sqlite”,出现错误,“错误:未安装sqlite”。尝试了“ brew install sqlite”,并收到错误消息“ sqlite仅用于桶装,这意味着它没有符号链接到/ usr / local,因为macOS提供了较旧的sqlite3。”
(3)真空一张桌子
我的数据库只有一个表。
答案 0 :(得分:0)
由于数据库文件已损坏,因此您将不得不尝试进行恢复。我先将VACUUM与INTO子句一起使用,例如
VACUUM INTO 'recovery.db';
如果这不起作用,请尝试一次吸尘一张桌子。
答案 1 :(得分:0)
尝试从损坏的数据库中恢复数据的最佳方法是使用sqlite3命令行程序的.recover
命令,该命令会打印出SQL DDL语句,以存储尽可能多的数据。
示例:
$ sqlite3 -batch bad.db .recover > salvaged.sql
有关详细信息,请参见the documentation。
您可能想要最新版本的sqlite3
shell,它可以是downloaded二进制文件,也可以从源代码构建,因为.recover
在3.30版中得到了改进。