Noções Básicas da CLI do Linux para DBAs
10 exemplos para sinais de disco e memória durante tempestades de consultas em hosts Linux com PostgreSQL 18.4 - triagem com bash antes de alterar GUCs ou fazer failover.
Pré-requisitos
- SSH para o bastion ou
kubectl execpara o pod do banco de dados (função somente leitura para juniores). - Conhecer o caminho do
PGDATA:/var/lib/postgresql/18/mainou o ponto de montagem específico do provedor. psqlno PATH com política de credenciais de produção somente leitura.
export PGDATA=/var/lib/postgresql/18/main
export DATABASE_URL="postgresql://readonly@localhost:5432/myapp"Exemplos Básicos
1. Espaço em Disco no PGDATA
df -h "$PGDATA"
df -i "$PGDATA" # exaustão de inodes parece disco cheio
du -sh "$PGDATA/pg_wal" "$PGDATA/log" 2>/dev/null || true- O crescimento do WAL sem sucesso de arquivamento enche o disco antes dos arquivos de dados
- Disco 100% → o Postgres pode parar de aceitar gravações com PANIC ou FATAL
2. Sinais de Pressão de Memória
free -h
vmstat 1 5
dmesg -T | tail -30 | grep -i -E 'oom|kill|postgres'SELECT name, setting, unit FROM pg_settings
WHERE name IN ('shared_buffers','work_mem','maintenance_work_mem','effective_cache_size');- O OOM killer tem como alvo o worker
postgrescom alto RSS durante tempestades de sort/hash work_memvezes as ordenações concorrentes podem exceder a RAM sem limites de pool de conexões
3. Quem Está Executando O Quê
SELECT pid, usename, application_name, client_addr, state, wait_event_type, wait_event,
now() - query_start AS duration, left(query, 100) AS query
FROM pg_stat_activity
WHERE datname = current_database() AND pid <> pg_backend_pid()
ORDER BY duration DESC NULLS LAST
LIMIT 20;wait_event_type = IOdurante tempestade de checkpoint ou seq scanidle in transactionretém locks e aumenta o vacuum
4. Contagem Rápida de Esperas de Lock
SELECT count(*) FILTER (WHERE NOT granted) AS waiting,
count(*) FILTER (WHERE granted) AS granted
FROM pg_locks;# Linha única do shell via psql
psql "$DATABASE_URL" -t -c "SELECT count(*) FROM pg_locks WHERE NOT granted;"5. Saúde do Serviço Postgres (systemd)
sudo systemctl status postgresql@18-main
sudo journalctl -u postgresql@18-main -p err --since "30 min ago" --no-pager- Loop de reinicialização geralmente se correlaciona com OOM ou configuração corrompida após edição
- O journal mostra
FATAL: could not write lock fileem disco cheio
6. Encontrar Processos Postgres
ps aux | grep '[p]ostgres'
pgrep -a postgres# Principais workers do postgres por RSS
ps -eo pid,rss,cmd --sort=-rss | grep postgres | head -10- Muitas linhas
postgres: workersão normais; um worker com RSS gigante pode ser um nó de sort/hash
7. Conexões de Rede para a Porta 5432
ss -tnp | grep ':5432'
ss -s # resumo: established, timewait- Tempestade de conexões do aplicativo sem pooler mostra milhares de ESTAB
- Compare com
max_connectionsem SQL
Exemplos Intermediários
8. Script de Pacote de Incidentes
#!/usr/bin/env bash
set -euo pipefail
OUT="incident-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$OUT"
df -h > "$OUT/df.txt"
free -h > "$OUT/free.txt"
vmstat 1 5 > "$OUT/vmstat.txt"
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "SELECT version();" > "$OUT/version.txt"
psql "$DATABASE_URL" -c "SELECT * FROM pg_stat_activity;" > "$OUT/activity.csv" --csv
psql "$DATABASE_URL" -c "SELECT * FROM pg_locks WHERE NOT granted;" > "$OUT/locks.csv" --csv
tar czf "$OUT.tgz" "$OUT"
echo "bundle: $OUT.tgz"- Anexe o pacote ao ticket de incidente nos primeiros 15 minutos
- O scribe executa o script; o comandante do incidente interpreta
9. Correlacionar IO do Host com Tempestade de Consultas
iostat -xz 1 5SELECT queryid, calls, mean_exec_time, shared_blks_read
FROM pg_stat_statements
ORDER BY shared_blks_read DESC NULLS LAST
LIMIT 10;- Aumento de
%utilno volume de dados mais scans sequenciais nas principais instruções → problema de índice ou cache - Veja Ferramentas de IO e Memória
10. Parada Segura do Postgres vs. Kill
# Graceful (systemd)
sudo systemctl stop postgresql@18-main
# Emergência apenas após falha da parada
sudo kill -TERM "$(head -1 "$PGDATA/postmaster.pid")"
sleep 10
# kill -9 último recurso - arrisca checkpoint incompletoSIGKILLno postmaster arrisca a recuperação na próxima inicialização; documente no post-mortem
FAQs
Instalar ferramentas extras no host do banco de dados de produção?
Prefira bastion com sysstat (iostat), htop. Imagem mínima de produção: use vmstat, ps, df sempre presentes.
kubectl exec vs SSH?
Kubernetes: kubectl exec -it pod -- bash e depois os mesmos comandos. Caminho PGDATA a partir do env ou psql -c 'SHOW data_directory;'.
Quando escalar para failover?
Hardware morto, PANIC de corrupção ou disco irrecuperável - não para toda tempestade de locks. Veja Habilidade de Triagem de Incidentes.
Relacionados
- Ferramentas de IO e Memória - iostat, vmstat, pidstat
- Melhores Práticas da CLI - Resumo de 25 itens
- Habilidade de Triagem de Incidentes - árvore de decisão
- Disco Cheio no PGDATA - runbook de WAL
- Triagem de Tempestade de Locks - consultas bloqueadoras
Versões de Stack: Esta página foi escrita para PostgreSQL 18.4 no Linux (systemd, layouts Debian/RHEL).