[英]How to find a breakdown of db size to identify the high space consumer - postgresql
我正在尝试查找我的数据库的大小
我尝试了以下代码
选项1
select t1.datname AS db_name,
pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
order by pg_database_size(t1.datname) desc;
选项 2
\l+
对于db1
,这两个选项都返回 ~2500 GB 的 output 。 但事实是我们的数据(对于 db1)只有 50 GB 左右。
这个 2500 GB 的大小似乎是不可能的(根据我的知识)。
你们能帮我理解表定义、索引设置等是否会占用这么多空间吗?
有没有办法找出是哪一个导致/消耗了如此巨大的空间? 我想知道db1的故障。 所以,我可以找出 db1 的哪个部分占用了这么多空间。 理想情况下,db1 的数据只有 40-50 GB。
选项 1 output
"db1" "2533 GB"
"dreAm" "23 GB"
"db2" "23 GB"
"db3" "20 MB"
"postgres" "7481 kB"
"template1" "7481 kB"
"template0" "7473 kB"
选项 2 output
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
-----------+-------------+----------+------------+------------+-----------------------------+---------+------------+--------------------------------------------
db2 | test2 | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/dc +| 23 GB | pg_default |
| | | | | dc=CTc/dc +| | |
| | | | | webapi_sa=c/dc | | |
db3 | dream | UTF8 | en_US.utf8 | en_US.utf8 | | 23 GB | pg_default |
db1 | test1 | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/kt +| 2533 GB | pg_default |
| | | | | ktph=CTc/kt +| | |
| | | | | webapi_sa=c/ktph +| | |
| | | | | za=c/kt | | |
test | test_admin | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/test_admin +| 20 MB | pg_default | test database
| | | | | test_admin=CTc/test_admin+ | | |
| | | | | test_app=Tc/test_admin | | |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | 7481 kB | pg_default | default administrative connection database
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +| 7473 kB | pg_default | unmodifiable empty database
| | | | | postgres=CTc/postgres | | |
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +| 7481 kB | pg_default | default template for new databases
虽然我找到了占用最大 memory 的架构,但我无法使用以下代码列出该架构下的表大小
select table_name, pg_size_pretty(pg_total_relation_size(quote_ident(table_name)))
from information_schema.tables
where table_schema = 'results'
order by pg_total_relation_size(quote_ident(table_name));
当我执行上述操作时,我收到一条错误消息ERROR: relation "metadata" does not exist SQL state: 42P01
但是我们的数据库中确实有metadata
表。 然而,它是空的。 我可以知道为什么会这样吗? 有没有其他方法可以找到每个模式下的表大小?
您的一张或多张桌子臃肿。
连接到数据库并找到您最大的对象:
SELECT oid::regclass,
pg_table_size(oid) AS size
FROM pg_class
ORDER BY size DESC;
这包括 TOAST 表大小。
找到候选人后,使用pgstattuple
确认膨胀:
CREATE EXTENSION pgstattuple;
\x
SELECT * FROM pgstattuple_approx('bloated_table');
修复VACUUM (FULL)
的问题并调查并修复原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.