【问题标题】:postgreSQL vacuum temp files?postgreSQL 真空临时文件?
【发布时间】:2009-09-04 11:33:49
【问题描述】:

我有一个“小”问题。一周前,我的数据库达到了完整的磁盘容量。我删除了不同表中的许多行以释放磁盘空间。之后我尝试运行没有完成的完全真空。

我想知道的是。当我停止真空完全完成时,它是否会在磁盘上留下任何我必须手动删除的临时文件? 我现在有一个磁盘容量为 100% 的数据库,这不用说是个大问题。

任何释放磁盘空间的技巧?

我正在运行带有 postgres 8.1.4 数据库的 SUSE。

【问题讨论】:

    标签: postgresql diskspace vacuum


    【解决方案1】:

    首先:

    升级

    即使您不能升级到 8.2、8.3 或 8.4 - 至少升级到最新的 8.1(目前是 8.1.17,但将在 1-2 天内升级到 8.1.18)。

    第二:诊断问题所在。

    使用du 工具来诊断空间的具体去向。哪个目录占用太多空间?

    df检查总已用空间,然后检查有多少是PostgreSQL目录。

    最好的选择是:

    cd YOUR_PGDATA_DIR
    du -sk *
    cd base
    du -sk *
    cd LARGEST DIR FROM PREVIOUS COMMAND
    du -sk * | sort -nr | head
    

    现在,您知道 PGDATA 中的哪个目录正在使用空间,您可以做一些事情。

    如果是日志或 pg_temp - 重新启动 pg 或删除日志(pg_clog 和 pg_xlog 不是这个词的常见含义的日志,永远不要从那里删除任何内容!)。

    如果它在你的基本目录中,那么:

    基本目录中的数字目录与数据库相关。您可以通过以下方式进行检查:

    select oid, datname from pg_database;
    

    当您知道正在使用大部分空间的数据库时,连接到它并检查哪些文件使用了大部分空间。

    文件名将是带有可选“.digits”后缀的数字 - 此后缀(目前)无关紧要,您可以通过发出以下命令来检查文件的确切含义:

    select relname from pg_class  where relfilenode = <NUMBER_FROM_FILE_NAME>;
    

    一旦您知道哪些表/索引占用了大部分空间 - 您可以 VACUUM FULL 它,或者(更好)对它们发出 CLUSTER 命令。

    【讨论】:

    • 感谢您的回复!我的问题是磁盘已 100% 满。真空和集群需要可用磁盘空间才能运行。是否可以在不运行真空/集群的情况下从数据库中完全删除数据?
    • 找一张你可以牺牲的桌子,然后截断它。它将立即释放空间。
    【解决方案2】:

    关于您的问题的新切线,您可以使用query 找出数据库中的哪些内容占用了大量空间。这可以帮助您找到 TRUNCATE 的候选人,以回收足够的工作空间来清理那些已删除信息的人。

    请注意,删除大量行但不够频繁地进行 VACUUM 以检查磁盘空间通常会导致称为索引膨胀的情况,而 VACUUM FULL 根本无济于事。当我建议的查询显示您的大部分空间被索引而不是常规表占用时,您就会知道您在那里。您将需要 CLUSTER,它需要与表本身一样多的可用磁盘空间来重建所有内容,以从该问题中恢复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多