Introdução ao Tópico
O Oracle BBED é uma ferramenta avançada para análise de blocos de dados. O PostgreSQL oferece um conjunto de extensões e utilitários de linha de comando que permitem realizar operações de inspeção semelhantes, embora de forma mais modular e segura.
Estrutura do Diretório de Dados
Os arquivos de dados do PostgreSQL estão organizados da seguinte forma, com parâmetros-chave como block_size = 8192 e segment_size = 1GB.
/caminho/para/dados/postgresql/16/main/
├── base/ # Arquivos dos bancos de dados
│ ├── 1/ # template1
│ ├── 4/ # template0
│ ├── 5/ # postgres
│ └── 16448/ # Banco de dados do usuário
├── global/ # Tabelas do sistema compartilhadas
├── pg_wal/ # Logs de WAL
├── pg_tblspc/ # Links de tablespace
└── pg_xact/ # Estado de commit de transações
Composição Interna de uma Página
Cada página de 8KB no PostgreSQL contém um cabeçalho, ponteiros para itens, espaço livre, tuplas e um espaço especial para índices. O cabeçalho da página tem 24 bytes e inclui campos como pd_lsn e pd_checksum.
| Deslocamento | Campo | Tamanho | Descrição |
|---|---|---|---|
| 0-7 | pd_lsn | 8 bytes | Última posição WAL modificada |
| 8-9 | pd_checksum | 2 bytes | Soma de verificação da página |
| 10-15 | pd_lower / pd_upper | 2 bytes cada | Limites do espaço livre |
| 16-17 | pd_special | 2 bytes | Início do espaço especial |
| 18-19 | pd_pagesize_version | 2 bytes | Tamanho e versão da página |
| 20-23 | pd_prune_xid | 4 bytes | XID mais antigo para possível pruning |
Utilizando a Extensão pageinspect
Para instalar a extensão e realizar análises deatlhadas das páginas:
-- Criar a extensão
CREATE EXTENSION IF NOT EXISTS pageinspect;
-- Encontrar o caminho do arquivo para uma tabela
SELECT pg_relation_filepath('tabela_teste'::regclass);
-- Analisar o cabeçalho da página
SELECT * FROM page_header(get_raw_page('tabela_teste', 0));
A saída mostra detalhes como LSN, flags e limites de espaço. Para examinar as tuplas:
-- Listar itens na página
SELECT
lp_num AS item_number,
lp_offset AS posicao,
lp_len AS tamanho,
xmin_trans AS xmin,
xmax_trans AS xmax,
ctid_tuple AS ctid
FROM heap_page_items(get_raw_page('tabela_teste', 0));
Esta extensão também permite inspecionar índices B-tree com funções como bt_page_stats e bt_page_items.
Análise de Logs WAL com pg_waldump
O utilitário pg_waldump permite visualizar operações registradas nos logs de WAL. Exemplo de uso:
# Exibir conteúdo de um arquivo WAL
pg_waldump /caminho/para/pg_wal/000000010000000000000006
# Filtrar por intervalo LSN
pg_waldump -s 0/6BE4758 -e 0/6BE4800 /caminho/para/wal
# Filtrar por relação específica
pg_waldump -r 1663/16448/16450 /caminho/para/wal
A saída inclui campos como gerenciador de recursos, tamanho do registro e descrição da operação.
Estatísticas Físicas com pgstattuple
Instale a extensão e use funções para obter métricas do armazenamento:
CREATE EXTENSION IF NOT EXISTS pgstattuple;
-- Estatísticas da tabela
SELECT * FROM pgstattuple('tabela_teste');
-- Estatísticas de índice
SELECT * FROM pgstatindex('idx_nome_teste');
Estas funções fornecem informações sobre contagem de tuplas, espaço livre e fragmentação.
Visualização de Dados Brutos
Ferramentas do sistema como hexdump podem ser usadas para inspecionar arquivos diretamente:
# Visualizar início do arquivo de dados
sudo hexdump -C /caminho/para/dados/postgresql/16/main/base/16448/16450 | head -40
# Extrair bytes específicos, como pd_lsn
sudo od -A x -t x1 -N 8 /caminho/para/arquivo_de_dados
Isso ajuda a verificar a integridade dos dados em nível bruto.
Comparação com Oracle BBED
| Funcionalidade | Oracle BBED | Ferramentas PostgreSQL |
|---|---|---|
| Exibir bloco de dados | SET BLOCK |
page_header(get_raw_page()) |
| Exibir cabeçalho | MAP |
page_header() |
| Exibir tuplas | DUMP |
heap_page_items() |
| Análise de WAL | LogMiner | pg_waldump |
| Verificação de checksum | SUM APPLY |
page_checksum() |
| Modificação de dados | MODIFY |
Não recomendado |
As ferramentas do PostgreSQL oferecem uma abordagem mais segura e baseada em SQL, sem suporte nativo para edição direta de blocos.
Ferramentas Disponíveis no PostgreSQL
Utilitários Internos
pg_waldump: Análise de logs WALpg_controldata: Informações do arquivo de controlepg_checksums: Verificação de checksum de dadospg_resetwal: Redefinição de WAL
Extensões Internas
pageinspect: Análise de conteúdo de páginaspgstattuple: Estatísticas físicas de tabelaspg_walinspect: Aálise de conteúdo WAL (a partir do PG15)
Ferramentas de Terceiros
pg_filedump: Ferramenta para despejo de arquivoswal-g: Gerenciamento de arquivamento de WAL