Postgres数据库大小命令

517

如何查找 所有 数据库的大小?

我可以使用以下命令查找特定数据库的大小:

select pg_database_size('databaseName');

8
它的单位是什么?是以字节为单位吗? - Abel Callejo
5
这是字节。 :-) - john16384
14
仅作为一个小提示:使用 select pg_database_size('databaseName')/1024/1024; 可以得到更易读的兆字节。 - Markus
21
@Markus,顺便说一下:select pg_size_pretty(pg_database_size('databaseName')); 可以给你更好的人性化大小,无论大小是多少。(当你在TB时,用MB阅读会有点困难) - Stephen
11个回答

595
您可以输入以下psql元命令来获取指定数据库的一些详细信息,包括其大小:
\l+ <database_name>

要获取您可以连接的所有数据库的大小:

\l+

如果我只想知道一个模式的大小,有没有其他方法可以做到,而不是使用这种方法 - luisvenezian

326
你可以从"pg_database"系统表中获取所有可以连接的数据库的名称。只需将函数应用于这些名称,如下所示。
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;
如果您打算将输出供机器而不是人类使用,可以省略pg_size_pretty()函数。

有时数据库也包含索引。它们占用一定的存储空间。我正在寻找一个命令,可以提供完整数据库的大小。 - Beautiful Mind
13
pg_database_size()函数返回的值包括索引的大小。 - user330315
4
如果有人想知道的话,这个查询提供的结果与\l+完全相同。但输出格式更易读(列数更少)。这是可写性和可读性之间的权衡。 - Skippy le Grand Gourou

230
-- Database Size
SELECT pg_size_pretty(pg_database_size('Database Name'));
-- Table Size
SELECT pg_size_pretty(pg_relation_size('table_name'));

5
这个答案和迈克的答案有什么不同? - user330315
9
为了未来的我和其他人,我会帮你省点麻烦:这个更加简短,适用于指定数据库/表名,而 Mike's 则适用于服务器上的所有数据库。后者回答了原始问题得更好。 - James Brown
1
寻找所有数据库大小的命令是什么? - DylanYoung

93
根据这里@Hendy Irawan的答案。

显示数据库大小:

\l+

例如:

=> \l+
 berbatik_prd_commerce    | berbatik_prd     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 19 MB   | pg_default | 
 berbatik_stg_commerce    | berbatik_stg     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8633 kB | pg_default | 
 bursasajadah_prd         | bursasajadah_prd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1122 MB | pg_default | 

显示表格大小:

\d+

例如:

=> \d+
 public | tuneeca_prd | table | tomcat | 8192 bytes | 
 public | tuneeca_stg | table | tomcat | 1464 kB    | 

仅适用于psql


2
对我来说,只有\d+ *有效,普通的\d+返回了“未找到任何关系”。 - phil pirozhkov
5
@philpirozhkov 首先连接到数据库 (\c dbname),然后执行 \d+ - chappjc

33

是的,Postgres有一个命令可以查找数据库的大小。命令如下:

SELECT pg_database.datname as "database_name", pg_size_pretty(pg_database_size(pg_database.datname)) AS size_in_mb FROM pg_database ORDER by size_in_mb DESC;

6
这个函数的排序方式有问题。它无法区分人类可读格式之间的差异。例如,大小为7151 KB的数据库排在大小为7 GB的数据库之前。 - onnimonni
1
修正:SELECT database_name, pg_size_pretty(size) from (SELECT pg_database.datname as "database_name", pg_database_size(pg_database.datname) AS size FROM pg_database ORDER by size DESC) as ordered; - Michael
3
我认为你仅需要“原始”大小以进行排序。我使用了这个而不是子查询 SELECT pg_database.datname AS "数据库名称", pg_size_pretty(pg_database_size(pg_database.datname)) AS "大小" FROM pg_database ORDER BY (pg_database_size(pg_database.datname)) DESC; - M-Dahab

31
SELECT pg_size_pretty(pg_database_size('name of database'));

这个操作将会给出某个数据库的总大小,但是我不认为你可以对服务器中的所有数据库执行此操作。

然而,你可以尝试以下操作...

DO
$$
DECLARE
r   RECORD;
db_size TEXT;
BEGIN
FOR r in
SELECT datname FROM pg_database
WHERE datistemplate = false
LOOP
db_size:= (SELECT pg_size_pretty(pg_database_size(r.datname)));

RAISE NOTICE 'Database:% , Size:%', r.datname , db_size;

END LOOP;
END;
$$

3
为什么不能从pg_database进行单个查询,而不是使用这种丑陋的pl/pgsql呢? - MozenRath

14

来自PostgreSQL Wiki.


注意:用户无法连接到的数据库被视为无限大小进行排序。

SELECT d.datname AS Name,  pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
        ELSE 'No Access'
    END AS Size
FROM pg_catalog.pg_database d
    ORDER BY
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(d.datname)
        ELSE NULL
    END DESC -- nulls first
    LIMIT 20

该页面还包含查找您最大关系和最大表格大小的片段。


8

打开pgAdmin,连接到服务器,在数据库名称上单击,然后选择统计选项卡。您将在列表底部看到数据库的大小。

然后如果您点击其他数据库,它将保持在统计选项卡上,因此您可以轻松地查看许多数据库大小,无需太多努力。如果您打开表格列表,它会显示所有表格及其大小。


4
如果您单击连接的“数据库”树节点,并选择“统计信息”选项卡,则会显示所有数据库及其大小的漂亮摘要(第三列)。 - zloster
2
同样的技巧可以用于查看表大小。截至今天(2023年),在pgAdmin 4上也可行。 - DarkCygnus

5
你可以使用以下查询来查找所有PostgreSQL数据库的大小。 参考自此博客。
SELECT 
    datname AS DatabaseName
    ,pg_catalog.pg_get_userbyid(datdba) AS OwnerName
    ,CASE 
        WHEN pg_catalog.has_database_privilege(datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(datname))
        ELSE 'No Access For You'
    END AS DatabaseSize
FROM pg_catalog.pg_database
ORDER BY 
    CASE 
        WHEN pg_catalog.has_database_privilege(datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(datname)
        ELSE NULL
    END DESC;

1
du -k /var/lib/postgresql/ | sort -n | tail

4
你可能需要添加更多关于此假设的上下文,例如数据库存储数据的位置,此操作的输出结果等。 - fzzfzzfzz
4
尽管这可能是一个准确的答案,但最好的做法是加上一些解释。 - sniperd
在CentOS上正确的命令是:du -k /var/lib/pgsql/ | sort -n | tail - Feriman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,