Insights Hub Cloud Foundry (CF) – PostgreSQL 表空间整理、磁盘优化

2024-05-06T07:58:45.000-0400
Developer Tools Applications

摘要

如何整理 PostgreSQL 的表空间,来优化磁盘容量,以防止数据库的磁盘不够用?


详细信息

一、查看表空间使用情况

首先需要使用第三方工具,通过 SSH 连接到 CF 中的 PostgreSQL,再查看当前表空间中各个表的使用情况。

使用如下命令:

  • select pg_size_pretty(pg_database_size('pod42a5f2')); // 查看以KB、MB、GB方式查看数据库大小
  • select pg_size_pretty(pg_relation_size('testable')); // 查看表的大小
  • select pg_size_pretty(pg_total_relation_size('testable')); // 查看表的总大小包括索引
  • select pg_size_pretty(pg_tablespace_size('tbs_data')); // 查看表的总大小包括索引
  • ​select spcname from pg_tablespace; // 查看所有表空间信息
  • VACUUM FULL testtable; // 释放表空间

上述中,需要注意使用 VACUUM FULL testtable 这条命令,使用 VACUUM 命令会使当前 Postgres backing service 所使用的磁盘容量变大,因为命令会涉及到磁盘内容的复制,所以要执行命令前,需要预估当前 backing service 的剩余磁盘容量是否能支持命令的使用?

二、VACUUM FULL 介绍

VACUUM FULL 命令是 PostgreSQL 数据库中用于回收磁盘空间的命令之一。当执行 DELETE、UPDATE,或者通过 TRUNCATE 删除表中的数据时,实际这些删除的数据仍会占据磁盘空间。为了回收这些空间,就需要执行 VACUUM FULL 命令。

执行 VACUUM FULL 命令时,PostgreSQL 会创建一个新的表副本并将未删除的数据复制到其中(这也是为什么在 CF 中需要确保 VACUUM FULL 命令执行时,backing service 所占用的磁盘空间会增大)。一旦复制完成,原始表占据的磁盘空间就会被回收。由于 VACUUM FULL 命令需要创建一个新表,所以其执行的时间相对较长。

2.1 命令执行时间预估

针对 VACUUM FULL 命令的持续时间估算,可以参考以下两种预估方法:

  1. 查看日志
    在 VACUUM FULL 命令执行时,PostgreSQL 会将进展信息写入服务器日志文件。使用者可以从日志中查找类似于 "vacuuming database.table" 的记录,并根据其中的时间戳对持续时间进行估算。
    以以下日志记录为例:
    2019-11-01 11:11:00  UTC:LOG:  duration: 5000.000 ms  statement: VACUUM FULL ANALYZE mydatabase.mytable;

    上述日志记录中的 "duration: 5000.000 ms" 表示 VACUUM FULL 命令的执行时间为 5000 毫秒,即 5 秒钟。

  2. 使用 pg_stat_progress_vacuum 视图
    PostgreSQL 提供了一个系统视图 pg_stat_progress_vacuum,用于查看 VACUUM 进度信息。使用者可以通过查询该视图来获取当前正在执行的 VACUUM FULL 命令的进度信息。
    以下是一个示例查询:
    SELECT * FROM pg_stat_progress_vacuum;

    该查询将返回一个结果集,其中会包含 VACUUM FULL 命令的当前状态、已完成的工作量以及预估完成时间等信息。根据其中的信息,我们可以对 VACUUM FULL 命令的持续时间进行估算。

知识库文章 ID# KB000132185_ZH_CN

内容

摘要详细信息

关联组件

Cloud Foundry PostgreSQL