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

Hoo*_*ked 14 sqlite

我正在尝试VACUUM在我的数据库上运行该命令,但我似乎用完了空间:

> sqlite3 mydatabase.db "VACUUM"
Error: database or disk is full
Run Code Online (Sandbox Code Playgroud)

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

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       406G  171G  215G  45% /home
Run Code Online (Sandbox Code Playgroud)

所以我显然高于所需的双倍尺寸限制.我该怎么做才能让vacuum命令运行?

CL.*_*CL. 18

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

SQLite的文档说临时目录是(按顺序):

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

  • 谢谢,明天我会试试.PRAGMA链接提到这是一个被谴责的命令,但没有给出替代方案.环境变量是推荐的方式吗? (2认同)

小智 5

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

CL在他的回答中给出了Linux的层次结构,并在他的评论中提到该层次结构与OS有关。为了完整起见,这里是层次结构(据我所知,可以从代码中确定它们)。

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

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

对于Cygwin,层次结构为:

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

对于Windows,层次结构为:

  • GetTempPath(),记录为返回:

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

希望这可以帮助。