Capítulo 24. Monitoramento da utilização de disco

Sumário
24.1. Determinação da utilização de disco
24.2. Falha de disco cheio

Este capítulo discute como monitorar a utilização de disco por um sistema de banco de dados PostgreSQL.

24.1. Determinação da utilização de disco

Cada tabela possui um arquivo em disco heap [1] [2] [3] primário, onde a maior parte dos dados são armazenados. Se a tabela possuir alguma coluna com valor potencialmente longo, também existirá um arquivo TOAST associado à tabela, utilizado para armazenar os valores muito longos para caber confortavelmente na tabela principal (consulte a Seção 50.2). Haverá um índice para a tabela TOAST, caso esta esteja presente. Também podem haver índices associados à tabela base. Cada tabela e índice é armazenado em um arquivo em disco separado — possivelmente mais de um arquivo, se o arquivo exceder um gigabyte. As convenções para atribuir nomes a estes arquivos estão descritas na Seção 50.1.

O espaço em disco pode ser monitorado a partir de três lugares: do psql utilizando as informações do VACUUM, do psql utilizando as ferramentas presentes em contrib/dbsize, e da linha de comando utilizando as ferramentas presentes em contrib/oid2name. Utilizando o psql em um banco de dados onde o comando VACUUM ou ANALYZE foi executado recentemente, podem ser efetuadas consultas para ver a utilização do espaço em disco de qualquer tabela:

cep=# VACUUM ANALYZE;
VACUUM

cep=# SELECT relname, relfilenode, relpages
cep-# FROM pg_class
cep-# WHERE relname LIKE 'tbl_cep_%'
cep-# ORDER BY relname;

     relname      | relfilenode | relpages
------------------+-------------+----------
 tbl_cep_ac       |       17145 |       12
 tbl_cep_al       |       17148 |       63
 tbl_cep_am       |       17151 |       91
 tbl_cep_ap       |       17154 |        9
 tbl_cep_ba       |       17157 |      260
 tbl_cep_ce       |       17163 |      216
 tbl_cep_df       |       17166 |      289
 tbl_cep_es       |       17169 |      218
 tbl_cep_especial |       17229 |      213
 tbl_cep_go       |       17172 |      316
 tbl_cep_ma       |       17175 |       67
 tbl_cep_mg       |       17178 |      763
 tbl_cep_mrj      |       17181 |      300
 tbl_cep_ms       |       17184 |      129
 tbl_cep_mt       |       17233 |      112
 tbl_cep_pa       |       17187 |      139
 tbl_cep_pb       |       17190 |      105
 tbl_cep_pe       |       17193 |      450
 tbl_cep_pi       |       17196 |       41
 tbl_cep_pr       |       17199 |      482
 tbl_cep_rj       |       17202 |      842
 tbl_cep_rn       |       17205 |       94
 tbl_cep_ro       |       17208 |       34
 tbl_cep_rr       |       17211 |       13
 tbl_cep_rs       |       17214 |      401
 tbl_cep_sc       |       17217 |      245
 tbl_cep_se       |       17220 |       34
 tbl_cep_sp       |       17223 |     2755
 tbl_cep_to       |       17226 |       46
 tbl_cep_uf       |       17231 |        1
(30 linhas)

Cada página possui, normalmente, 8 kilobytes (Lembre-se, relpages somente é atualizado por VACUUM, ANALYZE e uns poucos comandos de DDL como CREATE INDEX). O valor de relfilenode possui interesse caso se deseje examinar diretamente o arquivo em disco da tabela.

Para ver o espaço utilizado pelas tabelas TOAST deve ser utilizada uma consulta como a mostrada abaixo:

-- Ver as tabelas TOAST da tabela pg_rewrite
cep=# SELECT relname, relpages
cep-#    FROM pg_class,
cep-#         (SELECT reltoastrelid FROM pg_class
cep(#          WHERE relname = 'pg_rewrite') ss
cep-#    WHERE oid = ss.reltoastrelid
cep-#       OR oid = (SELECT reltoastidxid FROM pg_class
cep(#                 WHERE oid = ss.reltoastrelid)
cep-#    ORDER BY relname;

       relname        | relpages
----------------------+----------
 pg_toast_16410       |       14
 pg_toast_16410_index |        2
(2 linhas)

Os tamanhos dos índices também podem ser facilmente exibidos:

cep=# ALTER TABLE tbl_cep_sp ADD PRIMARY KEY (cep);
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "tbl_cep_sp_pkey"
         for table "tbl_cep_sp"
ALTER TABLE

cep=# SELECT c2.relname, c2.relpages
cep-#    FROM pg_class c, pg_class c2, pg_index i
cep-#    WHERE c.relname = 'tbl_cep_sp'
cep-#        AND c.oid = i.indrelid
cep-#        AND c2.oid = i.indexrelid
cep-#    ORDER BY c2.relname;

     relname     | relpages
-----------------+----------
 tbl_cep_sp_pkey |      619
(1 linha)

-- Verificar se relpages foi atualizada na criação do índice

cep=# VACUUM FULL ANALYZE;
VACUUM

cep=# SELECT c2.relname, c2.relpages
cep-#    FROM pg_class c, pg_class c2, pg_index i
cep-#    WHERE c.relname = 'tbl_cep_sp'
cep-#        AND c.oid = i.indrelid
cep-#        AND c2.oid = i.indexrelid
cep-#    ORDER BY c2.relname;

     relname     | relpages
-----------------+----------
 tbl_cep_sp_pkey |      619
(1 linha)

-- O valor de relpages não mudou após VACUUM FULL ANALYZE

Utilizando a consulta abaixo, é fácil descobrir quais são as quatro maiores tabelas e índices:

cep=# SELECT relname, relpages
cep-#    FROM pg_class
cep-#    ORDER BY relpages DESC
cep-#    LIMIT 4;

     relname     | relpages
-----------------+----------
 tbl_cep_sp      |     2754
 tbl_cep_rj      |      841
 tbl_cep_mg      |      762
 tbl_cep_sp_pkey |      619
(4 linhas)

-- Como pode ser visto, VACUUM FULL ANALYZE diminuiu uma página
-- de tbl_cep_sp após VACUUM ANALYZE (2755 para 2754).

Calcular o número de páginas da tabela tbl_cep_sp através das informações do sistema de arquivos, utilizando o nome de arquivo presente em relfilenode (N. do T.):

$ locate 17223 | grep /var/lib/pgsql/data/base/
/var/lib/pgsql/data/base/17142/17223
$ ls -l /var/lib/pgsql/data/base/17142/17223
-rw-------  1 postgres postgres 22560768 Jul 28 07:44 /var/lib/pgsql/data/base/17142/17223
$ expr 22560768 / 8 / 1024
2754

Como cada página possui 8 kilobytes, dividindo-se o tamanho do arquivo igual a 22.560.768 bytes por 8 e por 1024 chega-se a um número de páginas igual a 2754, o mesmo informado pela consulta.

A ferramenta contrib/dbsize carrega funções no banco de dados que permitem descobrir o tamanho da tabela ou do banco de dados a partir do psql sem necessidade do VACUUM ou do ANALYZE.

Para mostrar a utilização de disco também pode ser utilizada a ferramenta contrib/oid2name. Veja exemplo em README.oid2name neste diretório. Inclui um script que mostra utilização de disco para cada banco de dados.

Notas

[1]

OracleHEAP indica que as linhas de dados da tabela não são armazenadas em nenhuma ordem específica. Este é o padrão. Oracle Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01® (N. do T.)

[2]

SQL Serverheap é uma tabela sem um índice agrupado (clustered). SQL Server 2005 Books Online — Heap Structures (N. do T.)

[3]

DB2 — As tabelas regulares são implementadas como heap. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

SourceForge.net Logo CSS válido!