SQLITE3 VACUUM,"数据库或磁盘已满#34;

时间:2014-04-23 16:09:56

标签: sqlite

我正在尝试在我的数据库上运行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命令运行?

3 个答案:

答案 0 :(得分:17)

要允许VACUUM命令运行,请将临时文件的目录更改为具有足够可用空间的目录。

SQLite的documentation表示临时目录是(按顺序):

  1. 使用PRAGMA temp_store_directory命令设置的任何内容;或
  2. 使用SQLITE_TMPDIR环境变量设置的任何内容;或
  3. 使用TMPDIR环境变量设置的任何内容;或
  4. /var/tmp;或
  5. /usr/tmp;或
  6. /tmp;或
  7. .,当前的工作目录

答案 1 :(得分:4)

OP 指出,在VACUUM期间,SQLite会创建一个与原始数据库大小相同的临时文件。它这样做是为了维护数据库ACID属性。 SQLite使用一个目录来保存执行VACUUM时所需的临时文件。为了确定要使用的目录,它会下降层次结构,查找具有适当访问权限的第一个目录。如果它找到了一个它无法访问的目录,它将忽略该目录并继续下降层次结构,寻找它所执行的目录。我提到这个,以防任何人指定了一个环境变量,SQLite似乎忽略了它。

在他的回答中 CL 给出 Linux 的层次结构,并在他的评论中提到层次结构是依赖于操作系统的。为了完整性,这里是层次结构(就我可以从代码中确定它们而言)。

对于 Unix (以及 Linux ),层次结构为:

  1. SQLITE_TMPDIR 环境变量
  2. 指定的内容
  3. TMPDIR 环境变量
  4. 指定的内容
  5. / var / tmp中,
  6. 的/ usr / TMP,
  7. / tmp,最后
  8. 当前工作目录。
  9. 对于 Cygwin ,层次结构为:

    1. SQLITE_TMPDIR 环境变量
    2. 指定的内容
    3. TMPDIR 环境变量
    4. 指定的内容
    5. TMP 环境变量指定的内容
    6. TEMP 环境变量指定的内容
    7. USERPROFILE 环境变量
    8. 指定的内容
    9. / var / tmp中,
    10. 的/ usr / TMP,
    11. / tmp,最后
    12. 当前工作目录。
    13. 对于 Windows ,层次结构为:

      • GetTempPath(),记录为返回:

        1. TMP 环境变量指定的内容
        2. TEMP 环境变量指定的内容
        3. 无论 USERPROFILE 环境变量指定了什么,最后
        4. Windows 目录。

      希望这有帮助。

答案 2 :(得分:2)

创建临时文件的驱动器可能没有足够的空间。看这里 Vacuum-command-is-failing-with-SQL-Error-Database-or-disk-is-full