如何排查 PostgreSQL 存储空间占用问题-1

数据库关系型数据库技术服务知识库
问题描述

我的 RDS for PostgreSQL 占用的存储空间不符合预期,我该如何排查此类问题?

问题分析

RDS for PostgreSQL 消耗的存储空间主要包含如下方面:

  1. 数据文件
  2. WAL 日志
  3. 未消耗的 replication slot
  4. 数据库日志
  5. 临时文件
  6. ……

在我们进行排查此问题时,可以从这个方面进行。由于篇幅限制,本章内容仅包含数据文件部分,其他方面请查看后续文章[1]。

解决方案

显示数据库的大小

postgres=# select pg_database.datname, pg_size_pretty (pg_database_size(oid)) AS size from pg_database;
  datname  |  size   
-----------+---------
 postgres  | 8053 kB
 template1 | 7585 kB
 template0 | 7585 kB
 rudonx1   | 7705 kB
 rudonx    | 1268 MB
(5 rows)

或者您可以使用如下命令进行查看:size 部分会显示数据库的大小

rudonx=# \l+

如果您想查看单独查询某一个数据库的大小,可以使用如下 SQL 语句:

postgres=# select pg_size_pretty (pg_database_size('rudonx'));
 pg_size_pretty 
----------------
 1268 MB
(1 row)

查看表大小

进入到某一个数据库中,列出每一个表大小,其中包含数据和索引大小:

postgres=# \c rudonx
You are now connected to database "rudonx" as user "rudonx".

rudonx=# select relname, pg_size_pretty(pg_total_relation_size(relid)) as size from pg_stat_user_tables;
        relname        |    size    
-----------------------+------------
 test                  | 216 MB
 tbl_test              | 73 MB
 test1                 | 0 bytes
 reindex_test          | 857 MB
 ……
(15 rows)

如果您想查看单个表的数据和索引占用情况,可以采用如下方式:

# 表结构如下:
rudonx=# \d reindex_test
                        Table "public.reindex_test"
   Column    |            Type             | Collation | Nullable | Default 
-------------+-----------------------------+-----------+----------+---------
 id          | integer                     |           |          | 
 name        | character varying(100)      |           |          | 
 create_date | timestamp without time zone |           |          | 
Indexes:
    "old_index" btree (create_date)

# 仅查看索引大小:
rudonx=# SELECT pg_size_pretty(pg_indexes_size('reindex_test'));
 pg_size_pretty 
----------------
 214 MB
(1 row)

# 单独查看数据大小:
rudonx=# select pg_size_pretty(pg_relation_size('reindex_test')) as size;
  size  
--------
 643 MB
(1 row)

# 最后,查看数据和索引的总大小:
rudonx=# select pg_size_pretty(pg_total_relation_size('reindex_test')) as size;
  size  
--------
 857 MB
(1 row)

pg_relation_size() 不包括索引的大小,但是 pg_total_relation_size() 会将索引的大小也计算进来。

查询表空间大小

分别列出所有表空间的大小:

rudonx=# SELECT spcname,pg_size_pretty(pg_tablespace_size(pg_tablespace.spcname)) from pg_tablespace;
  spcname   | pg_size_pretty 
------------+----------------
 pg_default | 1298 MB
 pg_global  | 662 kB
(2 rows)

如果您想查看某一个具体的表空间,可以采用如下语句:

rudonx=# select pg_size_pretty(pg_tablespace_size('pg_default')) as size;
  size   
---------
 1298 MB
(1 row)
参考文档

[1] 如何排查 PostgreSQL 存储空间占用问题-2 如果您有其他问题,欢迎您联系火山引擎技术支持服务

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论