如何整理 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 命令是 PostgreSQL 数据库中用于回收磁盘空间的命令之一。当执行 DELETE、UPDATE,或者通过 TRUNCATE 删除表中的数据时,实际这些删除的数据仍会占据磁盘空间。为了回收这些空间,就需要执行 VACUUM FULL 命令。
执行 VACUUM FULL 命令时,PostgreSQL 会创建一个新的表副本并将未删除的数据复制到其中(这也是为什么在 CF 中需要确保 VACUUM FULL 命令执行时,backing service 所占用的磁盘空间会增大)。一旦复制完成,原始表占据的磁盘空间就会被回收。由于 VACUUM FULL 命令需要创建一个新表,所以其执行的时间相对较长。
针对 VACUUM FULL 命令的持续时间估算,可以参考以下两种预估方法:
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 秒钟。
SELECT * FROM pg_stat_progress_vacuum;
该查询将返回一个结果集,其中会包含 VACUUM FULL 命令的当前状态、已完成的工作量以及预估完成时间等信息。根据其中的信息,我们可以对 VACUUM FULL 命令的持续时间进行估算。