【问题标题】:SQLITE3 VACUUM, "database or disk is full"SQLITE3 VACUUM,“数据库或磁盘已满”
【发布时间】:2014-06-08 14:43:27
【问题描述】:

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

【问题讨论】:

    标签: sqlite


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我明天试试。 PRAGMA 链​​接提到这是一个过时的命令,但没有提供替代方案。环境变量是推荐的方式吗?
    • 是的,但是除了PRAGMA temp_store_directory 之外的所有内容都依赖于操作系统。
    • 请注意,SQLITE_TMPDIR 仅在 SQLite v3.8.1 中引入...参见sqlite.org/releaselog/3_8_1.html
    • SQLITE_TMPDIR 和 TMPDIR 似乎都不适用于 python 3.5 (Ubuntu) 下的 sqlite3 2.6.0。不推荐使用 PRAGMA。怎么办?
    • @max Python 已修改默认 temp_store 设置。无论如何,这将是一个新问题。
    【解决方案2】:

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

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

    对于 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 目录。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我刚刚在我的 Windows 10 中尝试了 cmd windows SET TMP=D:\tmp 然后在同一个 cmd python my_script.py 中执行,效果很好。这样我就可以只为此执行更改 tmp 目录。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多