问题描述
我的 RDS for PostgreSQL 占用的存储空间不符合预期,我该如何排查此类问题?
问题分析
RDS for PostgreSQL 消耗的存储空间主要包含如下方面:
- 数据文件
- WAL 日志
- 未消耗的 replication slot
- 数据库日志
- 临时文件
- ……
在我们进行排查此问题时,可以从这个方面进行。由于篇幅限制,本章内容仅包含数据文件部分,其他方面请查看后续文章[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 如果您有其他问题,欢迎您联系火山引擎技术支持服务