VACUUM上的“数据库或磁盘已满”,具有足够的可用空间

时间:2019-11-06 23:41:35

标签: sqlite

我花了一个小时来研究这个确切的问题并尝试应用其他解决方案,但是一半的线程说问题是磁盘已满(不是),而其余的我无法了解答案,否则对我不起作用。

我的数据库文件为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)真空一张桌子

我的数据库只有一个表。

2 个答案:

答案 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版中得到了改进。