SQLITE3 VACUUM,“数据库或磁盘已满”

2024-04-28 05:01:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在我的数据库上运行VACUUM命令,但似乎空间不足:

> sqlite3 mydatabase.db "VACUUM"
Error: database or disk is full

数据库大约为36GB,我运行它的驱动器看起来像(通过df -h):

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       406G  171G  215G  45% /home

所以我显然超出了所需的双人尺寸限制。我该怎么做才能让真空命令运行?


Tags: or命令数据库dbismy空间error
3条回答

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

OP注意到,在真空状态下,SQLite创建的临时文件大小与原始数据库大致相同。它这样做是为了维护数据库ACID属性。SQLite在执行真空操作时使用一个目录来保存所需的临时文件。为了确定要使用哪个目录,它会将层次结构下移,以查找具有适当访问权限的第一个目录。如果它找到一个它没有访问权限的目录,它将忽略该目录并继续下降层次结构以查找它有访问权限的目录。如果有人指定了一个环境变量,而SQLite似乎忽略了它,我会提到这个问题。

在他的回答中,CL给出了Linux的层次结构,并且在他的评论中提到了层次结构依赖于OS。为了完整起见,这里是层次结构(在我可以从代码中确定的范围内)。

对于Unix(和Linux),层次结构是:

  1. 无论SQLITE_TMPDIR环境变量指定了什么
  2. 无论TMPDIR环境变量指定了什么
  3. /变量/tmp
  4. /usr/tmp
  5. /tmp,最后
  6. 当前工作目录。

对于Cygwin层次结构是:

  1. 无论SQLITE_TMPDIR环境变量指定了什么
  2. 无论TMPDIR环境变量指定了什么
  3. 无论TMP环境变量指定了什么
  4. 无论TEMP环境变量指定了什么
  5. 无论USERPROFILE环境变量指定了什么
  6. /变量/tmp
  7. /usr/tmp
  8. /tmp,最后
  9. 当前工作目录。

对于窗口层次结构是:

  • GetTempPath(),记录返回:

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

希望这有帮助。

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

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

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

相关问题 更多 >