Comando Tamanho do DB do Postgres

324

Existe algum comando para encontrar todo o tamanho dos bancos de dados no Postgres?

Consigo encontrar o tamanho de um banco de dados específico usando o seguinte comando:

select pg_database_size('databaseName');
Mente linda
fonte
1
Qual é a sua unidade? Está em bytes?
Abel Callejo
São bytes. :-)
john16384 28/04

Respostas:

365

E ... Se você não desejar digitar uma consulta inteira ... também poderá digitar ...

\l+ <database_name>

e você obterá alguns detalhes sobre o banco de dados, incluindo o tamanho do banco de dados.

E ... Para obter tamanhos de todos os bancos de dados.

você pode simplesmente digitar ...

\l+

Pode ser necessário entrar no prompt de comando do postgresql para consultar com esses comandos auxiliares do postgresql.

Verifique outros comandos auxiliares do postgresql digitando

\?

no prompt de comando do postgresql.

Ashish
fonte
193

Você pode obter os nomes de todos os bancos de dados aos quais você pode se conectar na tabela de sistema "pg_datbase". Basta aplicar a função aos nomes, como abaixo.

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;

Se você pretende que a saída seja consumida por uma máquina em vez de um humano, você pode cortar a função pg_size_pretty ().

Mike Sherrill 'Recorde Gato'
fonte
Às vezes, o banco de dados também contém índices. Tem algum valor de armazenamento. Estou procurando um comando que forneça o tamanho do banco de dados completo.
Mente Brilhante
11
@ user2151087: pg_database_size() inclui os tamanhos dos índices
a_horse_with_no_name
Caso alguém esteja se perguntando, essa consulta fornece exatamente os mesmos valores que \l+. Porém, o formato de saída é mais fácil de ler (menos colunas). Troca entre gravabilidade e legibilidade…
Skippy le Grand Gourou
158
-- Database Size
SELECT pg_size_pretty(pg_database_size('Database Name'));
-- Table Size
SELECT pg_size_pretty(pg_relation_size('table_name'));
Srinivasreddy Jakkireddy
fonte
5
Como essa resposta é diferente da de Mike?
A_horse_with_no_name 20/09/2013
3
Para o futuro eu e outros que chegarem aqui, pouparei o problema: Este é mais curto e para o banco de dados / tabela nomeado em que o Mike é para todos os bancos de dados no servidor dos quais o último responde melhor à pergunta original.
James Brown
78

Com base na resposta aqui de @Hendy Irawan

Mostrar tamanhos do banco de dados:

\l+

por exemplo

=> \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 | 

Mostrar tamanhos de tabela:

\d+

por exemplo

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

Só funciona em psql.

owyongsk
fonte
1
Para mim, a apenas \d+ *trabalhou, plain \d+voltouDid not find any relations.
phil Pirozhkov
1
@philpirozhkov Conecte-se a um banco de dados primeiro ( \c dbname), depois faça \d+.
chappjc
Esse é um número um ou um L minúsculo?
dman
28

Sim, existe um comando para encontrar o tamanho de um banco de dados no Postgres. É o seguinte:

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;
Anoop Sharma
fonte
3
O pedido está errado nesta função. Não pode dizer a diferença entre formatos legíveis por humanos. Por exemplo, o banco de dados de tamanho 7151 KB é anterior ao banco de dados de tamanho 7 GB.
Onnimonni
Corrigido: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
1
Eu acho que você precisa do tamanho "bruto" para classificar apenas. Eu usei isso em vez de uma subconsulta SELECT pg_database.datname AS "DB Name", pg_size_pretty(pg_database_size(pg_database.datname)) AS "Size" FROM pg_database ORDER BY (pg_database_size(pg_database.datname)) DESC;.
M-Dahab
20
SELECT pg_size_pretty(pg_database_size('name of database'));

Fornecerá o tamanho total de um banco de dados específico, no entanto, acho que você não pode fazer todos os bancos de dados em um servidor.

No entanto, você poderia fazer isso ...

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;
$$
Shaun McCready
fonte
por que não pode ser uma única consulta pg_databasee não esse hediondo pl / pgsql?
MozenRath 01/07/19
12

No wiki do PostgreSQL .


NOTA: Os bancos de dados aos quais o usuário não pode se conectar são classificados como se fossem de tamanho infinito.

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

A página também possui trechos para encontrar o tamanho de suas maiores relações e maiores tabelas.

GollyJer
fonte
4

Você pode usar a consulta abaixo para encontrar o tamanho de todos os bancos de dados do PostgreSQL.

Referência é retirada deste blog.

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;
Anvesh
fonte
3

Inicie o pgAdmin, conecte-se ao servidor, clique no nome do banco de dados e selecione a guia de estatísticas. Você verá o tamanho do banco de dados na parte inferior da lista.

Então, se você clicar em outro banco de dados, ele permanecerá na guia de estatísticas, para que você possa ver facilmente vários tamanhos de banco de dados sem muito esforço. Se você abrir a lista de tabelas, mostrará todas as tabelas e seus tamanhos.

SPRBRN
fonte
1
E se você clicar no Databasesnó da árvore (conectado a uma conexão com o banco de dados) e selecionar a Statisticsguia, será apresentado um bom resumo de todos os bancos de dados e seus tamanhos (terceira coluna).
zloster
2
du -k /var/lib/postgresql/ |sort -n |tail
Jon Carnes
fonte
2
Você pode querer adicionar mais contexto sobre as premissas Isso faz com que re onde o banco de dados é armazenar seus dados, o que a saída deste será semelhante, etc.
fzzfzzfzz
3
Embora essa possa ser uma resposta precisa, é uma boa prática incluir algumas explicações.
Sniperd
O comando correto no CentOS é este: du -k /var/lib/pgsql/ | sort -n | tail
Feriman