Esta é uma dica rápida para administradores de sistemas baseados no banco de dados PostgreSQL e que por alguma razão precise determinar o tamanho de suas bases de dados.
O PostgreSQL é um dos maiores SGBDR (Sistema Gerenciador de Bases de Dados Relacional) opensource e gratuito na atualidade. Usado em muitas soluções que requeiram este tipo de armazenamento de dados, ele compete lado a lado com outro gigante que é o Oracle MySQL e sua versão comunitária o MariaDB.
Em minha jornada administrando sistemas com o PostgreSQL, eventualmente precisei saber exatamente o tamanho das bases de dados que estavam em algum dos servidores que prestava manutenção.
Em alguns destes casos eu precisava apenas saber o quanto todo o conjunto ocupava o que bem simples de ser feito com ferramentas do próprio Linux, mas em outros casos era preciso saber o tamanho de apenas algumas bases de dados específicas e felizmente o PostgreSQL tem uma função pronta para encontrar esta informação.
Espaço ocupado por todas as bases de dados
Antes de mais nada é preciso saber onde estão os seus dados. Cada distribuição Linux define um caminho diferente para eles então, na dúvida, consulte o valor do parâmetro “data_directory” no arquivo de configuração “postgresql.conf” como abaixo:
grep 'data_directory' /etc/postgresql/8.4/main/postgresql.conf
data_directory = '/var/lib/postgresql/8.4/main' # use data in another directory
Este exemplo acima é que você veria se rodasse o comando em uma instalação antiga do Debian com postgresql 8.4, e por fim, uma vez sabendo onde estão os seus dados um comando “du” retornará a informação desejada.
sudo du -sh /var/lib/postgresql/8.4/main
11G /var/lib/postgresql/8.4/main
Espaço ocupado apenas por uma única base de dados
Em alguns casos você pode querer saber o tamanho exato de uma base de dados apenas.
No MySQL você encontrará os arquivos ou pastas de cada base de dados dentro do diretório de dados com seus nomes bem discriminados e facilmente você conseguirá somar o consumo de cada uma, mas no PostgreSQL as pastas e arquivos não possuem nomes intuitivos ou de fácil associação, logo é preciso um comando próprio para isso.
Digamos que eu queira saber o tamanho de uma base de dados chamada “contatos”. O comando para isso é uma simples instrução SELECT, como abaixo:
# SELECT pg_size_pretty( pg_database_size('contatos') );
pg_size_pretty
----------------
9959 MB
(1 row)
#
A função pg_database_size() é a responsável por retornar o tamanho da base de dados enquanto a pg_size_pretty() formata este valor de Bytes para KB, MB, GB etc.
Caso você precise do valor numérico em Bytes para realizar seus próprios cálculos apenas ignore a função pg_size_pretty(), assim:
# SELECT pg_database_size('contatos');
pg_database_size
------------------
10442462992
(1 row)
#
Espaço ocupado por cada uma de suas bases de dados
Para identificar o tamanho de várias (todas) bases de dados separadamente podemos usar um artifício que é listar todas as bases registradas na tabela interna “pg_database” e aplicar as funções acima na saída, como abaixo:
# SELECT datname,pg_size_pretty(pg_database_size(datname)) FROM pg_catalog.pg_database WHERE datname not like 'template%' ORDER BY datname;
datname | pg_size_pretty
----------+----------------
bacula | 12 GB
postgres | 5999 kB
(2 rows)
#
Neste caso note o uso da clausula WHERE onde eu pedi que as bases de “template” fossem omitidas da saída, neste caso, sobrando apenas duas bases de dados e que tiveram seus tamanhos listados.
E pra terminar, vale aqui a mesma dica com relação a formatação, caso precise dos números em bytes, remova a função “pg_size_pretty()” se necessitar dos valores brutos (em bytes).