我正在尝试在我的数据库上运行VACUUM
命令,但我似乎用完了空间:
> sqlite3 mydatabase.db "VACUUM"
Error: database or disk is full
数据库大约是36 GB,而我运行它的驱动器看起来像是(通过df -h
):
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 406G 171G 215G 45% /home
所以我明显高于所需的双倍尺寸限制。我该怎么做才能让vacuum命令运行?
答案 0 :(得分:17)
要允许VACUUM命令运行,请将临时文件的目录更改为具有足够可用空间的目录。
SQLite的documentation表示临时目录是(按顺序):
SQLITE_TMPDIR
环境变量设置的任何内容;或TMPDIR
环境变量设置的任何内容;或/var/tmp
;或/usr/tmp
;或/tmp
;或.
,当前的工作目录答案 1 :(得分:4)
OP 指出,在VACUUM期间,SQLite会创建一个与原始数据库大小相同的临时文件。它这样做是为了维护数据库ACID属性。 SQLite使用一个目录来保存执行VACUUM时所需的临时文件。为了确定要使用的目录,它会下降层次结构,查找具有适当访问权限的第一个目录。如果它找到了一个它无法访问的目录,它将忽略该目录并继续下降层次结构,寻找它所执行的目录。我提到这个,以防任何人指定了一个环境变量,SQLite似乎忽略了它。
在他的回答中 CL 给出 Linux 的层次结构,并在他的评论中提到层次结构是依赖于操作系统的。为了完整性,这里是层次结构(就我可以从代码中确定它们而言)。
对于 Unix (以及 Linux ),层次结构为:
对于 Cygwin ,层次结构为:
对于 Windows ,层次结构为:
GetTempPath(),记录为返回:
希望这有帮助。
答案 2 :(得分:2)
创建临时文件的驱动器可能没有足够的空间。看这里 Vacuum-command-is-failing-with-SQL-Error-Database-or-disk-is-full