de Banco
de Dados
Fabio Caiut
responsvel
pelo
Ministrio da
Cultura
Ministrio da
Sade
Ministrio da
Educao
Ministrio da
Cincia, Tecnologia
e Inovao
Administrao
de Banco
de Dados
Fabio Caiut
Administrao
de Banco
de Dados
Fabio Caiut
Rio de Janeiro
Escola Superior de Redes
2015
Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Jos Luiz Ribeiro Filho
Bibliografia: p.165.
ISBN 978-85-63630-51-3
1. Banco de dados administrao, gerenciamento. 2. Sistema de gerenciamento de
banco de dados (SGBD). 3. PostgreSQL.
I. Titulo.
CDD 005.7406
Sumrio
Escola Superior de Redes
A metodologia da ESRxi
Sobre o curso xii
A quem se destinaxii
Convenes utilizadas neste livroxiii
Permisses de usoxiii
Sobre o autorxiv
2. Operao e configurao
Operao do Banco de Dados21
Configurao do Banco de Dados30
Configurao por sesso31
Configurao por usurio31
Configurao por Base de Dados32
Consultando as configuraes atuais34
Consideraes sobre configuraes do Sistema Operacional34
iii
iv
5. Monitoramento do ambiente
Monitoramento69
Monitorando pelo Sistema Operacional71
top71
vmstat72
iostat73
sar e Ksar74
Monitorando o PostgreSQL75
pg_activity75
pgAdmin III77
Nagios78
Cacti80
Zabbix81
Monitorando o PostgreSQL pelo catlogo 81
pg_stat_activity82
pg_locks83
Outras vises (views) teis84
Monitorando espao em disco85
Configurando o Log do PostgreSQL para monitoramento de Queries86
Gerao de relatrios com base no log 88
Extenso pg_stat_statements90
pgBench91
Resumo92
Autovacuum97
Configurando o Autovacuum97
Configuraes por tabela98
Problemas com o Autovacuum98
Autovacuum executa mesmo desligado99
Autovacuum executando sempre99
Out of Memory99
Pouca frequncia99
Fazendo muito I/O99
Transaes eternas100
Reindex100
Bloated Indexes100
Cluster e Recluster101
Atualizao de verso do PostgreSQL102
Minor version102
Major version103
Resumo104
vi
9. Backup e recuperao
Backup lgico (dump)139
A Ferramenta pg_dump140
Formato140
Incluso ou excluso de Schemas140
Incluso ou excluso de tabelas141
Somente dados141
Somente estrutura141
Dependncias 141
Large objects142
Excluir objetos existentes142
Criar a base de dados142
Permisses143
vii
Compresso143
Alterando Charset Encoding143
Ignorando tablespaces originais143
Desabilitar triggers143
pg_dumpall144
Objetos globais144
Roles144
Tablespaces144
Dump com blobs144
Restaurando Dump Texto psql145
A Ferramenta pg_restore146
Seleo de objetos146
Controle de erros147
Gerar lista de contedo147
Informar lista de restaurao148
Backup Contnuo: Backup Fsico e WALs148
Habilitando o Arquivamento de WALs148
Fazendo um backup base149
Point-in-Time Recovery PITR 151
Resumo153
Dump153
Restaurao de Dump153
Backup Contnuo154
Recuperao: Point-in-Time Recovery PITR 154
10. Replicao
Viso geral155
Log Shipping e Warm-Standby156
Streaming Replication com Hot Standby157
Configurao do servidor principal158
Backup Base158
Criar o arquivo recovery.conf159
Configurar o servidor rplica para Hot Standby159
Tuning160
Monitorando a replicao161
viii
Replicao em cascata162
Replicao Sncrona162
Balanceamento de carga163
Resumo164
Bibliografia 165
ix
A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na
aprendizagem como construo do conhecimento por meio da resoluo de problemas tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza
terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no
apenas como expositor de conceitos e informaes, mas principalmente como orientador do
aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional.
A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema
semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise,
sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do problema, em abordagem orientada ao desenvolvimento de competncias.
Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as
atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de aprendizagem no considerada uma simples exposio de conceitos e informaes. O instrutor
busca incentivar a participao dos alunos continuamente.
xi
Sobre o curso
Este curso abrange os conceitos tericos e prticos de Administrao de Banco de Dados
para o PostgreSQL, SGBD open source altamente avanado e robusto. Descreve a arquitetura do PostgreSQL, apresentando as funes de cada componente, define e demonstra
atividades comuns de administrao como: instalao, configurao, backup, recuperao e
outras rotinas de manuteno essenciais a sade das bases de dados.
Aprofunda no gerenciamento do PostgreSQL abordando e trabalhando conceitos avanados como tuning de queries, anlise de planos de execuo, catlogo interno e recursos de
replicao. Discute os mais comuns problemas de desempenho enfrentados pelos DBAs, o
monitoramento do banco e sua forte integrao com o sistema operacional. Ainda, ilustra as
boas prticas para se alcanar escalabilidade e alta disponibilidade.
A quem se destina
Pessoas com conhecimento bsico em bancos de dados e infraestrutura e que precisaro
trabalhar na administrao/manuteno de ambientes PostgreSQL, se envolvendo com a
rotina diria de monitoramento de seus processos e ajuste fino de suas configuraes e procedimentos, buscando a melhor performance sem comprometer a segurana e consistncia
das informaes armazenadas. Ainda que profissionais envolvidos com o desenvolvimento
de sistemas acessando informaes armazenadas em banco de dados possam se beneficiar
deste curso, o mesmo no tem como foco a apresentao de conceitos de programao ou
da linguagem SQ.
xii
Largura constante
Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da sada
de comandos. Comandos que sero digitados pelo usurio so grifados em negrito e possuem
o prefixo do ambiente em uso (no Linux normalmente # ou $, enquanto no Windows C:\).
Contedo de slide q
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.
Smbolo w
Indica referncia complementar disponvel em site ou pgina na internet.
Smbolo d
Indica um documento como referncia complementar.
Smbolo v
Indica um vdeo como referncia complementar.
Smbolo s
Indica um arquivo de adio como referncia complementar.
Smbolo !
Indica um aviso ou precauo a ser considerada.
Smbolo p
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao
entendimento do tema em questo.
Smbolo l
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou
mesmo uma observao.
Smbolo
Indica atividade a ser executada no Ambiente Virtual de Aprendizagem AVA.
Permisses de uso
Todos os direitos reservados RNP.
Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra.
Exemplo de citao: TORRES, Pedro et al. Administrao de Sistemas Linux: Redes e Segurana.
Rio de Janeiro: Escola Superior de Redes, RNP, 2013.
xiii
Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao:
Escola Superior de Redes RNP
Endereo: Av. Lauro Mller 116 sala 1103 Botafogo
Rio de Janeiro RJ 22290-906
E-mail: info@esr.rnp.br
Sobre o autor
Fbio Caiut graduado em Cincia da Computao na Universidade Federal do Paran
(2002) e Especialista em Banco de Dados pela Pontifcia Universidade Catlica do Paran
(2010). Trabalha com TI desde 2000, atuando principalmente em Infraestrutura e Suporte ao
Desenvolvimento. Administrador de Banco de Dados PostgreSQL h 5 anos no Tribunal de
Justia do Paran, focado em desempenho e alta disponibilidade com bancos de dados de
alta concorrncia. Tem experincia como desenvolvedor certificado Lotus Notes e Microsoft
.NET nas softwarehouses Productique e Sofhar, DBA SQL Server e suporte infraestrutura
de desenvolvimento na Companhia de Saneamento do Paran.
John Lemos Forman Mestre em Informtica (nfase em Engenharia de Software) e
Engenheiro de Computao pela PUC-Rio, com ps-graduao em Gesto de Empresas
pela COPPEAD/UFRJ. vice-presidente do Sindicato das Empresas de Informtica do Rio de
Janeiro TIRIO, membro do Conselho Consultivo e de normas ticas da Assespro-RJ e Diretor
da Riosoft. scio e Diretor da J.Forman Consultoria e coordenador acadmico da rea de
desenvolvimento de sistemas da Escola Superior de Redes da RNP. Acumula mais de 29 anos
de experincia na gesto de empresas e projetos inovadores de base tecnolgica, com destaque para o uso das TIC na Educao, mdias digitais e Sade.
xiv
1
Conhecer o PostgreSQL e a descrio de sua arquitetura em alto nvel, atravs
dos seus processos componentes e suas estruturas de memria; Entender o
funcionamento de Banco de Dados e sua importncia; Aprender sobre a arquitetura
geral dos SGBDs.
conceitos
ou interpretao do mundo real, que possui uma estrutura lgica com significado
inerente e comumente possui uma finalidade e usurios especficos.
11 Sistema Gerenciador de Bancos de Dados (SGBD): um pacote de software, um sistema
de finalidade genrica para gerenciar os Bancos de Dados. Facilita o processo de definio, construo e manipulao de bancos de dados.
Caractersticas de um SGBD
11 Independncia de dados: no depende da aplicao para entender os dados;
11 Acesso eficiente: atravs de ndices, caches de dados e consultas, vises materializadas etc.;
11 Segurana mais especializada: atravs de vises, ou mesmo por colunas, ou por
mquina de origem etc.;
11 Acesso concorrente e compartilhamento dos dados: permite inmeros usurios simultneos operarem sobre os dados;
11 Restries de Integridade: impedir um identificador duplicado ou um valor fora da lista etc.;
11 Recuperao de Falhas: retorna para um estado ntegro depois de um crash;
11 Manipular grande quantidade de dados: bilhes ou trilhes de registros e petabytes
de dados;
11 Diminui o tempo de desenvolvimento de aplicaes: que no precisam escrever
cdigo para acessar e estruturar os dados.
objetivos
Arquitetura e instalao
do Banco de Dados
Exerccio de fixaoe
Arquitetura genrica de um Banco de Dados
Voc responsvel pelo desenvolvimento de um sistema de vendas. Como resolveria a
seguinte situao?
Uma grande venda feita, com mais de 200 itens. O registro representando o pedido
Apesar de alguns
autores diferenciarem
o conceito de Base de
Dados e Banco de
Dados, comumente
eles so usados como
sinnimos. s vezes
uma instncia inteira,
um servidor de Bancos
de Dados, chamado
simplesmente de Banco
de Dados. Por isso
aproveitaremos o
termo Base de Dados
para sempre identificar
cada uma das bases ou
bancos dentro de uma
instncia, mas jamais a
instncia.
gravado, mas aps gravar 50 itens ocorre uma queda de energia. O que deve ocorrer depois
que o sistema voltar ao ar?
Por definio, deseja-se que uma transao em um Banco de Dados seja Atmica: ou feito
tudo ou no feito nada. Para garantir a propriedade chamada Atomicidade, o Banco de
Dados utiliza um recurso chamado genericamente de Log de Transaes.
Esse Log pode ser visto como um histrico, ou dirio, de todas as operaes que alteram os
dados de uma base.
Quando uma transao efetua alteraes updates, inserts ou deletes essas alteraes so
feitas nos arquivos de log de transao, e posteriormente apenas as transaes que terminaram
corretamente, ou seja, que efetuaram um COMMIT, so efetivadas nos arquivos de dados.
Banco de Dados
Aplicao
Alteraes
Transao 1
Transao 4
Transao 6
0s
1s
Transao 2
Transao 3 ...
Transaction
Log Files
Transao 5 ...
Transao 7
2s
Transao 8 ...
3s
Checkpoint
Dados de Transao 1
Data Files
Dados de Transao 4
Dados de Transao 6
Dados de Transao 7
Essa arquitetura dos SGBDs, baseada nos Logs de Transaes, garante transaes:
11 Atmicas;
11 Durveis;
11 Consistentes.
ACID a abreviatura para Atomicidade, Consistncia, Isolamento e Durabilidade, que so
as propriedades que garantem que transaes em um Banco de Dados so processadas de
forma correta; portanto, garantem confiabilidade.
Figura 1.1
Transaes so
gravadas no
log e apenas as
comitadas so
efetivadas nos
arquivos de dados
posteriormente.
Introduo ao PostgreSQL
PostgreSQL um Sistema Gerenciador de Banco de Dados Objeto-Relacional (SGBD-OR)
poderoso e open source, em desenvolvimento h quase 20 anos, que conquistou forte reputao pela sua robustez, confiabilidade e integridade de dados. Totalmente compatvel com
as propriedades ACID e suporte completo a recursos como consultas complexas, chaves
estrangeiras, joins, vises e triggers and store procedures em diversas linguagens.
11 Implementa a maioria dos tipos de dados e definies do padro SQL:2008, alm de
Verso do PostgreSQL
Todo o contedo aqui apresentado baseado nas verses do PostgreSQL da famlia 9, particularmente a partir da verso 9.1, e verses posteriores. Para ilustrar detalhes da sua instalao ou funcionamento, usamos a verso mais recente disponvel, que a verso 9.3.4, mas
possivelmente o lanamento de novas verses depois da confeco deste material podero
determinar diferenas que no estaro aqui refletidas.
exemplo, de 9.3.3 para 9.3.4 so aplicadas apenas correes que no mudam o comportamento do banco. J no caso de major releases, por exemplo, da verso 9.3 para a 9.4 novas
funcionalidades e mudanas em recursos existentes podem ocorrer.
De qualquer modo, a poltica geral de verses do PostgreSQL que em minor releases, por
Arquitetura do PostgreSQL
Servidor
Postgres Backend
WORK_MEM
TEMP_BUFFERS
Postmaster
Cliente
Auto Vacuum
Shared
Memory
Stats Colector
Shared
Buers
Logger
WAL
Buers
...
Vacuum Worker
Archiver
Sender
Checkpointer
WAL Writer
Writer
Receiver
Cache do sistema
operacional
O PostgreSQL um SGBD multiprocessos, em contraposio aos multithreading. Isso significa que para atender cada conexo de usurio existe um processo, no Sistema Operacional,
servindo esse cliente. Esses processos que atendem s conexes so chamados de backend.
Disco
Figura 1.2
Arquitetura Geral
do PostgreSQL.
Alm dos processos para atender requisies de usurios, o PostgreSQL possui outros
processos para atender diversas tarefas que o SGBD necessita. A figura 1.3 mostra o menor
nmero de processos possveis para que o PostgreSQL funcione.
Mquina
PostgreSQL
Postmaster
Disk Cache
Checkpointer
Writer
Discos
WAL Writer
Figura 1.3
Processos bsicos
do PostgreSQL.
A figura mostra o Postmaster, que o processo principal e pai de todos os outros processos.
Quando o PostgreSQL iniciado, ele executado e carrega os demais. O postmaster um
processo do programa executvel chamado postgres, porm por compatibilidade com
verses anteriores antes da verso 8, o executvel se chamava postmaster de fato e por
identificao do processo principal ele ainda aparece com esse nome.
O Checkpointer o processo responsvel por disparar a operao de Checkpoint, que a
aplicao das alteraes do WAL para os arquivos de dados atravs da descarga de todas as
pginas de dados sujas da memria (buffers alterados) para disco, na frequncia ou quantidade definidos no arquivo de configurao do PostgreSQL, por padro a cada 5 minutos ou
3 arquivos de log.
Em verses anteriores
no existia o processo
Checkpointer, e o
processo Background
Writer executava as
funes dos dois.
O Writer, tambm conhecido como background writer ou bgwriter, procura por pginas
de dados modificadas na memria (shared_buffer) e as escreve para o disco em lotes
pequenos. A frequncia e o nmero de pginas que so gravadas por vez esto definidas
nos parmetros de configurao do PostgreSQL, e so por padro 200ms e 100 pginas.
No PostgreSQL, o log de transao chamado de Write Ahead Log ou simplesmente WAL.
O processo WAL writer responsvel por gravar em disco as alteraes dos buffers do WAL
em intervalos definidos no arquivo de configurao do PostgreSQL.
PostgreSQL
Postmaster
Automatiza o Vacuum...
Checkpoint
Writer
WAL Writer
Figura 1.4
Processos em
uma configurao
padro.
Stats Colector
Gerao de Estatsticas...
Auto Vacuum
PostgreSQL
Postmaster
Checkpointer
Writer
Log de erros/informaes...
WAL Writer
Auto Vacuum
Stats Colector
Reorganizao de espao
Logger
Vacuum Worker
Archiver
Backup de WALs
Sender
Receiver
Replicao
mais tarde.
Figura 1.5
Todos os processos
utilitrios do
PostgreSQL.
Passo 1
clientes. Quando um cliente solicita uma conexo ao PostgreSQL, essa requisio inicialmente recebida pelo processo postmaster, que faz a autenticao e cria um processo filho
(backend process) que atender as futuras requisies do cliente e processamento das
queries sem interveno do postmaster. O diagrama a seguir ilustra esse mecanismo:
Passo 2
Cliente
Passo 3
Cliente
Passo 4
Cliente
Cliente
1. Nova conexo
PostgreSQL
PostgreSQL
Postmaster
PostgreSQL
Postmaster
2. Autenticao
PostgreSQL
Postmaster
Postmaster
3. Novo
processo lho
4. Sesso
Postgres (backend)
Figura 1.7
Processos
backends.
Postgres
(backend)
A partir da conexo estabelecida, o cliente envia comandos e recebe os resultados diretamente do processo Postgres que lhe foi associado e que lhe atende exclusivamente. Assim,
no lado PostgreSQL, sempre veremos um backend para cada conexo com um cliente.
Clientes
Postmaster
Checkpointer
Checkpointer
Checkpointer
Checkpointer
Processos utilitrios...
Checkpointer
Checkpointer
Checkpointer
Checkpointer
Checkpointer
Checkpointer
Postgres
PostgreSQL
idle
Operao em Execuo
Endereo IP e Porta do Cliente
Nome da Base de Dados
Nome do Usurio
O PostgreSQL utiliza est rea para manter os dados mais acessados em uma estrutura
chamada shared buffer e permitir que todos os processos tenham acesso a esses dados.
Alm do shared_buffers, h outras estruturas que o PostgreSQL mantm na shared
memory, entre elas o wal buffer, utilizado pelo mecanismo de WAL.
Figura 1.8
Processos do
PostgreSQL
com conexes
estabelecidas.
PostgreSQL
Postgres Backend
Process Memory
WORK_MEM
TEMP_BUFFERS
...
Cliente
Shared
Memory
Shared
Buers
WAL
Buers
...
Checkpointer
WAL Writer
Writer
Disco
Figura 1.9
Viso geral da
arquitetura de
memria no
PostgreSQL.
log
log
log
VS
Figura 1.10
Instalao via
fontes ou pacotes?
Unix
Sistema Operacional
porttil, multitarefa e
multiusurio, criado
por Ken Thompson,
Dennis Ritchie, Douglas
McIlroy e Peter Weiner,
que trabalhavam nos
Laboratrios Bell
(Bell Labs), da AT&T.
NTFS para Windows. Assim, em instalaes de produo do PostgreSQL, o mais comum (e eficiente) optar pela plataforma Unix, sendo uma distribuio Linux o mais usual nos dias atuais.
Pr-Requisitos
10
make
GNU make, gmake ou no Linux apenas make, que um utilitrio de compilao. Normalmente
j est instalado na maioria das distribuies (verso 3.80 ou superior).
gcc
Compilador da linguagem C. O ideal usar uma verso recente do gcc, que vem instalado por
padro em muitas distribuies Linux. Outros compiladores C podem tambm ser utilizados.
tar com gzip ou bzip2
Necessrio para descompactar os fontes, normalmente tambm j instalados na maioria
das distribuies Linux. O descompactador a ser utilizado (gzip ou bzip2) depender do
formato usado (.gz ou .bz2) na compactao dos arquivos-fonte disponveis.
readline
Biblioteca utilizada pela ferramenta de linha de comando psql para permitir histrico de
comandos e outras funes.
possvel no us-la informando a opo --without-readline no momento da execuo do
configure, porm recomendado mant-la.
zlib
Biblioteca padro de compresso, usada pelos utilitrios de backup pg_dump e pg_restore.
possvel no utiliz-la informando a opo --without-zlib no momento da execuo do
configure, porm altamente recomendado mant-la.
Podem ser necessrios outros softwares ou bibliotecas dependendo de suas necessidades
e de como ser sua instalao. Por exemplo, se voc for usar a linguagem pl/perl, ento
necessrio ter o Perl instalado na mquina. O mesmo vale para pl/python ou pl/tcl ou, se for
usar conexes seguras atravs de ssl, ser necessrio o openssl instalado previamente.
Aqui assumiremos uma instalao padro, sem a necessidade desses recursos.
Tabela 1.1
Instalao de
softwares ou
bibliotecas.
Na distribuio Debian/Ubuntu
O comando sudo permite que um usurio comum execute aes que exigem privilgios de
superusurio. Quando executado, ele solicitar a senha do usurio para confirmao. Ser
utilizado diversas vezes durante o curso.
Deve haver um repositrio configurado para o seu ambiente para que seja possvel usar o
yum ou o apt-get.
11
================================================================================
Package
Arch
Version
Repository
Size
================================================================================
Installing:
gcc
x86_64
4.4.7-4.el6
base
10 M
readline-devel
x86_64
6.0-4.el6
base
134 k
zlib-devel
x86_64
1.2.3-29.el6
base
44 k
x86_64
0.15.7-1.2.el6
base
93 k
cpp
x86_64
4.4.7-4.el6
base
3.7 M
glibc-devel
x86_64
2.12-1.132.el6
base
978 k
glibc-headers
x86_64
2.12-1.132.el6
base
608 k
kernel-headers
x86_64
2.6.32-431.11.2.el6
updates
2.8 M
libgomp
x86_64
4.4.7-4.el6
base
118 k
mpfr
x86_64
2.4.1-6.el6
base
157 k
ncurses-devel
x86_64
5.7-3.20090208.el6
base
642 k
ppl
x86_64
0.10.2-11.el6
base
1.3 M
Transaction Summary
================================================================================
Install
12 Package(s)
Figura 1.11
Instalao dos prrequisitos com yum
no CentOS.
w
O cdigo fonte do
PostgreSQLpode ser
obtido diretamente na
internet no link
indicado no AVA.
De modo a ganhar tempo, o download do pacote foi feito previamente e j estar disponvel
12
cd /usr/local/src/
cd postgresql-9.3.4/
w
Para listar os parmetros que podem ser
definidos execute o
configure com -help ou
acesse a pgina com
informaes mais
detalhadas atravs do
link indicado no AVA.
--without-PACKAGE
--with-template=NAME
--with-includes=DIRS
--with-libraries=DIRS
--with-libs=DIRS
--with-pgport=PORTNUM
--with-blocksize=BLOCKSIZE
set table block size in kB [8]
--with-segsize=SEGSIZE
--with-wal-blocksize=BLOCKSIZE
set WAL block size in kB [8]
--with-wal-segsize=SEGSIZE
set WAL segment size in MB [16]
set compiler (deprecated)
--with-tcl
--with-tclconfig=DIR
tclConfig.sh is in DIR
--with-perl
--with-python
Compilao
Definida a configurao do ambiente o passo seguinte a compilao, atravs do comando make:
$ make
Isso pode levar alguns minutos e, no havendo problemas, ser exibida uma mensagem com
o final Ready to Install, conforme pode ser visto na figura 1.13.
Figura 1.12
configure: diversos
parmetros
para adaptar a
instalao do
PostgreSQL.
--with-CC=CMD
13
label.o
make[3]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/contrib/dum
my_seclabel
cp ../../../contrib/dummy_seclabel/dummy_seclabel.so dummy_seclabel.so
make[2]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/src/test/re
gress
make[1]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/src
make -C config all
make[1]: Entrando no diretrio `/home/curso/softwares/postgresql-9.3.4/config
make[1]: Nada a ser feito para `all.
make[1]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/config
All of PostgreSQL successfully made. Ready to install.
[curso@pg02 postgresql-9.3.4]$
Figura 1.13
Compilao dos
fontes com make.
Teste
possvel testar a instalao em seu ambiente, bastando executar:
$
make check
... ok
sequence
... ok
polymorphism
... ok
rowtypes
... ok
returning
... ok
largeobject
... ok
with
... ok
xml
... ok
test stats
... ok
14
==============
=======================
All 136 tests passed.
=======================
make[1]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/src/test/re
gress
[curso@pg02 postgresql-9.3.4]$
O teste pode falhar, e neste caso, o resultado deve ser analisado para avaliar a gravidade do
problema e formas de resolv-lo.
Figura 1.14
Teste de regresso
com make check.
Instalao
$
Esse comando copiar os arquivos para o diretrio de instalao (se foi deixado o caminho
padro /usr/local/pgsql, ento necessrio o sudo). O resultado deve ser a exibio da
mensagem PostgreSQL installation complete, conforme a figura 1.15.
/usr/bin/install -c
pg_regress /usr/local/pgsql/lib/pgxs/src/test/regress/pg_r
egress
make[2]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/src/test/re
gress
/bin/mkdir -p /usr/local/pgsql/lib/pgxs/src
/usr/bin/install -c -m 644 Makefile.global /usr/local/pgsql/lib/pgxs/src/Makefi
le.global
/usr/bin/install -c -m 644 Makefile.port /usr/local/pgsql/lib/pgxs/src/Makefile
.port
/usr/bin/install -c -m 644 ./Makefile.shlib /usr/local/pgsql/lib/pgxs/src/Makef
ile.shlib
/usr/bin/install -c -m 644 ./nls-global.mk /usr/local/pgsql/lib/pgxs/src/nls-gl
obal.mk
make[1]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/src
make -C config install
make[1]: Entrando no diretrio `/home/curso/softwares/postgresql-9.3.4/config
/bin/mkdir -p /usr/local/pgsql/lib/pgxs/config
/usr/bin/install -c -m 755 ./install-sh /usr/local/pgsql/lib/pgxs/config/instal
l-sh
make[1]: Saindo do diretrio `/home/curso/softwares/postgresql-9.3.4/config
PostgreSQL installation complete.
[curso@pg02 postgresql-9.3.4]$
Instalao de extenses
Entre as mais interessantes, do ponto de vista de administrao, esto:
11 dblink: biblioteca de funes que permite conectar uma base PostgreSQL com outra,
estando estas ou no no mesmo servidor.
11 pg_buffercache: cria uma view que permite analisar os dados no shared buffer,
possibilitando verificar o nvel de acerto em cache por base de dados.
11 pg_stat_statements: permite consultar online as principais queries executadas no
banco, por nmero de execues, total de registros, tempo de execuo etc.
No diretrio contrib podem ser encontrados diversos mdulos opcionais, chamados de
extenses, que podem ser instalados junto ao PostgreSQL. Existem utilitrios, tipos de
dados e funes para finalidades especficas, como tipos geogrficos.
Para instalar uma extenso, v para o diretrio correspondente em contrib/<extenso> e
utilize o make. Por exemplo, para instalar o pg_buffercache:
$
cd contrib/pg_buffercache/
$ make
$
Figura 1.15
PostgreSQL
instalado com
make install.
15
cd /usr/local/src/postgresql-9.3.4
make distclean
16
Figura 1.16
Lista oficial de
extenses e
PGXN, diretrio de
extenses diversas.
Instalao
O processo pelo repositrio do Ubuntu instala o PostgreSQL, cria o usurio postgres,
inicializa o diretrio de dados e executa o banco. O diretrio de instalao o /var/lib/
postgresql/<versao>/main/ e a rea de dados (diretrio data) criada abaixo deste.
Adding user postgres to group ssl-cert
Building PostgreSQL dictionaries from installed myspell/hunspell package ...
update-rc.d: warning
No caso do CentOS o PostgreSQL apenas instalado. As demais tarefas devem ser executadas manualmente. A instalao feita usando o padro de diretrios da distribuio, por
exemplo, programas no /usr/bin e bibliotecas em /usr/lib.
Red Hat/CentOS
$
Debian/Ubuntu
$
(Debian/Ubuntu)
(Red Hat/CentOS)
Figura 1.17
Instalao por
repositrio no
Ubuntu.
17
| 3.7 kB
00:00
extras
| 3.4 kB
00:00
updates
| 3.4 kB
00:00
updates/primary_db
| 2.3 MB
00:04
Available Packages
Name
: postgresql-server
Arch
: i686
Version
: 8.4.20
Release
: 1.el6_5
Size
: 3.4 M
Repo
: updates
Summary
URL
: http://www.postgresql.org/
License
: PostgreSQL
PostgreSQL is an advanced
Figura 1.18
PostgreSQL
com verso
defasada no
repositrio
do CentOS.
Remoo
18
Red Hat/CentOS
Debian/Ubuntu
Instalao de extenses
Os mdulos opcionais, quando instalados pelo repositrio, contm em um nico pacote
todas as extenses.
Red Hat/CentOS
Debian/Ubuntu
Tambm pode ser necessrio criar a extenso na base com o comando CREATE EXTENSION.
Debian/Ubuntu
$
Debian/Ubuntu
$
Debian/Ubuntu
$
Tambm pode ser necessrio criar a extenso na base com o comando CREATE EXTENSION.
Instalao de extenses
19
cd /usr/local/src/
cd postgresql-9.3.4/
./configure
$ make
20
2
Conhecer a operao e controles bsicos do PostgreSQL; Aprender a inicializao da
rea de dados, como iniciar e parar o banco, recarregar configuraes, verificar status
e outros procedimentos; Ver os parmetros de configurao do PostgreSQL e os
escopos em que estes podem ser aplicados.
conceitos
Em seguida, temos o comando para definir uma senha para o novo usurio postgres:
aluno$
aluno$
objetivos
Operao e configurao
21
Ateno: ser primeiro solicitada a senha do usurio aluno para fazer o sudo, depois a nova
senha para o usurio postgres duas vezes:
[sudo] password for curso:
Enter new UNIX password:
Retype new UNIX password:
O nome da conta pode ser outro, mas por padro assumido como postgres.
Em um servidor de produo, pode haver regras especficas para a criao de usurios. Verifique com o administrador do seu ambiente.
Na sesso que trata da administrao de usurios e segurana, apresentaremos em
detalhes os comandos relacionados a essas atividades. Por hora, para facilitar os procedimentos de operao e configurao do Banco de Dados, utilizaremos o comando a seguir
para fornecer algumas permisses para o usurio postgres no filesystem /db, que ser
utilizado pelo Banco de Dados:
aluno$
su - postgres
vi ~/.bashrc
O ltimo comando acima aciona o editor de textos vi para que o arquivo .bashrc seja
Administrao de Banco de Dados com PostgreSQL
22
PATH=$PATH:/usr/local/pgsql/bin:$HOME/bin
PGDATA=/db/data/
export PATH PGDATA
As alteraes passaro a valer para as prximas vezes em que o computador for inicializado.
Para que passem a ter efeito na sesso atual, necessrio executar o comando:
postgres$
source .bashrc
Servidor
I/O PostgreSQL
PostgreSQL
Discos Exclusivos
Sistema Operacional
PostgreSQL
PostgreSQL
Outros
Servios
Disco
I/O
Figura 2.1
Discos exclusivos
para o Banco
de Dados.
I/O
23
initdb
Outra alternativa, caso no tivssemos definido a varivel PGDATA ou quisssemos inicializar outro diretrio, seria usar esse mesmo comando indicando o local para a criao de
rea de dados:
postgres$
initdb -D /db/data
24
Figura 2.2
Sada do initdb:
tarefas executadas
na inicializao da
rea de dados.
Iniciando o PostgreSQL
H diversas maneiras de iniciar o PostgreSQL. O nome do executvel principal postgres,
assim podemos iniciar o banco apenas chamando-o:
$
postgres -D /db/data
Esse comando executar o PostgreSQL em primeiro plano, em sua console. Se for executado um
Ctrl+C o servidor vai parar. Para executar o Banco de Dados em background, utilize o comando:
$
postgres &
Para capturar a sada padro (stdout) e a sada de erros (stderr), e envi-los para um arquivo
de log:
$
Porm, a forma mais simples de iniciar o banco em background e com log usando o
utilitrio pg_ctl. Para isso preciso indicar no arquivo de configurao do PostgreSQL
(postgresql.conf ) onde devero ser armazenados os arquivos de log. Assim, a execuo do
servidor pode ser rotineiramente comandada por:
$
pg_ctl start
cd /usr/local/src/postgresql-9.3.4/contrib/start-scripts/
sudo vi /etc/init.d/postgresql
Verifique os parmetros prefix e PGDATA para que estejam de acordo com sua instalao.
Se as instrues do captulo anterior tiverem sido corretamente seguidas estes valores
devero ser:
prefix = /usr/local/pgsql
PGDATA = /db/data/
25
Reserve um minuto analisando o restante do script para entender sua funo e salve-o.
Em seguida fornea permisso de execuo.
$
Debian/Ubuntu
Reinicie seu sistema para testar se o PostgreSQL iniciar junto com o Sistema Operacional.
A famlia Debian/Ubuntu pode utilizar um sistema de inicializao de servios diferente, chamado Upstart. Verifique com o administrador do seu ambiente.
Parando o PostgreSQL
O PostgreSQL pode ser parado pelo tradicional comando kill do Linux. Primeiro voc deve
obter o PID (ID do processo) do processo principal do PostgreSQL. Voc pode obt-lo com o
comando ps:
$
815
0 22:59 ?
0:00 /usr/local/pgsql/bin/postmaster -D /d
postgres
927
815
0 22:59 ?
Ss
0:00
postgres
948
815
0 22:59 ?
Ss
0:00
postgres
950
815
0 22:59 ?
Ss
0:00
postgres
951
815
0 22:59 ?
Ss
0:00
postgres
952
815
0 22:59 ?
Ss
0:00
postgres
953
815
0 22:59 ?
Ss
0:00
b/data
process
postgres@pg01:~$
Figura 2.3
Obtendo o PID do
processo principal
do PostgreSQL
atravs do ps.
26
cat /db/data/postmaster.pid
Figura 2.4
Obtendo o PID
atravs do arquivo
postmaster.pid.
O kill funciona enviando notificaes para o processo. Essas notificaes so chamadas sinais.
INT: modo fast shutdown o banco no aceitar conexes e enviar um sinal TERM para
todas as conexes existentes abortarem suas transaes e fecharem. Tambm aguardar
essas conexes terminarem para parar o banco.
$ kill -INT 1440
QUIT: modo immediate shutdown o processo principal envia um sinal QUIT para todas
as conexes terminarem imediatamente e tambm sai abruptamente. Quando o banco for
iniciado, entrar em recovery para desfazer as transaes incompletas.
Nunca use o sinal SIGKILL, mais conhecido como kill -9, j que isso impede o postmaster de liberar segmentos da shared memory e semforos, alm de impedi-lo de
enviar sinais para os processos filhos, que tero de ser eliminados manualmente.
A forma mais elegante de parar o Banco de Dados tambm atravs do comando pg_ctl.
No necessrio nem saber o pid do postmaster. Basta informar o parmetro m e modo
de parada desejado passando como parmetro a primeira letra de um dos modos: smart,
fast e immediate.
$
Reiniciar o PostgreSQL
Quando alteradas determinadas configuraes do PostgreSQL, ou do SO, como as relacionadas a reserva de memria, pode ser necessrio reiniciar o PostgreSQL.
O comando restart de fato um stop seguido de um start, sendo chamado da seguinte forma:
pg_ctl restart
pg_ctl reload
27
O comando pg_ctl outra opo, bastando utilizar o parmetro status conforme demonstrado a seguir:
$
pg_ctl status
Conexes no PostgreSQL
Para estabelecer uma conexo com o Banco de Dados, no exemplo a seguir vamos utilizar
Administrao de Banco de Dados com PostgreSQL
28
11 -h o servidor (host)
11 -p a porta
Figura 2.5
Status do
PostgreSQL.
11 -d a base (database)
11 -U o usurio
Alm dos comandos do PostgreSQL, o psql possui uma srie de comandos prprios que facilitam tarefas rotineiras. Por exemplo, para listar todas as bases do servidor, basta executar \l:
curso=#
\l
postgres@pg01:~$ psql
psql (9.3.4)
Type help for help.
postgres=# \l
List of databases
Name
| Owner
| Encoding | Collate
| Ctype
Access privileges
---------+----------+----------+-------------+-------------+-------------------bench
| postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 |
curso
| postgres | UTF8
| postgres=CTc/postgr
| aluno=Tc/postgres +
| professor=CTc/postg
+
es +
res
postgres | postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 |
| postgres=CTc/postgr
es
template0| postgres | UTF8
|
| postgres=CTc/postgr
es
template1| postgres | UTF8
|
| postgres=CTc/postgr
es
(6 rows)
postgres=#
Para executar arquivos de script pelo psql comum tambm usar a forma no interativa:
$
\c projetox;
Para ver a ajuda sobre os comandos do psql, use \h para comandos SQL do PostgreSQL e \?
para os comandos do psql.
Figura 2.6
Listando as bases de
dados com o psql.
29
Comando
Iniciar o banco
pg_ctl start
Parar o banco
Parar o banco
pg_ctl restart
Reconfigurar o banco
pg_ctl reload
pg_ctl status
Matar um processo
Conectar no banco
Tabela 2.1
Comandos do
PostgreSQL.
Atividade de Prtica
30
Veja a figura 2.7, que mostra a alterao do timezone na sesso corrente. Aps a desconexo
uma nova sesso iniciada e o valor volta ao original.
Figura 2.7
Alterao de
parmetro de
sesso.
31
Para desfazer uma configurao especfica para uma role ou base, use o atributo RESET:
postgres=# ALTER ROLE jsilva RESET work_mem;
postgres=# ALTER DATABASE curso RESET work_mem;
vi /db/data/postgresql.conf
# min 128kB
# (change
requires restart)
#temp_buffers = 8MB
# min 800kB
#max_prepared_transactions = 0
requires restart)
# Note:
# min 64kB
# min 1MB
#max_stack_depth = 2MB
32
# min 100kB
# - Disk #temp_file_limit = -1
imit
A maioria dos parmetros possui comentrios com a faixa de valores aceitos e indicao se a
alterao exige um restart ou se apenas um reload suficiente.
Na tabela a seguir, listamos os principais parmetros que devem ser analisados/ajustados
antes de comear a utilizar o PostgreSQL.
Figura 2.8
Arquivo de
configurao
postgresql.conf.
Descrio
Valor
listen_addresses
max_connections
statement_timeout
shared_buffers
work_mem
Ssl
superuser_reserved_connections
effective_cache_size
logging_collector
bytea_output
Datestyle
lc_messages
Parmetro
33
Parmetro
Descrio
Valor
lc_monetary
Formato de moeda.
pt_BR.UTF-8
lc_numeric
Formato numrico.
pt_BR.UTF-8
lc_time
Formato de hora.
pt_BR.UTF-8
A lista apresenta parmetros gerais. Vamos voltar a falar de parmetros nas prximas
sesses, por exemplo, quando analisarmos os processos de Monitoramento e Manuteno
do Banco de Dados.
Tabela 2.2
Parmetros bsicos
de configurao do
PostgreSQL.
SHOW ALL;
SHOW max_connections;
Shared Memory
O mais importante o SHMMAX, que define o tamanho mximo de um segmento da shared
memory. Para consultar o valor atual execute:
$
sysctl kernel.shmmax
34
kernel.shmmax = 8589934592
$ sysctl kernel.shmmax
kernel.shmmax = 183554432
$
$ /sbin/sysctl kernel.sem
kernel.sem = 250
32000
32
128
$
$ ulimit -n -u
open files
(-n) 1024
(-u) 3850
Figura 2.9
Configuraes
do Sistema
Operacional.
Semforos
Outro recurso do Sistema Operacional que talvez precise ser ajustado em funo da quantidade de processos diz respeito aos semforos do sistema.
Para consultar os valores atuais dos parmetros de semforos, faa uma consulta a kernel.sem:
$ sysctl kernel.sem
kernel.sem = 250
32000
32
128
32000
32
256
Ser necessrio reiniciar a mquina para que os valores alterados no arquivo /etc/sysctl.conf
tenham efeito.
Para saber qual os valores mnimos exigidos pelo PostgreSQL, pode-se fazer o seguinte clculo:
SEMMNI
(max_connections + autovacuum_max_workers + 4) / 16
SEMMSN
Limites
Outras configuraes importantes esto relacionadas aos limites de recursos por usurio.
Dependendo do nmero de conexes necessrio definir os parmetros max user processes
e open files. Para consultar o valor atual, conectado com o usurio postgres, execute:
$
ulimit -n -u
sudo vi /etc/security/limits.conf
Por exemplo, para aumentar o nmero mximo de arquivos abertos e de processos pelo
soft indica um limite no qual o prprio processo do usurio pode alterar o valor at no
mximo o definido pelo limite hard.
35
36
3
Conhecer a organizao do PostgreSQL do ponto de vista lgico (bases de dados
e schemas) e fsico (rea de dados e tablespaces) Aprender a estrutura de diretrios
e arquivos, alm da funo de cada item; Entender a organizao da instncia em
bases, schemas e objetos, e ainda os metadados do banco no catlogo do sistema.
conceitos
objetivos
37
Figura 3.1
Layout de arquivos
do PostgreSQL.
15 directories, 7 files
postgres@pg01:~$
Arquivos
H trs arquivos de configurao:
Diretrios
Veremos em detalhes cada um dos seguintes diretrios:
11 base.
11 global.
11 pg_xlog.
11 pg_log.
11 pg_tblspc.
11 diretrios de controle de transao.
O diretrio base onde, por padro, esto os arquivos de dados. Dentro dele existe um
subdiretrio para cada base.
postgres@pg01:~$ tree -d /db/data/base/
/db/data/base/
1
12035
16384
16385
49503
Figura 3.2
Estrutura
do diretrio
PGDATA/base.
58970
6 directories
postgres@pg01:~$
O nome dos subdiretrios das bases de dados o OID da base, que pode ser obtido
consultando a tabela do catlogo pg_database com o seguinte comando:
postgres=# SELECT oid, datname FROM pg_database;
postgres=# SELECT oid, datname FROM pg_database;
oid
datname
-------+----------1 | template1
12035 | template0
16384 | curso
49503 | postgres
58970 | bench
(6 rows)
Figura 3.3
OIDs das bases
de dados.
postgres=#
Dentro do diretrio de cada base esto os arquivos das tabelas e ndices. Cada tabela ou
ndice possui um ou mais arquivos. Uma tabela ter inicialmente um arquivo, cujo nome o
atributo filenode que pode ser obtido nas tabelas de catlogo. O tamanho mximo do
arquivo 1GB. Ao alcanar este limite sero criados mais arquivos, cada um com o nome
filenode.N, onde N um incremental.
16385 | projetox
39
Para descobrir o nome dos arquivos das tabelas consulte o filenode com o seguinte comando:
curso=>
Esse comando exibe o filenode para uma tabela especfica. A consulta exibida na figura a
seguir lista o filenode para todas as tabelas da base.
curso=# SELECT relname, relfilenode FROM pg_class WHERE relkind=r AND relname
not like pg% and relname not like sql%;
relname
| relfilenode
--------------+------------jogos
24593
times
41077
grupos_times |
24588
grupos
24584
cidades
24599
contas
41230
(6 rows)
Figura 3.4
Tabelas e Filenodes.
curso=#
Outra forma de obter o nome do arquivo de dados das tabelas a funo pg_relation_filepath(),
que retorna o caminho do primeiro arquivo da tabela:
curso=>
SELECT pg_relation_filepath(oid)
11 _fsm: para o Free Space Map, indicando onde h espao livre nas pginas das tabelas;
11 _vm: para o Visibility Map, que indica as pginas que no precisam passar por vacuum;
11 _init: para unlogged tables;
11 arquivos temporrios: cujo nome tem o formato tNNN_filenode, onde NNN o PID
do processo backend que est usando o arquivo.
O diretrio global contm os dados das tabelas que valem para toda a instncia e so visveis
de qualquer base. So tabelas do catlogo de dados como, por exemplo, pg_databases.
O pg_xlog contm as logs de transao do banco e os arquivos de WAL, que so arquivos
contendo os registros das transaes efetuadas. Eles possuem as seguintes caractersticas:
11 Cada arquivo tem 16MB;
40
Figura 3.5
O diretrio archive_
status contm
informaes de
controle sobre
quais arquivos j
foram arquivados.
Pode existir ainda o diretrio pg_log, dependendo de suas configuraes, que contm os
Figura 3.6
O pg_tblspc contm
links simblicos
para as reas reais
dos tablespaces.
Por fim, temos um conjunto de diretrios que contm arquivos de controle de status de
logs de erro e atividade. Se foi habilitada a coleta de log com o parmetro logging_collector,
o diretrio padro ser esse. Os nomes dos arquivos dependem tambm das configuraes
escolhidas. Na sesso sobre monitoramento, os aquivos de log voltaro a ser tratados.
transaes diversas:
11 pgdata/pg_clog;
11 pgdata/pg_serial;
11 pgdata/pg_multixact;
11 pgdata/pg_twophase.
Organizao geral
Um servidor ou instncia do PostgreSQL pode conter diversas bases de dados. Essas bases,
por sua vez, podem conter Schemas que contero objetos como tabelas e funes. Pode-se
dizer que esta , de certa forma, uma diviso lgica.
11 pgdata/pg_subtrans;
41
Por outro lado, tanto bases inteiras, ou uma tabela ou ndice, podem estar armazenados
em um tablespace. Logo, no podemos coloc-lo na mesma hierarquia. O esquema a seguir
demonstra essa organizao bsica:
Tablespaces
Bases de dados
Uma base de dados uma coleo de objetos como tabelas, vises e funes.
No PostgreSQL, assim como na maioria dos SGBDs, observa-se que:
11 Um servidor pode ter diversas bases.
11 Toda conexo feita em uma base.
11 No se pode acessar objetos de outra base.
11 Bases so fisicamente separadas.
11 Toda base possui um owner com controle total nela.
Quando uma instncia iniciada, com o initdb, trs bases so criadas:
11 template0: usado para recuperao pelo prprio Postgres, no alterado;
11 template1: por padro, serve de modelo para novos bancos criados. Se for necessrio
ter um modelo corporativo de base, conter as extenses e funes pr-definidas;
11 postgres: base criada para conectar-se por padro, no sendo necessria para o fun-
42
Para listar as bases de dados existentes no servidor, podemos consultar a tabela pg_database
do catlogo do sistema, ou usar o comando \l do psql. Muito til, \l+ exibe tambm o tamanho
da base e o tablespace padro.
Figura 3.8
Ferramenta
grfica pgAdminIII,
ilustrando a rvore
de hierrquia no
PostgreSQL.
43
Figura 3.9
No psql, use \l
para listar as bases
existentes.
Toda base possui um dono que, caso no seja informado no momento da criao ser o
usurio que est executando o comando. Apenas superusurios ou quem possui a role
CREATEDB podem criar novas bases.
11 OWNER: o usurio dono da base pode criar schemas e objetos e dar permisses;
11 TEMPLATE: a base modelo a partir da qual a nova base ser copiada;
11 ENCODING: que define o conjunto de caracteres a ser utilizado;
11 TABLESPACE: que define o tablespace padro onde sero criados os objetos na base.
postgres=# CREATE DATABASE rh
OWNER postgres
ENCODING UTF-8
TABLESPACE = tbs_disco2;
Esse exemplo criar a base rh com as opes definidas e tendo como modelo default o
44
template1.
H um utilitrio para linha de comando que pode ser usado para a criao de bases de
dados chamado createdb. Ele tem as mesmas opes do comando SQL:
$
Assim como na criao da base, possvel executar a excluso por comando SQL:
Ou pelo utilitrio:
$
dropdb curso;
Schemas
Como j foi dito anteriormente, bases podem ser organizadas em schemas. Schemas so
apenas uma diviso lgica para os objetos do banco, sendo permitido acesso cruzado entre
objetos de diferentes schemas. Por exemplo, supondo um schema chamado vendas e um
schema chamado estoque, a seguinte query pode ser realizada:
curso=>
SELECT *
FROM vendas.pedido as pe
Tambm importante frisar que podem existir objetos com o mesmo nome em schemas
diferentes. completamente possvel existir uma tabela produto no schema vendas e uma
no schema estoque. Para referenci-las, sem ambiguidade, deve-se usar sempre o nome
completo do objeto (vendas.produto e estoque.produto).
Quando referenciamos ou criamos um objeto sem informar o nome completo, costuma-se
entender que ele est ou ser criado no schema public. O funcionamento correto um pouco
mais complexo e depende do parmetro search_path.
O public um schema que por padro existe no modelo padro template1 e geralmente
existe em todas as bases criadas posteriormente (seja porque no se alterou a template1,
seja por no usar um outro modelo). Neste schema public, com as permisses originais,
qualquer usurio pode acessar e criar objetos. No obrigatria a existncia do public; ele
pode ser removido.
O search_path um parmetro que define justamente a ordem e quais schemas sero varridos
quando um objeto for referenciado sem o nome completo. Por padro, o search_path definido:
curso=#
SHOW search_path;
search_path
-----------------$user,public
$user significa o prprio usurio conectado. Assim, supondo que estejamos conectados
com o usurio aluno e executarmos o comando:
curso=#
Se existir um esquema chamado aluno, essa tabela ser criada l. Caso contrrio, ser criada
no public.
createdb e dropdb,
como a maioria
dos utilitrios do
PostgreSQL, podem ser
usados remotamente.
Assim, suportam as
opes de conexo -h
host e -U usurio.
45
Dito isso, fcil notar como podem acontecer confuses. Portanto, sempre referencie e
exija dos desenvolvedores que usem o nome completo dos objetos.
Uma prtica comum criar um schema para todos os objetos da aplicao (por exemplo,
vendas) e definir a varivel search_path para esse schema. Desse modo, nunca seria necessrio informar o nome completo, apenas o nome do objeto:
curso=#
curso=#
curso=#
O parmetro search_path pode ser definido para uma sesso apenas, para um
usurio ou para uma base.
Para listar todos os schemas existentes na base atual, no psql pode-se usar o comando \dn+.
Uma alternativa consultar a tabela pg_namespace do catlogo de sistema.
Ao modelar o Banco de Dados, uma dvida comum sobre como fazer a distribuio das
bases de dados, utilizando ou no diferentes schemas. Do ponto de vista de arquitetura
de bancos de dados, essa deciso deve ser tomada se h relao entre os dados e se ser
necessrio acessar objetos de diferentes aplicaes no nvel de SQL. Se sim, ento deve-se
usar schemas em uma mesma base, caso contrrio, mais de uma base de dados.
Criao de schema
Para criar um schema, basta estar conectado na base e usar o comando:
curso=#
Somente quem possui a permisso CREATE na base de dados e superusurios podem criar
schemas. O dono da base recebe a permisso CREATE.
Para definir o dono de um schema, atribui-se a propriedade AUTHORIZATION:
curso=#
Diferente do padro SQL, no PostgreSQL pode-se atribuir donos de objetos diferentes do dono do schema ao qual eles pertencem.
Excluso de Schema
S possvel remover um schema se este estiver vazio. Alternativamente, pode-se forar a
46
curso=#
Eventualmente podero ser vistos schemas na base de dados que no foram criados explicitamente. Esses schemas podero ter nomes como pg_toast, pg_temp_N e pg_toast_temp_N,
onde N um nmero inteiro.
pg_temp identifica schemas utilizados para armazenar tabelas temporrias e seu contedo
pode ser ignorado.
pg_toast e pg_toast_temp so utilizados para armazenar tabelas que fazem uso do TOAST,
explicado a seguir.
TOAST
Por padro, o PostgreSQL trabalha com pginas de dados de 8kB e no permite que um
registro seja maior do que uma pgina. Quando, por exemplo, um registro possui um campo
de algum tipo texto que recebe um valor maior do que 8kB, internamente criada uma
tabela chamada TOAST, que criar registros auxiliares de tal forma que o contedo do
campo original possa ser armazenado.
Esse processo completamente transparente para os usurios do Banco de Dados. Quando
inserimos ou consultamos um campo desse tipo, basta referenciar a tabela principal, sem
sequer tomar conhecimento das tabelas TOAST.
Vale mencionar que o PostgreSQL busca sempre compactar os dados armazenados em
tabelas TOAST.
Tablespaces
Tablespaces:
TOAST
abreviatura de The
Oversized-Attribute
Storage Technique, um
recurso do PostgreSQL
para tratar campos
grandes.
47
Servidor
PostgreSQL
Discos Lento
e Barato
tablespace tbs_arquivo
/disco1/data
Tabela Histrica
tablespace tbs_dados
/disco2/data
Tabelas
Disco
tablespace tbs_indices
/disco3/data
ndices Muito Usados
Figura 3.10
Exemplo de uso de
tablespaces
em discos de
diferentes tipos.
Discos Rpido
e caro
Para listar os tablespaces existentes no servidor, no psql use o comando \db ou consulte a
tabela do catlogo pg_tablespace.
Por padro, existem dois tablespaces pr-definidos:
TABLESPACE tbs_arquivo;
curso=#
Pode-se criar uma base de dados e definir seu tablespace, onde sero criados os objetos
do catlogo de sistema da base e tambm ser o tablespace padro dos objetos a serem
Administrao de Banco de Dados
48
No exemplo, o catlogo da base vendas foi criado no tablespace tbs_dados e, agora, se for
criada uma tabela sem informar um tablespace, ela ser tambm criada no tbs_dados e no
mais no pg_default.
possvel alterar o tablespace de uma tabela ou ndice, resultando em uma operao em que os
dados sero movidos para o novo local. Tambm podemos alterar o tablespace padro de uma
base, o catlogo e todos os objetos que foram criados sem informar o tablespace diferente sero
movidos tambm. Durante a alterao, os objetos ficam bloqueados mesmo para consultas.
Excluso de tablespaces
Para excluir um tablespace, ele deve estar vazio. Todos os objetos contidos nele devem ser
removidos antes. Para remover:
postgres=# DROP TABLESPACE tbs_arquivo;
11 pg_database.
11 pg_namespace.
11 pg_class.
11 pg_proc.
11 pg_roles.
11 pg_view.
11 pg_indexes.
11 Views estatsticas.
O Catlogo de Sistema ou Catlogo do PostgreSQL, e s vezes tambm chamado de dicionrio de dados, contm as informaes das bases e objetos criados no banco. O PostgreSQL
armazena informaes sobre todos os seus objetos, como tabelas, em outras tabelas, por
isso mesmo chamados de objetos internos e constituindo um meta modelo.
Existem dezenas de tabelas e views no catlogo, como por exemplo a pg_role e pg_attribute,
contendo respectivamente as informaes de roles do servidor e as informaes de todas as
colunas de todas as tabelas da base de dados. O catlogo uma rica fonte de informao e
controle do SGBD.
No altere dados direto no catlogo: use os comandos SQL para criar e alterar objetos.
11 pg_stats.
49
pg_database
Contm informaes das bases de dados do servidor. Ela global, existe uma para toda instncia.
datname
dattablespace
datacl
pg_namespace
Contm informaes dos schemas da base atual.
nspname
Nome do schema.
nspowner
ID do dono do schema.
nspacl
Privilgios do schema.
pg_class
A pg_class talvez seja a mais importante tabela do catlogo. Ela contm informaes de
tabelas, views, sequences, ndices e toast tables. Esses objetos so genericamente chamados de relaes.
relname
relnamespace
ID do schema da tabela.
relowner
ID do dono da tabela.
reltablespace
reltuples
relhasindex
relkind
relacl
Privilgios da tabela.
pg_proc
50
proname
Nome da funo.
prolang
ID da linguagem da funo.
pronargs
Nmero de argumentos.
prorettype
proargnames
prosrc
proacl
Privilgios da funo.
pg_roles
Esta uma viso que usa a tabela pg_authid. Contm informaes das roles de usurios e
grupos. Os dados de roles so globais instncia.
rolname
rolsuper
Se um superusurio.
rolcreaterole
rolcreatedb
rolcanlogin
Se pode conectar-se.
rolvaliduntil
Data de expirao.
pg_view
Contm informaes das vises da base atual.
viewname
Nome da viso.
schemaname
definition
Cdigo da viso.
pg_indexes
Contm informaes dos ndices da base atual.
schemaname
tablename
indexname
Nome do ndice.
definition
Cdigo do ndice.
pg_stats
schemaname
tablename
Attname
Nome da coluna.
null_frac
avg_width
n_distinct
most_common_vals
Correlation
Contm informaes mais legveis das estatsticas dos dados da base atual.
51
Vises estatsticas
O catlogo do PostgreSQL contm diversas vises estatsticas que fornecem informaes
que nos ajudam no monitoramento do que est acontecendo no banco. Essas vises contm
dados acumulados sobre acessos a bases e objetos.
Dentre essas vises, destacamos:
11 pg_stat_activity;
11 pg_locks;
11 pg_stat_database;
11 pg_stat_user_tables.
pg_stat_database
Essa viso mantm informaes estatsticas das bases de dados. Os nmeros so acumulados desde o ltimo reset de estatsticas.
As colunas xact_commit e xact_rollback somadas fornecem o nmero de transaes ocorridas no banco. Com o nmero de blocos lidos e o nmero de blocos encontrados, podemos
calcular o percentual de acerto no cache do PostgreSQL.
As colunas temp_files e deadlock devem ser acompanhadas, j que nmeros altos podem
indicar problemas.
Datname
xact_commit
xact_rollback
blks_read
blks_hit
temp_files
Deadlock
Nmero de deadlocks.
pg_stat_user_tables
Essa viso contm estatsticas de acesso para as tabelas da base atual, exceto do catlogo.
52
Schemaname
Relname
Nome da tabela.
seq_scan
idx_scan
n_live_tup
n_dead_tup
last_vacuum / last_autovacuum
last_analyze / last_autoanalyze
Existem diversas outras vises com informaes estatsticas sobre ndices, funes,
sequences, dados de I/O e mais. Para conhecer todas, acesse o link indicado no AVA.
Na sesso sobre Monitoramento, sero vistos exemplos de uso das tabelas e vises do Catlogo.
53
54
4
Aprender sobre os recursos de segurana do PostgreSQL; Entender o conceito e
gerenciamento de Roles; Conhecer os principais tipos de Privilgios, como fornec-los
e revog-los, alm do controle de Autenticao.
conceitos
Gerenciando roles
Controle de permisses por roles:
11 Usurio e Grupo.
11 Roles so globais ao servidor.
11 Primeiro superusurio criado no initdb.
11 No h relao entre usurio do SO e banco.
O PostgreSQL controla permisses de acesso atravs de roles. Estritamente falando, no
PostgreSQL no existem usurios ou grupos, apenas roles. Porm, roles podem ser entendidas como usurios ou grupos de usurios dependendo de como so criadas. Inclusive, o
PostgreSQL aceita diversos comandos com sintaxe USER e GROUP para facilitar a manipulao de roles (e para manter a compatibilidade com verses anteriores).
Roles existem no SGBD e a princpio no possuem relao com usurios do Sistema Operacional. Porm, para alguns utilitrios clientes, se no informado o usurio na linha de
comando, ele assumir o usurio do Sistema Operacional (ou a varivel PGUSER, se existir)
como por exemplo, no psql.
As roles so do escopo do servidor: no existe uma role de uma base de dados especfica,
ela vale para a instncia. Por outro lado, uma role pode ser criada no servidor e no possuir
acesso em nenhuma base de dados.
Quando a instncia inicializada com o initdb, criada a role do superusurio com o mesmo
nome do usurio do Sistema Operacional, geralmente chamado postgres.
objetivos
Administrando usurios
e segurana
55
Criao de roles
Para criar uma role, usa-se o comando CREATE ROLE. Esse comando possui diversas opes.
As principais sero apresentadas a seguir.
Uma prtica comum a criao de um usurio especfico que ser utilizado para conectar-se
ao banco por um sistema ou aplicao. Exemplo:
postgres=# CREATE ROLE siscontabil LOGIN PASSWORD a1b2c3;
Nesse comando, a opo LOGIN informa que a role pode conectar-se e define sua senha.
Esse formato de opes basicamente o que entende-se como um usurio.
Outro exemplo de criao de role para usurios:
postgres=# CREATE ROLE jsilva LOGIN
PASSWORD xyz321
Nesse exemplo, criamos uma role com opo VALID UNTIL que informa uma data de expirao para a senha do usurio. Depois dessa data, a role no mais poder ser utilizada.
Agora vamos criar uma role que possa criar outras roles. Para isso, basta informar a opo
CREATEROLE (tudo junto) ao comando:
postgres=# CREATE ROLE moliveira LOGIN
PASSWORD xyz321
CREATEROLE;
O comando GRANT fornece um privilgio para uma role e ser tratado em mais detalhes logo
frente. Nesse exemplo, fornecemos uma role contabilidade para outras roles, jsilva e moli-
veira. Assim essas duas roles recebem todos os privilgios que a role contabilidade tiver.
56
Esse conceito fica muito mais simples de entender se assumirmos jsilva e moliveira como
usurios e contabilidade como um grupo.
Outros atributos importantes das roles so:
11 SUPERUSER: fornece a role o privilgio de superusurio. Roles com essa opo no
precisam ter nenhum outro privilgio;
11 CREATEDB: garante a role o privilgio de poder criar bases de dados;
11 REPLICATION: roles com esse atributo podem ser usadas para replicao.
Excluso de roles
Para remover uma role, simplesmente use o comando DROP ROLE:
postgres=# DROP ROLE jsilva;
Entretanto, para uma role ser removida, ela no pode ter nenhum privilgio ou ser dona de
objetos ou bases. Se houver, ou os objetos devero ser excludos previamente ou deve-se
revogar os privilgios e alterar os donos.
Para remover todos os objetos de uma role, possvel utilizar o comando DROP OWNED:
postgres=# DROP OWNED BY jsilva;
Sero revogados todos os privilgios fornecidos a role e sero removidos todos os objetos
na base atual, caso no tenham dependncia de outros objetos. Caso queira remover os
objetos que dependem dos objetos da role, possvel informar o atributo CASCADE. Porm,
deve-se ter em mente que isto pode remover objetos de outras roles. Este comando no
remove bases de dados e tablespaces.
Caso deseje alterar o dono dos objetos da role que ser removida, possvel usar o
comando REASSIGN OWNED:
postgres=# REASSIGN OWNED BY jsilva TO psouza;
Modificando roles
Como na maioria dos objetos no PostgreSQL, as roles tambm podem ser modificadas com
um comando ALTER. A instruo ALTER ROLE pode modificar todos os atributos definidos
pelo CREATE ROLE. No entanto, o ALTER ROLE muito usado para fazer alteraes especficas em parmetros de configurao definidos globalmente no arquivo postgresql.conf ou na
linha de comando.
Por exemplo, no arquivo postgresql.conf pode estar definido o parmetro WORK_MEM com
4MB, mas para determinado usurio que executa muitos relatrios com consultas pesadas,
podemos definir, com a opo SET, um valor diferente. Por exemplo:
postgres=# ALTER ROLE psouza SET WORK_MEM = 8MB;
Para desfazer uma configurao especfica para uma role, use o atributo RESET:
Privilgios
Para fornecer e remover permisses em objetos e bases de dados, usamos os comandos
GRANT e REVOKE.
GRANT
Quando se cria uma base de dados ou um objeto em uma base, sempre atribudo um
dono. Caso nada seja informado, ser considerado dono a role que est executando o
comando. O dono possui direito de fazer qualquer coisa nesse objeto ou base, mas os
demais usurios precisam receber explicitamente um privilgio. Esse privilgio concedido
com o comando GRANT.
57
O GRANT possui uma sintaxe rica que varia de acordo com o objeto para o qual se est
fornecendo o privilgio.
Para exemplificar, considere a criao de uma base para os sistemas contbeis. Para atribuir
como dono a role gerente, que pertence ao Gerente da contabilidade, e que administrar
toda a base, o seguinte comando deve ser utilizado:
postgres=# CREATE DATABASE sis_contabil OWNER gerente;
O gerente por sua vez conecta em sua nova base, cria schemas e fornece os acessos que
considera necessrios:
sis_contabil=>
sis_contabil=>
O gerente criou o schema controladoria e forneceu o privilgio CREATE para a role controller,
que agora pode criar tabelas, vises e quaisquer outros objetos dentro do schema.
sis_contabil=>
sis_contabil=>
Foi ento criado o schema geral e fornecida permisso USAGE para o grupo contabilidade.
As roles jsilva e moliveira podem acessar objetos no schema geral, mas ainda dependem de
tambm receber permisses nesses objetos. Eles no podem criar objetos nesse schema,
mas apenas com o privilgio USAGE.
Uma vez criadas as tabelas e demais objetos no schema geral, o gerente pode fornecer os
privilgios para a role contabil, que o usurio usado pela aplicao:
sis_contabil=>
sis_contabil=>
sis_contabil=>
TO contabil;
Note que a primeira concesso o acesso base de dados com o privilgio CONNECT,
depois o acesso ao schema com USAGE e por fim o facilitador ALL TABLES, para permitir que
o usurio da aplicao possa ler e gravar dados em todas as tabelas do schema.
possvel fornecer tambm permisses mais granulares para o grupo contabilidade nas
tabelas do schema geral, conforme o exemplo:
sis_contabil=>
sis_contabil=>
TO contabilidade;
Nesses exemplos, foram fornecidas permisso de leitura de dados na tabela balano, e permisso de execuo da funo lancamento() ao grupo contabilidade.
Repasse de privilgios
Quando uma role recebe um privilgio com GRANT, possvel que ela possa repassar esses
mesmos privilgios para outras roles.
sis_contabil=>
TO moliveira
WITH GRANT OPTION;
58
Nesse exemplo, a role moliveira ganhou permisso para consultar e adicionar dados na tabela
geral.contas. Com a instruo WITH GRANT OPTION, ela tem o direito de repassar essa mesma
permisso para outras roles. Por exemplo, a role moliveira pode conectar-se e executar:
sis_contabil=>
TO jsilva;
Porm, a role moliveira no pode fornecer a role UPDATE ou DELETE na tabela, pois ela no
possui esse privilgio. Assim, se moliveira executar o comando:
sis_contabil=>
A role jsilva receber apenas INSERT e SELECT, que so os privilgios que o grant moliveira
possui e no todos os privilgios existentes para a tabela.
Privilgios de objetos
Os privilgios de objetos so relativamente intuitivos se considerarmos o significado de cada um
deles em ingls. Apresentamos alguns dos principais objetos e seus respectivos privilgios.
Base de dados:
Schemas:
11 CREATE: permite criar objetos no schema;
11 USAGE: permite acessar objetos do schema, mas ainda depende de permisso
no objeto.
Tabelas
SELECT, INSERT, UPDATE e DELETE so triviais para executar as respectivas operaes.
Para UPDATE e DELETE com clusula WHERE, necessrio tambm que a role possua
Com exceo do DELETE, para os demais privilgios possvel especificar colunas. Os exemplos a seguir fornecem permisso para a role psouza inserir, ler e atualizar dados apenas na
coluna descrio.
sis_contabil=#
INSERT (descricao),
UPDATE (descricao)
ON geral.balanco
TO psouza;
SELECT na tabela.
59
Truncate
uma operao
que elimina todos os
dados de uma tabela
mais rapidamente do
que o DELETE.
11 REFERENCES: permite que a role referencie essa tabela quando criando uma
foreign key em outra.
Vises/views
So tratadas no PostgreSQL praticamente como uma tabela devido sua implementao.
Tabelas, vises e sequncias (sequences) so vistas genericamente como relaes.
Por isso, vises podem receber GRANTS de escrita como INSERT e UPDATE. Porm, o funcionamento de comandos de insero e atualizao em uma view depender da existncia de
RULES ou TRIGGERS para trat-las.
Sequncias/sequences
Os seguintes privilgios se aplicam s sequncias:
Funes/procedures
As funes, ou procedures, possuem apenas o privilgio EXECUTE:
sis_contabil=#
GRANT EXECUTE
Clusula ALL
60
Para sequncias, vises e tabelas, existe a clusula ALL IN SCHEMA, que ajuda a fornecer
permisso em todos os objetos daquele tipo no schema. Essa uma tarefa extremamente
comum e antes dessa instruo era necessrio criar scripts que lessem o catlogo para
encontrar todos os objetos e preparar o comando de GRANT. Sintaxe:
sis_contabil=#
GRANT USAGE
TO contabilidade;
Vrios outros objetos do PostgreSQL, tais como languages, types, domains e large objects,
possuem privilgios que podem ser manipulados. A sintaxe muito semelhante ao que foi
mostrado e pode ser consultada na documentao online do PostgreSQL.
REVOKE
O comando REVOKE remove privilgios fornecidos com GRANT.
O REVOKE revogar um privilgio especfico concedido em um objeto ou base, porm no
significa que vai remover qualquer acesso que a role possua. Por exemplo, uma role pode
possuir um GRANT de SELECT direto em uma tabela, e ao mesmo tempo fazer parte de um
grupo que tambm possui acesso a tabela.
sis_contabil=#
sis_contabil=#
Fazer o REVOKE da role direta no impedir a role de acessar a tabela, pois ainda ter o
privilgio atravs do grupo.
sis_contabil=#
possvel revogar apenas o direito de repassar o privilgio que foi dado com WITH GRANT
OPTION, sem revogar o privilgio em si.
sis_contabil=>
FROM moliveira;
Nesse exemplo, a instruo GRANT OPTION FOR no remove o acesso de INSERT e SELECT
da role moliveira, apenas o direito de repassar essas permisses para outras roles.
Consultando os privilgios
Para consultar os privilgios existentes, no psql voc pode usar o comando \dp para listar as
permisses de tabelas, vises e sequences:
fazer isso fornecer o privilgio contabilidade, no caso uma role, para as outras roles:
61
curso=>
\dp cidades;
Name
| Type
Access privileges
| aluno=ar/postgres
(1 row)
Figura 4.1
Consultando
GRANTs com psql.
curso=#
A figura 4.1 mostra a sada do comando, a coluna Access privileges contm os usurios,
permisses e quem forneceu o privilgio na tabela. A primeira linha mostra as permisses
do dono da tabela, no caso o postgres:
postgres=arwdDxt/postgres
|
|
|______________ Role que recebeu os privilgios
Essa primeira linha indica a permisso padro que todo dono de objeto recebe automaticamente.
Na segunda linha, temos: aluno=ar/postgres
Significa que a role aluno recebeu os privilgios ar da role postgres.
62
INSERT (append)
SELECT (read)
UPDATE (write)
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT
TEMPORARY
Tabela 4.1
Privilgios.
Pela tabela, podemos ver que o postgres possui todos os privilgios possveis para uma
tabela, arwdDxt:
INSERT(a), SELECT(r), UPDATE(w), DELETE(d), TRUNCATE(D), REFERENCES(x) e TRIGGER(t).
J a role aluno possui apenas INSERT(a) e SELECT(r).
curso=# GRANT SELECT ON cidades TO professor WITH GRANT OPTION;
GRANT
curso=# GRANT INSERT, UPDATE, DELETE ON cidades TO professor;
GRANT
curso=# \dp cidades;
Access privileges
Schema |
Name
| Type
Access privileges
Figura 4.2
Privilgios com
WITH GRANT
OPTION.
| aluno=ar/postgres
| professor=ar*wd/postgres
+|
|
(1 row)
curso=#
Alm dos privilgios, voc pode ver um * entre as letras. Isso significa que a role pode
repassar o privilgio, pois recebeu o atributo WITH GRANT OPTION.
No exemplo da figura 4.2, a role professor pode repassar apenas o privilgio SELECT(r).
possvel tambm verificar os privilgios nas bases de dados, pelo psql, com o comando \l.
No exemplo abaixo da figura 4.3, alm da primeira linha que se refere ao owner postgres, a
role aluno possui privilgios para criar tabelas temporrias TEMP(T) e CONNECT(c). J a role
professor possui essas duas e ainda o privilgio de CREATE(C).
curso=# \l
List of databases
Name
Owner
| Encoding |
Collate
Ctype
Access privileges
------+----------+----------+-------------+-------------+------------------------
Figura 4.3
Privilgios de bases
de dados com o
comando \l.
| postgres=CTc/postgres +
| aluno=Tc/postgres
| professor=CTc/postgres
63
curso=# \dn+
List of schemas
Name
Owner
| Access privileges
| Description
-----------+----------+---------------------------+-----------------------avaliacao | postgres |
extra
| postgres | aluno=U/postgres
|
public
| postgres=UC/postgres
|
+|
|
| postgres | postgres=UC/postgres+
| =UC/postgres
Figura 4.4
Privilgios de
Schemas com o
comando \dn+
do psql.
Ao executar \dp, se a coluna access privileges estiver vazia, significa que est com
apenas os privilgios default. Aps o objeto receber o primeiro GRANT, esta coluna
passar a mostrar todos os privilgios.
Alm dos comandos do psql, podemos consultar privilgios existentes em bases, schemas e
objetos atravs de diversas vises do catlogo do sistema e tambm atravs de funes de
sistema do PostgreSQL.
Por exemplo, a funo has_table_privilege(user, table, privilege) retorna se determinado
usurio possui determinado privilgio na tabela.
curso=# select has_table_privilege(aluno,cidades,UPDATE);
has_table_privilege
--------------------f
(1 row)
curso=# select has_table_privilege(aluno,cidades,SELECT);
has_table_privilege
--------------------t
(1 row)
curso=#
PostgreSQL, consultar as permisses de objetos, schemas e bases com ela muito simples.
64
Figura 4.5
Consulta privilgios
do usurio/tabela
com funes de
sistema.
Gerenciando autenticao
Uma parte importante do mecanismo de segurana do PostgreSQL o controle de autenticao de clientes pelo arquivo pg_hba.conf, onde HBA significa Host Based Authentication.
Basicamente, nesse arquivo de configurao temos vrias linhas, onde cada linha um
registro indicando permisso de acesso de uma role, a partir de um endereo IP a determinada base.
Por padro a localizao do arquivo PGDATA/pg_hba.conf, mas nome e diretrio podem
ser alterados.
O formato de cada registro no arquivo :
tipo conexo
base de dados
usurio
endereo
mtodo
Um exemplo de registro que permitiria a role aluno conectar na base de dados curso
poderia ser assim:
host
curso
aluno
10.5.15.40/32
md5
Essa linha host diz que uma conexo IP, na base curso, com usurio aluno, vindo do endereo IP 10.5.15.40 autenticando por md5 pode passar.
Um outro exemplo seria permitir um grupo de usurios vindos de determinada rede em vez
de uma estao especfica.
host
contabil
+contabilidade
172.22.3.0/24
md5
Figura 4.6
Consultando
privilgios com
pgAdmin III.
65
Nesse exemplo, qualquer usurio do grupo contabilidade, acessando a base contabil, vindo
de qualquer mquina da rede 172.22.3.x e autenticando por md5 permitido.
Destacamos o sinal +, que identifica um grupo e a mscara de rede /24.
H diversas opes de valores para cada campo. Veja algumas nas tabelas:
Tipo de conexo
local
host
hostssl
Base de dados
nome da(s) base(s)
all
replication
Usurio
role(s)
+grupo(s)
all
Endereo
Um endereo IP v4
Um rede IP v4
Um endereo IP v6
Um rede IP v6
0.0.0.0/0
::/0
all
Qualquer IP.
possvel usar nomes de mquinas em vez de endereos IP, porm isso pode gerar pro Administrao de Banco de Dados
66
Mtodo
trust
md5
password
ldap
reject
Rejeita a conexo.
DATABASE
USER
ADDRESS
METHOD
Quando o banco inicializado com o initdb, um arquivo pg_hba.conf modelo criado com
algumas concesses por padro. A figura 4.7 mostra os registros que permitem a qualquer
conexo do prprio servidor local, seja por unix-socket (local), por IPv4 (127.0.0.1) ou por
IPv6 (::1), conectar em qualquer base com qualquer usurio e sem solicitar senha.
Se no houver uma entrada no arquivo pg_hba.conf que coincide com a tentativa de
Figura 4.8
Acesso negado por
falta de autorizao
no pg_hba.conf.
conexo, o acesso ser negado. Voc ver uma mensagem como na figura 4.8:
67
Boas prticas
Apresentamos a seguir algumas dicas relacionadas segurana que podem ajudar na
administrao do PostgreSQL.
So elas:
11 Utilize roles de grupos para gerenciar as permisses. Como qualquer outro servio
no somente Bancos de Dados , administrar permisses para grupos e apenas
gerenciar a incluso e remoo de usurios do grupo torna a manuteno de acessos
mais simples;
11 Remova as permisses da role public e o schema public se no for utiliz-lo. Retire a
permisso de conexo na base de dados, de uso do schema e qualquer privilgio em
objetos. Remova tambm no template1 para remover das futuras bases;
11 Seja meticuloso com a pg_hba.conf, em todos os seus ambientes. No incio de um novo
servidor, ou mesmo na criao de novas bases, pode surgir a ideia de liberar todos
os acessos base e controlar isso mais tarde. No caia nessa armadilha! Desde o primeiro acesso, somente fornea o acesso exato necessrio naquele momento. Sempre
crie uma linha para cada usurio em cada base vindo de cada estao ou servidor.
comum sugerir a liberao de acesso a partir de uma rede de servidores de aplicao e no um servidor especfico. Evite isso;
11 Somente use trust para conexes locais no servidor e assim mesmo se voc confia
nos usurios que possuem acesso ao servidor ou ningum alm dos administradores
de banco possuem acesso para conectar-se no Sistema Operacional;
11 Documente suas alteraes. possvel associar comentrios a roles. Documente o
nome real do usurio, utilidade do grupo, quem e quando solicitou a permisso etc.
Tambm comente suas entradas no arquivo pg_hba.conf. De quem o endereo IP,
estao de usurio ou nome do servidor, quem e quando foi solicitado;
68
5
Conhecer ferramentas e recursos para ajudar na tarefa de monitoramento do
PostgreSQL e do ambiente operacional; Compreender as principais informaes
que devem ser acompanhadas e medidas no Sistema Operacional e no banco,
e conhecer as opes para monitor-las.
pg_locks e tps.
conceitos
ps; top; iostat; vmstat; Nagios; Cacti; Zabbix; pg_Fouine; pg_Badger; pg_stat_activity;
Monitoramento
Depois que instalamos e configuramos um servio em produo que realmente o trabalho se inicia. Acompanhar a sade de um ambiente envolve monitorar diversos componentes, por vezes nem todos sob a alada das mesmas pessoas. Essas partes podem ser,
por exemplo, o servio de Banco de Dados em si, a infraestrutura fsica de rede, servios de
rede como firewall e DNS, hardware do prprio servidor de banco, Sistema Operacional do
servidor de banco, infraestrutura de storage e carga proveniente de servidores de aplicao.
Administradores de ambientes Unix/Linux acostumados a monitoramento de servios
talvez j estejam bastante preparados para monitorar um servidor PostgreSQL, pois muitas
das ferramentas usadas so as mesmas, como o ps, top, iostat, vmstat e outras. Isso no
por acaso, mas sim porque muitos dos problemas enfrentados na administrao de servidores de Banco de Dados esto relacionados aos recursos bsicos de um sistema computacional: memria, processador e I/O.
Suponha um ambiente que no sofreu atualizao recente. O PostgreSQL no foi atualizado,
o SO no foi atualizado, nenhum servio ou biblioteca foi atualizado e nem a aplicao.
Se nos defrontamos com um problema de lentido, normalmente temos duas hipteses iniciais: ou aumentou a carga sobre o banco ou temos um problema em algum desses recursos.
objetivos
Monitoramento do ambiente
69
Memria
Sistema Operacional
Clientes
Estatsticas
ndices
Locks
Firewall
Discos e Storages
Rede
Hardware
A primeira coisa em um servidor Linux seria consultar o load, provavelmente com o top.
Se a carga est maior do que de costume, investigamos se h algum processo abusando de
CPU ou talvez excesso de processos. Em seguida podemos verificar se h memria suficiente com o free ou o prprio top, por exemplo. Pode estar ocorrendo swap por falta de
memria, ou por outros motivos. Nesse caso podemos verificar com o sar ou vmstat.
O terceiro passo talvez seja verificar se h gargalo de I/O. Podemos usar novamente o top
para uma informao bsica ou o iostat.
Um administrador de Banco de Dados deve tambm suspeitar se h processos bloqueados.
Nesse caso precisaremos usar uma ferramenta especfica para o PostgreSQL como o pg_activity
e pgAdmin, ou consultar tabelas do catlogo que mostrem o status dos processos e os locks
envolvidos. Uma transao pode estar aberta h muito tempo e bloqueando recursos, o
que pode ser verificado pela view do catlogo pg_stat_activity ou pelo prprio pg_activity.
Um processo pode estar demorando demais e no desocupando CPUs ou gerando muitos
arquivos temporrios, hiptese que pode ser confirmada pela anlise dos logs do PostgreSQL.
Ainda poderamos considerar algum erro no nvel do Sistema Operacional, verificando a
syslog ou as mensagens do kernel, onde algum indcio relacionado a hardware ou falhas de
Administrao de Banco de Dados
Figura 5.1
Diferentes aspectos
do PostgreSQL,
que devem ser
monitorados.
Em especial para o PostgreSQL, voc pode configurar seus logs para um formato que possa
ser processado automaticamente por ferramentas que geram relatrios, destacando as
queries mais lentas, as mais executadas, as que mais geraram arquivos temporrios, entre
muitos outros indicadores que ajudam em muito a controlar o comportamento do banco.
Duas ferramentas para essa finalidade so o pg_Fouine e o excelente pg_Badger.
11 Vmstat.
11 Iostat.
11 sar e Ksar.
Em funo da arquitetura do PostgreSQL, que trata cada conexo por um processo do SO,
podemos monitorar a sade do banco monitorando os processos do SO pertencentes ao
PostgreSQL.
A seguir analisaremos os utilitrios e ferramentas que permitem esse monitoramento.
top
Para monitorar processos no Linux talvez a ferramenta mais famosa seja o top. O top um
utilitrio bsico na administrao de servidores e podemos extrair informaes valiosas.
Basta executar top na shell para invoc-lo. Pode ser til com o PostgreSQL exibir detalhes
do comando com -c e filtrar apenas os processos do usurio postgres com -u.
Figura 5.2
Monitoramento de
processos com top.
Existem diversas
variaes do top: uma
opo com uma
interface mais amigvel
o htop.
top -p postgres -c
Com o top, podemos verificar facilmente o load mdio dos ltimos 1min, 5min e 15min,
nmeros de processos totais, nmero de processos em execuo, total de memria usada,
livre, em cache ou em swap. Percentual de CPU para processos do kernel(sys), demais
processos(us) e esperando I/O (wa). Mas, principalmente, podemos verificar os processos
que esto consumindo mais CPU.
Merece destaque a coluna S, que representa o estado do processo. O valor D indica que o
processo est bloqueado, geralmente aguardando operaes de disco. Deve-se acompanhar
se est ocorrendo com muita frequncia ou por muito tempo.
71
vmstat
Outra importante ferramenta a vmstat. Ela mostra diversas informaes dos recursos
por linha em intervalos de tempo passado como argumento na chamada. Para executar o
vmstat atualizando as informaes uma vez por segundo, basta o seguinte comando:
$
vmstat 1
Figura 5.3
Monitorando seu
ambiente com
vmstat.
sador. Servidores atuais, multiprocessados e multicore podem exibir nmeros bem altos
72
para troca de contexto; e altos para interrupes devido grade atividade de rede.
Em cpu temos os percentuais de processador para processos de usurios (us), do kernel (si),
no ocupado (id) e aguardando operaes de I/O (wa). Um I/O wait alto um alerta, indicando que algum gargalo de disco est ocorrendo. Percentuais de cpu para system tambm
devem ser observados, pois se estiverem fora de um padro comumente visto podem
indicar a necessidade de se monitorar os servios do kernel.
l
Na vmstat, o ponto de
vista sempre da
memria principal,
ento IN significa
entrando na memria,
e OUT saindo.
iostat
Se for necessrio analisar situaes de trfego de I/O, a ferramenta iostat indicada.
Ela exibe informaes por device em vez de dados gerais de I/O, como a vmstat. Para
invocar a iostat, informamos um intervalo de atualizao, sendo til informar tambm a
unidade para exibio dos resultados (o padro trabalhar com blocos de 512 bytes).
A seguinte chamada atualiza os dados a cada cinco segundos e em MB:
$
iostat -m 5
Figura 5.4
Monitorando
devices de I/O
com iostat.
O iostat pode no estar instalado em seu ambiente. Ele faz parte do pacote sysstat
e pode ser instalado atravs do comando sudo apt-get install sysstat (Debian/Ubuntu)
ou sudo yum install sysstat (Red Hat/CentOS).
O iostat exibe um cabealho com os dados j conhecidos de CPU e uma linha por device
com as estatsticas de I/O. A primeira coluna a tps, tambm conhecida como IOPS, que
o nmero de operaes de I/O por segundo. Em seguida exibe duas colunas com MB lidos e
escritos por segundo, em mdia. As ltimas duas colunas exibem a quantidade de dados em
MB lidos e escritos desde a amostra anterior, no exemplo, a cada 5 segundos.
iostat -x -m 5
Repare que a primeira amostra exibe valores altssimos porque ela conta o total de dados
73
Duas colunas merecem considerao na forma estendida: await e %util. A primeira o tempo
mdio, em milissegundos, que as requisies de I/O levam para serem servidas (tempo na fila e
de execuo). A outra, %util, mostra um percentual de tempo de CPU em que requisies foram
solicitadas ao device. Apesar de esse nmero no ser acurado para arrays de discos, storages e
discos SSD, um percentual prximo de 100% certamente um indicador de saturao.
A figura 5.6 mostra um exemplo de sistema prximo da saturao, com I/O wait prximo de 20%
e %util do device sde prximo de 100%. Interessante notar que a carga de I/O naquela amostra
no era alta, 2MB/s, porm estava apresentando fila e tempo de resposta (await) elevando.
Figura 5.6
Sistema com pico
de I/O.
sar e Ksar
O sar outra ferramenta extremamente verstil instalada junto com o pacote sysstat. Ela
pode reportar dados de CPU, memria, paginao, swap, I/O, huge pages, rede e mais.
Para utiliz-la, pode ser necessrio ativar a coleta, normalmente no arquivo de configurao
/etc/default/sysstat nos sistemas Debian/Ubuntu ou pela configurao da Cron nos sistemas
Red Hat/CentOS em /etc/cron.d/sysstat.
Com a coleta de estatsticas do sistema funcionando, possvel utilizar o KSar para gerar
grficos sob demanda. O KSar uma aplicao open source em Java muito simples de usar.
Uma vez acionado o KSar, basta fornecer as informaes para conexo com o host que
deseja analisar. A conexo estabelecida via SSH e recupera os dados coletados com o
74
Figura 5.7
Exemplo de
sada do sar -d,
informaes de I/O.
Monitorando o PostgreSQL
As principais ferramentas que permitem o monitoramento do PostgreSQL so:
11 pg_activity.
11 pgAdmin III.
11 Nagios.
11 Cacti.
11 Zabbix.
pg_activity
pg_activity. uma ferramenta open source semelhante ao top como monitoramento de processos, mas cruzando informaes de recursos do Sistema Operacional com dados do banco
sobre o processo, como qual a query em execuo, h quanto tempo, se est bloqueada por
outros processos e outras informaes.
75
A maior vantagem do pg_activity sobre ferramentas genricas de monitoramento de processos que ela considera o tempo em execuo da query e no do processo em si. Isso
muito mais til e realista para o administrador de Banco de Dados.
Uma caracterstica interessante dessa ferramenta o fato de ela apresentar cada processo
Figura 5.9
pg_activity, umas
das melhores
ferramentas para
PostgreSQL.
normalmente na cor verde. Se a query est em execuo h mais de 0,5s, ela exibida em
amarelo, e em vermelho se estiver em execuo h mais de 1s. Isso torna muito fcil para o
administrador enxergar algo fora do normal e possibilita tomar decises mais rapidamente.
Exibe tambm qual a base, usurio, carga de leitura(READ/s) e escrita(WRITE/s) em disco.
Indica se o processo est bloqueado por outro (W) ou se o processo est bloqueado aguar-
76
possvel listar somente os processos que esto bloqueando (Blocking Queries). Para tanto,
basta pressionar F3 ou 3. O mesmo vale para os processos que esto sendo bloqueados
(Waiting Queries), filtrados atravs da tecla F2 ou 2.
Figura 5.10
Processos no pg_
activity aguardando
operaes em
disco, coluna IOW.
Acima dos processos, nos dados gerais no topo, exibido o Transactions Per Second
(TPS), que so operaes no banco por segundo. Essa informao uma boa mtrica para
acompanharmos o tamanho do ambiente. Ela indica qualquer comando disparado contra o
banco, incluindo selects.
Tambm so exibidos dados gerais de I/O, com dados de leitura e escrita tanto em MB por
segundo (throughput) quanto em operaes por segundo.
Dependendo do que se deseja analisar, pode-se querer suprimir o texto da query para
mostrar mais processos na tela. possvel alternar entre a exibio da query completa,
identada ou apenas um pedao inicial pressionando a tecla v.
pgAdmin III
A ferramenta grfica mais utilizada com o PostgreSQL, a pgAdmin III, tambm possui facilidades para o seu monitoramento.
Depois de conectado a um servidor, acesse o menu Tools e a opo Server Status.
Ser aberta uma nova janela, por padro com quatro painis. Um deles exibe a log do
PostgreSQL (caso tenham sido instaladas no servidor algumas funes utilitrias).
Os outros trs so Activity, Locks e Prepared Transactions.
Activity lista todos os processos existentes, com todas as informaes relevantes como base,
usurios, hora de incio de execuo da query, a query em si, estado e outras informaes.
Quando o processo est bloqueado, ele mostrado em vermelho. Se est demorando mais
de 10s, exibido em laranja.
possvel cancelar queries e matar processos pelo painel Server Status.
Figura 5.11
pg_activity:
pressionando v
alterna modo de
exibio da query.
77
O painel Locks exibe todos os locks existentes e informaes como o processo, o modo de
lock, se foi fornecido ou no e a relao (tabela ou ndice) cujo lock se refere.
Figura 5.12
Server Status no
pgAdmin III.
Nagios
O Nagios open source e uma das ferramentas mais usadas para monitoramento de
servios e infraestrutura de TI. possvel monitorar praticamente tudo com ele, desde
equipamentos de rede passando por disponibilidade de servidores at nmero de scans
em tabelas do banco, seja pelo protocolo padro para gerenciamento SNMP seja por scripts
especficos. O fato de ser to flexvel e poderoso traz, como consequncia, o fato de no ser
Administrao de Banco de Dados
78
l
Apesar de muitas
dessas aes ainda
requererem que se
escreva scripts, o
Nagios ajuda em muito
a centralizao do
monitoramento.
Mas seu uso pode
exigir tambm a
instalao de um
agente nos servidores
monitorados.
Podemos utilizar o Nagios para monitorar dados internos do PostgreSQL atravs de plugins,
sendo o mais conhecido deles para o PostgreSQL o check_postgres. Alguns exemplos de
acompanhamentos permitidos pelo check_postgres so tabelas ou ndices bloated
(inchados), tempo de execuo de queries, nmero de arquivos de WAL, taxa de acerto no
cache ou diferena de atualizao das rplicas.
Figura 5.13
Nagios:
monitoramento
e alertas de
infraestrutura.
79
Cacti
O Cacti uma ferramenta com uma filosofia diferente. uma ferramenta para gerao de
grficos e no de emisso de alertas. Sua utilidade est em auxiliar na anlise de dados
histricos para diagnstico de problemas ou para identificao dos padres normais de uso
dos recursos. Outra utilidade para planejamento de crescimento com base na anlise, por
exemplo, do histrico de percentual de uso de CPU ou uso de espao em disco.
Figura 5.14
Cacti: grficos e
dados histricos.
80
Zabbix
Outra ferramenta open source de monitoramento o Zabbix, que une funcionalidades de
alertas do Nagios e plotagem de grficos do Cacti. O Zabbix mais flexvel que o Nagios no
gerenciamento de alertas, possibilitando ter mais nveis de estado para um alerta do que
somente warning e critical.
Figura 5.15
Zabbix: uma juno
de Nagios e Cacti.
81
pg_stat_activity
A pg_stat_activity considerada extremamente til, por exibir uma fotografia do que os
usurios esto executando em um determinado momento. Essa view fornece algumas
vantagens sobre o uso de ferramentas como o pg_activity. Primeiro, ela contm mais
informaes, como a hora de incio da transao. Uma segunda vantagem que podemos
manipul-la com SELECT para listarmos apenas o que desejamos analisar, como por
exemplo, apenas os processos de determinado usurio ou base de dados, ou que a query
contenha determinado nome de tabela, ou ainda selecionar apenas aquelas em estado IDLE
IN TRANSACTION. O uso dessa view fornece uma alternativa gil e poderosa para o administrador PostgreSQL monitorar a atividade no banco.
Datid
ID da base de dados.
datname
Pid
ID do processo.
usesysid
ID do usurio.
usename
Login do usurio.
application_name
Nome da aplicao.
client_addr
client_hostname
client_port
backend_start
xact_start
query_start
state_change
waiting
State
query
82
FROM pg_stat_activity
WHERE datname=curso
AND waiting
Tabela 5.1
Colunas da
pg_stat_activity.
Outra possibilidade: matar todos os processos que esto rodando h mais de 1h, mas no
esto bloqueados, ou seja, simplesmente esto demorando demais:
postgres=# SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname=curso
pg_locks
A viso pg_locks contm informaes dos locks mantidos por transaes, explcitas ou implcitas, abertas no servidor.
Tipo de objeto alvo do lock. Por exemplo: relation(tabela), tuple(registro),
transactionid (transao)
Database
Base de dados
Relation
Transactionid
Pid
Mode
Granted
Em algumas situaes mais complexas, pode ser necessrio depurar o contedo da tabela pg_locks
para identificar quem o processo raiz que gerou uma cascata de locks. A seguinte query usa
pg_locks e pg_stat_activity para listar processos aguardando locks de outros processos:
postgres =#
SELECT
waiting.relation::regclass
waiting_stm.query
AS waiting_query,
waiting.pid
blocker.relation::regclass
blocker_stm.query
AS waiting_table,
AS waiting_pid,
AS blocker_table,
AS blocker_query,
blocker.pid
AS blocker_pid,
blocker.granted
AS blocker_granted
FROM
pg_locks AS waiting,
pg_locks AS blocker,
pg_stat_activity AS waiting_stm,
pg_stat_activity AS blocker_stm
AND waiting.relation
OR waiting.transactionid = blocker.transactionid)
= blocker.relation)
Tabela 5.2
Principais colunas
da pg_locks.
Locktype
83
Nessa consulta a view pg_stat_user_tables o resultado obtido traz todas as tabelas e calcula
o percentual de index scan em cada uma:
curso=# SELECT
schemaname,
relname,
seq_scan,
idx_scan,
((idx_scan::float / (idx_scan + seq_scan)) * 100) as percentual_idxscan
FROM pg_stat_user_tables
WHERE (idx_scan + seq_scan) > 0
ORDER BY percentual_idxscan;
Para listar todas as bases e seus respectivos tamanhos, ordenado da maior para menor:
84
pg_size_pretty(pg_database_size(datname)) AS tamanho
FROM pg_database
ORDER BY 1;
Figura 5.16
Dependncia entre
processos causadas
por Locks.
Um exemplo que lista os objetos, tabelas e ndices que contm mais dados no Shared Buffer,
ou seja, que esto tirando maior proveito do cache, :
postgres=# SELECT n.nspname || . || c.relname as objeto,
pg_size_pretty(count(*) * 8192) as tamanho
FROM pg_class c
INNER JOIN pg_buffercache b ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d ON b.reldatabase = d.oid
AND d.datname = current_database()
INNER JOIN pg_namespace n ON c.relnamespace = n.oid
GROUP BY n.nspname || . || c.relname
ORDER BY 2 DESC;
Finalmente, listar todos os ndices por tabela, com quantidade de scans nos ndices, ajuda
a decidir a relevncia e utilidade dos ndices existentes. Essa informao pode ser obtida
atravs da seguinte consulta:
postgres=# SELECT r.relname as tabela,
c.relname as indice,
idx_scan as qtd_leituras
FROM pg_stat_user_indexes i
JOIN pg_class r ON i.relid=r.oid
JOIN pg_class c ON i.indexrelid=c.oid
JOIN pg_namespace nsp ON r.relnamespace=nsp.oid
WHERE nspname NOT LIKE pg_%
ORDER BY 1,2 DESC;
Tabela 5.3
Funes para
consulta de
consumo de
espao.
pg_database_size(nome)
pg_relation_size(nome)
pg_table_size(nome)
pg_indexes_size(nome)
pg_tablespace_size(nome)
Tamanho de um tablespace.
pg_total_relation_size(nome)
pg_size_pretty(bigint)
85
am_tabela,
pg_size_pretty(pg_table_size(schemaname || . || relname)) as tam_
tabela_toast,
pg_size_pretty(pg_indexes_size(schemaname || . || relname)) as ta
m_indices,
pg_size_pretty(pg_total_relation_size(schemaname || . || relname)
) as tam_total_tabela
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(schemaname || . || relname) DESC;
Existem diversas outras vises com informaes estatsticas sobre ndices, funes,
sequences, dados de I/O e mais.
11 log_line_prefix.
11 log_filename.
11 log_rotation_age.
11 log_rotation_size.
11 log_min_duration_statement.
11 log_statement.
O log do PostgreSQL bastante flexvel e possui uma srie de recursos configurveis. Vamos
ver alguns parmetros de configurao que permitiro registrar queries e eventos que
ajudam a monitorar a sade do banco.
J vimos na sesso 2, em configurao do PostgreSQL, que podemos ligar a coleta da log
em arquivos com o parmetro logging_collector. Os arquivos sero criados por padro no
diretrio pg_log sob o PGDATA.
Outros parmetros que devem ser considerados:
11 log_destination: indica onde a log ser gerada. Por padro para a sada de erro stderr.
86
Para armazenar os arquivos com logging_collector, esse valor deve ser stderr ou csvlog.
Com o valor syslog, pode-se tambm usar o recurso de log do Sistema Operacional,
porm alguns tipos de mensagens no so registradas nesse modo;
11 log_line_prefix: o formato de um prefixo para cada linha a ser registrada. Existem
diversas informaes que podem ser adicionadas a esse prefixo, como a hora (%t), o
usurio (%u) e o id do processo(%p). Porm, para usarmos ferramentas de relatrios de
queries, como pgFouine e pgBadger, devemos utilizar alguns padres nesse prefixo.
Um padro comumente utilizado :
log_line_prefix = %t [%p]: [%l-1] user=%u,db=%d
Note que h um espao em branco ao final, que deve ser mantido. Esse formato produzir
no log sadas como o exemplo a seguir.
2014-01-22 10:56:57 BRST [9761]: [16-1] user=aluno,db=postgres LOG:
1.527 ms
duration:
11 log_filename: define o formato do nome de arquivo. O valor padro inclui data e hora
da criao do arquivo. Esse formato, alm de identificar o arquivo no tempo, impede que
este seja sobrescrito.
log_filename = postgresql-%Y-%m-%d_%H%M%S.log
de problemas. Uma boa prtica pode ser usar log_statement = mod, para registrar qualquer
87
Uma boa opo gravar as logs em um disco separado: pode ser feito mudando o parmetro log_directory ou usando links simblicos e registrar apenas o que crucial por
padro. Quando houver alguma situao especial, a ento ligar temporariamente o registro
das informaes pertinentes para avaliar tal situao.
88
Os relatrios exibem sees com rankings, como as queries mais lentas, queries que
tomaram mais tempo e queries mais frequentes.
A seo mais til a que mostra as queries que tomaram mais tempo no total de suas
execues seo Queries that took up most time (N) , j que ao analisar uma query no
devemos considerar somente seu tempo de execuo, mas tambm a quantidade de vezes em
que esta executada. Uma query que tenha durao de 10 minutos uma vez ao dia consome
menos recursos do que uma query que dure 5s, mas executada mil vezes ao dia. Nessa
seo exibido o tempo total tomado por todas as execues da query, o nmero de vezes e o
tempo mdio. A query normalizada mostrada, junto com trs exemplos com valores.
Figura 5.17
pgBadger: diversas
informaes
coletadas no
PostgreSQL.
cd /usr/local/src/
cd pgbadger-4.1/
perl Makefile.PL
$ make
$
O pgBadger ser instalado em /usr/local/bin e j deve estar no seu PATH. Assim, basta executar o pgBadger passando os arquivos de log que deseja processar como parmetro:
$
Esse exemplo ler todos os arquivos com extenso .log no diretrio pg_log e vai gerar um
arquivo de sada chamado relatorio.html. Voc pode informar um arquivo de log, uma lista
de arquivos ou at um arquivo compactado contendo um ou mais arquivos de log.
Figura 5.18
Seo Time
consuming queries
do pgBadger,
mostrando queries
lentas.
89
Extenso pg_stat_statements
11 Extenso do PostgreSQL para capturar queries em tempo real
Depois de reiniciar o PostgreSQL e criar a extenso em alguma base, a view j pode ser acessada.
postgres=# SELECT
FROM pg_stat_statements
90
ORDER BY total_time
l
Uma boa prtica
copiar, uma vez ao dia,
os arquivos de log do
dia anterior. Esses
arquivos podem ser
compactados e
transferidos para uma
rea especfica, fazendo
o agendamento para
que o pgBadger
processo todos os
arquivos colocados
nessa rea. Assim,
diariamente pode-se
ter o relatrio do que
aconteceu no dia
anterior para anlise.
Figura 5.19
Queries mais
executadas
com o pg_stat_
statements.
pgBench
Benchmark:
Testes que avaliam o
desempenho de um
ambiente ou um objeto
especfico, como um
item de hardware ou
software. Tambm
comum usar essas avaliaes quando se est
fazendo tuning para
medir a eficcia de um
ajuste em particular.
O pgbench uma extenso do PostgreSQL usada para fazer testes de benchmark e avaliar
o desempenho dos recursos e do banco.
O pgBench utiliza testes simples baseados no padro TPC-B, antigo modelo de teste da
Transaction Processing Performance Council (TPC), organizao que cria modelos de testes
de avaliao para sistemas computacionais baseado em uma taxa de transaes, tps, e
divulga resultados.
O teste do pgBench uma transao simples, com updates, inserts e selects executadas
diversas vezes, possivelmente simulando diversos clientes e conexes, e no final fornece a
taxa de transaes em TPS transaes por segundo.
O pgBench possui duas operaes bsicas:
11 Criar e popular uma base;
Figura 5.20
Teste com o
pgBench.
91
Resumo
Monitorando pelo Sistema Operacional:
11 Usar o top para uma viso geral dos processos. Alm das informaes gerais, a coluna S
(status), com valor D, deve ser observada, alm do iowait (wa);
11 A vmstat uma excelente ferramenta para observar o comportamento das mtricas,
processos esperando disco (b), comportamento da memria e ocorrncias de swap que
devem ser monitoradas;
11 A iostat exibe as estatsticas por device. Analisar o tempo para atendimento de requisies de I/O (await) e a saturao do disco ou canal (%util).
Monitorando pelo PostgreSQL:
11 Torne o pg_activity sua ferramenta padro. Com o tempo voc conhecer quais so as
queries normais e as problemticas que merecem ateno, detectar rapidamente processos bloqueados ou com transaes muito longas. Ateno s colunas W (waiting)
e IOW (aguardando disco), e aos tempos de execuo: amarelo > 0,5 e vermelho > 1s;
11 O pgAdmin pode ajudar a detectar quem est bloqueando os outros processos
mais facilmente;
11 Monitore seus PostgreSQL com o Nagios, Cacti e Zabbix, ou outra ferramenta de
alertas, dados histricos e grficos. Elas so a base para atendimento rpido e planejamento do ambiente;
11 Analise as vises estatsticas do catlogo para monitorar a atividade do banco, crie seus
scripts para avaliar situaes rotineiras;
11 Use o pgBadger automatizado para gerar relatrios dirios do uso do banco e top
queries. Priorize a melhoria das queries em Time consuming queries;
11 Use a extenso pg_stat_statements para ver as top queries em tempo real;
11 pgBench.
92
6
Aprender as rotinas essenciais de manuteno do Banco de Dados PostgreSQL,
principalmente o Vacuum e suas variaes; Conhecer as formas de execuo do
vacuum manual e automtico, o processo de atualizao de estatsticas, alm dos
procedimentos Cluster e Reindex; Elencar os problemas mais comuns relacionados
ao Autovacuum e solues possveis.
conceitos
Nas sesses anteriores, o termo Vacuum foi mencionado repetidas vezes. Trata-se de procedimento diretamente ligado ao processo de administrao do PostgreSQL, que precisa ser
realizado com a frequncia necessria.
Vacuum
Como j vimos, o PostgreSQL garante o Isolamento entre as transaes atravs do MVCC.
Esse mecanismo cria verses dos registros entre as transaes, cuja origem so operaes de DELETE, UPDATE e ROLLBACK. Essas verses quando no so mais necessrias a
nenhuma transao so chamadas dead tuples, e limp-las a funo do VACUUM.
O vacuum somente marca as reas como livres, atualizando informaes no Free Space Map
(FSM), liberando espao na tabela ou ndice para uso futuro. Essa operao no devolver
espao para o Sistema Operacional, a no ser que as pginas ao final da tabela fiquem vazias.
Vacuum Full
O Vacuum Full historicamente uma verso mais agressiva do vacum, que deslocar as
pginas de dados vazias, como uma desfragmentao, liberando o espao para o Sistema
Operacional. Porm, a partir da verso 9.0 do PostgreSQL ele est um pouco mais leve, mas
ainda uma operao custosa e precisa de um lock exclusivo na tabela. Como regra, deve-se
evitar o vacuum full. Ele tambm nunca executado pelo autovacuum.
objetivos
93
tupla
tupla
tupla
tupla morta
tupla
tupla
tupla
tupla
tupla morta
tupla morta
tupla
tupla morta
tupla morta
tupla morta
tupla
tupla
tupla morta
tupla
tupla morta
tupla
tupla
tupla morta
tupla
tupla morta
Pgina (8k)
Pgina (8k)
Pgina (8k)
Pgina (8k)
Pgina (8k)
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
fsm
tupla
fsm
fsm
tupla
tupla
fsm
tupla
tupla
tupla
fsm
tupla
Pgina (8k)
Pgina (8k)
Pgina (8k)
Pgina (8k)
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
tupla
Pgina (8k)
Pgina (8k)
Pgina (8k)
VACUUM FULL
VACUUM
tupla
Executando o Vacuum
A principais opes para o comando Vacuum so:
Locks Moderados
Lock Agessivo
Figura 6.1
Funcionamento
do Vacuum.
equivalente a:
$ vacuumdb -d curso;
vacuumdb -f -d curso
vacuumdb -v -d curso
vacuumdb -z -d curso
Quando executar o vacuum com o parmetro VERBOSE, sero geradas vrias informaes
com detalhes sobre o que est sendo feito. A sada ser algo como a seguir:
bench=# VACUUM ANALYZE VERBOSE contas;
INFO: vacuuming public.contas
INFO: scanned index idx_contas to remove 999999 row versions
DETAIL: CPU 1.26s/0.14u sec elapsed 1.94 sec.
INFO: contas: removed 999999 row versions in 15874 pages
DETAIL: CPU 1.64s/0.13u sec elapsed 8.80 sec.
INFO: index idx_contas now contains 1 row versions in 2745 pages
DETAIL: 999999 index row versions were removed.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: contas: found 1 removable, 1 nonremovable row versions in 15874 out of 158
74 pages
DETAIL: 0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
l
A falta de vacuum pode
causar problemas no
acesso a tabelas e
ndices. Voltaremos a
tratar disto nas
prximas sesses.
VACUUM
95
Analyze
Vimos que o comando VACUUM possui um parmetro ANALYZE que faz a atualizao das
estatsticas da tabela.
Existe tambm o comando ANALYZE somente, que executa apenas o trabalho da coleta das
estatsticas sem executar o vacuum. A sintaxe semelhante:
curso=# ANALYZE VERBOSE;
Esse comando atualizar as estatsticas de todas as tabelas da base. Pode-se executar para
uma tabela especfica:
curso=# ANALYZE VERBOSE times;
Amostra estatstica
A anlise estatstica feita sobre uma amostra dos dados de cada tabela. O tamanho dessa
amostra determinado pelo parmetro default_statistics_target. O valor padro 100.
Porm, em uma tabela muito grande que tenha muitos valores distintos, essa amostra pode
ser insuficiente e levar o Otimizador a no tomar as melhores decises. possvel aumentar
o valor da amostra analisada, mas isso aumentar tambm o tempo e o espao consumido
pela coleta de estatsticas.
Em vez de alterar o postgresql.conf globalmente, pode-se alterar esse parmetro por coluna
e por tabela. Assim, se estiver analisando uma query em particular, ou se existirem tabelas
Administrao de Banco de Dados
grandes muito utilizadas em um sistema, uma boa ideia increment-lo para as colunas
96
Autovacuum
Em funo da importncia da operao de Vacuum para o PostgreSQL, nas verses mais
recentes esse procedimento passou a ser executado de forma automtica (embora esse
comportamento possa ser desabilitado). Esse mecanismo chamado de Autovacuum.
Na teoria, o Administrador PostgreSQL no precisa mais executar o vacuum manualmente,
bastando configurar corretamente as opes relacionadas ao autovacuum. Na prtica deve-se
manter a recomendao de sempre executar um vacuum manual quando houver uma alterao grande de dados. Alm disso, por precauo, comum agendar um vacuum noturno.
O autovacuum sempre executa o Analyze. Assim, tem-se tambm um auto-analyze
fazendo a coleta estatstica frequentemente sem depender de agendamento ou execuo
do administrador.
Para executar essas tarefas, existe um processo inicial chamado Autovacuum Launcher e um
nmero pr-determinado de processos auxiliares chamados Autovacuum Workers. A cada
intervalo de tempo configurado, o Laucher chama um Worker para verificar uma base de
dados. O Worker verifica cada tabela e executa o vacum, acionando o analyze se necessrio.
Se existem mais bases que o nmero configurado de Workers, as bases sero analisadas em
sequncia, assim que o trabalho terminar na anterior.
Configurando o Autovacuum
Para funcionar, o autovacuum precisa do parmetro track_counts igual a true, que o
valor padro.
O nmero de processos Workers definido pelo parmetro autovacuum_max_workers,
sendo o padro 3. A modificao desse parmetro vai depender da frequncia de atualizao
e tamanho das tabelas do seu ambiente. Inicie com o valor padro e acompanhe se a frequncia
com que os workers esto rodando est muito alta. Em caso positivo, recomendado incrementar esse nmero.
Quando um Worker determinar que uma tabela precisa passar por um vacuum, ele executar at um limite de custo, medido em operaes de I/O. Depois de atingir esse limite de
operaes, ele dormir por um determinado tempo antes de continuar o trabalho.
Esse limite de custo definido pelo parmetro autovacuum_vacuum_cost_limit, que por
padro -1, significando que ele usar o valor de vacuum_cost_limit, que por padro 200.
O tempo em que o Worker dorme quando atinge o limite de custo definido pelo parmetro
97
Autovacuum Launcher
autovacuum_naptime
Autovacuum Worker
Autovacuum Worker
Autovacuum Worker
autovacuum_vacuum_cost_delay
Base
Base
Base
autovacuum_vacuum_cost_limit
No tarefa trivial ajustar esses valores, j que eles so relacionados carga de atualizaes
de um determinado ambiente. Inicie com os valores default e caso o autovacuum possa
estar atrapalhando o uso do banco, aumente o valor de autovacuum_cost_delay para, por
exemplo, 100ms, e mea os resultados.
Pode-se tambm aumentar o parmetro autovacuum_naptime, que o intervalo que o
Launcher executa os Workers para cada base (por padro a cada 1 minuto). Caso seja necessrio baixar a frequncia do autovacuum, aumente o naptime com moderao.
Por exemplo, para permitir que mais trabalho seja feito pelo autovacuum em uma tabela:
bench=# ALTER TABLE contas SET (autovacuum_vacuum_cost_limit = 1000);
Figura 6.2
Funcionamento do
Autovacuum.
Out of Memory
Ao aumentar o parmetro maintenance_work_mem, preciso levar em considerao que
cada worker pode alocar at essa quantidade de memria para sua respectiva execuo.
Assim, considere o nmero de workers e o tamanho da RAM disponvel quando for atribuir o
valor de maintenance_work_mem.
Pouca frequncia
Em grandes servidores com alta capacidade de processamento e de I/O, com sistemas igualmente grandes, o parmetro autovacuum_vacuum_cost_delay deve ter seu valor padro de
20ms baixado para um intervalo menor, de modo a permitir que o autovacuum d conta de
executar sua tarefa.
Figura 6.3
Um worker do
Autovacuum em
atividade.
99
Transaes eternas
Pode parecer impossvel, mas existem sistemas construdos de tal forma, propositalmente
ou por bug, que transaes ficam abertas por dias. O vacuum no poder eliminar as dead
tuples que ainda devem ser visveis at essas transaes terminarem, prejudicando assim
sua operao. Verifique a idade das transaes na pg_stat_activity ou com o pg_activity.
Reindex
O comando REINDEX pode ser usado para reconstruir um ndice. Voc pode desejar executar
essa operao se suspeitar que um ndice esteja corrompido, inchado ou, ainda, se foi alterada alguma configurao de armazenamento do ndice, como FILLFACTOR, e que no tenha
ainda sido aplicada. O REINDEX faz o mesmo que um DROP seguido de um CREATE INDEX.
possvel tambm usar o REINDEX quando um ndice que estava sendo criado com a opo
CONCURRENTLY falhou no meio da operao. Porm, o REINDEX no possui a opo concorrente, fazendo com que o ndice seja recriado com os locks normais. Nesse caso melhor
remover o ndice e cri-lo novamente com a opo CONCURRENTLY.
As opes do comando REINDEX so:
11 Reindexar um ndice especfico:
curso=# REINDEX INDEX public.pgbench_branches_pkey;
Para tabelas e ndices deve-se informar o esquema e para a base obrigatrio informar o
nome da base e estar conectado a ela.
Bloated Indexes
Para verificar se um ndice est inchado, basicamente devemos comparar o tamanho do
ndice com o tamanho da tabela. Apesar de alguns ndices realmente poderem ser quase to
grandes quanto sua tabela, deve-se considerar as colunas no ndice.
A seguinte query mostra o tamanho dos ndices, de suas tabelas e a proporo entre eles.
100
bench=# SELECT
pg_size_pretty(pg_relation_size(indexrelid)) as index_size,
pg_size_pretty(pg_relation_size(indrelid)) as table_size
FROM pg_index I
LEFT JOIN pg_class C ON (C.oid=I.indexrelid)
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN (pg_catalog,information_schema,pg_toast)
AND C.relkind = i AND pg_relation_size(indrelid) > 0;
nspname |
relname
---------+-----------------------+-------------+------------+-----------| pgbench_branches_pkey |
2 | 16 kB
| 8192 bytes
public
| pgbench_tellers_pkey
1 | 40 kB
| 40 kB
public
| pgbench_accounts_pkey |
0.17 | 302 MB
| 1713 MB
public
| idx_accounts_bid
0.14 | 257 MB
| 1713 MB
public
| idx_branches_bid_tbal |
public
| idx_accounts_bid_parc |
public
| idx_accounts_bid_coal |
public
| idx_contas
|
|
1 | 40 kB
| 40 kB
0 | 48 kB
| 1713 MB
0.14 | 257 MB
85.78 | 21 MB
| 1713 MB
| 256 kB
No exemplo mostrado nessa figura, o ndice idx_contas est 85 vezes maior que sua tabela.
Certamente deve passar por um REINDEX.
Cluster e Recluster
O recurso de CLUSTER uma possibilidade para melhorar o desempenho de acesso a dados
lidos de forma sequencial. Por exemplo, se h uma tabela Item que possui um ID da nota
fiscal, provavelmente todos os itens sero frequentemente recuperados da tabela Item pela
chave da nota. Nesse caso, ter um ndice nesta coluna e fazer o CLUSTER por ele pode ser
muito vantajoso, pois em uma mesma pgina de dados lida do disco haver diversos registros
com o mesmo ID da nota fiscal. Podemos clusterizar uma tabela com a seguinte sintaxe:
# CLUSTER pgbench_accounts USING idx_accounts_bid;
Esta uma operao que usa muito espao em disco, j que ela cria uma nova cpia da
tabela inteira e seus ndices de forma ordenada e depois apaga a original. Em alguns casos,
dependendo do mtodo de ordenao escolhido, pode ser necessrio alocar espao equivalente a duas vezes o tamanho da tabela, mais seus ndices. Essa operao usa bloqueios
agressivos, exigindo um lock exclusivo na tabela toda.
O cluster no ordena os dados que futuramente sero inseridos na tabela; assim, essa
uma operao que deve ser reexecutada frequentemente para manter os novos dados
tambm ordenados.
Uma vez executado o CLUSTER, no necessrio informar o ndice nas execues seguintes,
a no ser que seja necessrio mud-lo:
# CLUSTER pgbench_accounts;
O cluster uma operao cara de manter, sendo necessrio ter janelas de tempo e espao
em disco s vezes generosos para executar a manuteno frequente do cluster. Por outro
lado, pode trazer benefcios proporcionais para alguns tipos de queries.
Pode-se fazer o cluster inicial e verificar o ganho de desempenho alcanado, monitorando a
degradao desse desempenho de modo a estabelecer uma agenda para novas execues
do cluster para garantir a ordenao dos novos dados que venham a ser includos.
Figura 6.4
Bloated Indexes.
public
101
pg_ctl stop mf
rm -Rf /usr/loca/pgsql/
cp -r /diretrio_compilada_nova_versao/*
pg_ctl start
/usr/local/pgsql/
Uma alternativa um pouco mais elegante, e que fornece a vantagem de poder rapidamente
retornar em caso de problemas, seguir o procedimento de instalao ilustrado na sesso 1,
adicionando o detalhe de instalar o PostgreSQL em um diretrio nomeado com a respectiva
verso. Por exemplo:
$
cd postgresql-9.3.4/
$ ./configure --prefix=/usr/local/pgsql-9.3.4
$ make
$
Supondo que j exista uma verso instalada, digamos 9.3.3, sob o diretrio /usr/local/,
teramos o seguinte:
ls -l /usr/local/
...
... pgsql-9.3.3/
... pgsql-9.3.4/
...
Nesse caso precisamos baixar o banco e alterar o link simblico pgsql para apontar para
102
pg_ctl stop mf
rm pgsql
ln -s /usr/local/pgsql-9.3.4 pgsql
pg_ctl start
ls -l /usr/local/
...
... pgsql-9.3.3/
... pgsql-9.3.4/
...
Assim, em caso de ocorrncia de algum problema, muito fcil retornar para a verso anterior simplesmente fazendo o mesmo procedimento recm-mostrado de modo a voltar o link
simblico para o diretrio original.
Major version
Atualizaes de major versions, ou seja, de uma verso 9.2.x para 9.3.x, podem trazer modificaes no formato de armazenamento dos dados ou no catlogo de sistema. Nesse caso ser
necessrio fazer um dump de todos os dados e restaur-los na nova verso. Existem diferentes
abordagens que podem ser seguidas em uma situao como essa, muito embora o primeiro
passo para todas elas seja encerrar o acesso ao banco. Vejamos algumas situaes da em diante:
11 Substituio simples:
22 Fazer o dump de todo o servidor para um arquivo;
22 Desligar o PostgreSQL;
22 Apagar o diretrio dos executveis da verso antiga;
22 Instalar a nova verso no mesmo diretrio;
22 Ligar a nova verso do PostgreSQL;
22 Restaurar o dump completo do servidor.
11 Duas instncias em paralelo:
22 Instalar a nova verso em novos diretrios (executveis e dados);
22 Configurar a nova verso em uma porta TCP diferente;
22 Ligar a nova verso do PostgreSQL;
22 Fazer o dump da verso antiga e o restore na verso nova ao mesmo tempo;
22 Desligar o PostgreSQL antigo;
11 Novo servidor:
22 Instalar a nova verso do PostgreSQL em um novo servidor;
22 Fazer o dump da verso antiga e transferir o arquivo para o novo servidor ou
fazer o dump da verso antiga e o restore na verso nova ao mesmo tempo;
22 Direcionar a aplicao para o novo servidor;
22 Desligar o servidor antigo.
A escolha entre essas abordagens dependero da janela de tempo e dos recursos disponveis em seu ambiente.
103
Resumo
Vacuum:
11 Mantenha o Autovacuum sempre habilitado;
11 Agende um Vacuum uma vez por noite;
11 No use o Vacuum Full, a no ser em situao especial;
11 Tabelas que estejam sofrendo muito autovacuum devem ter o parmetro
autovacuum_vacuum_cost_limit aumentado.
Estatsticas:
11 O Auto-Analyze executado junto com o Autovacuum, por isso mantenha-o habilitado;
11 Na execuo noturna do Vacuum, adicione a opo Analyze;
11 Considere aumentar o tamanho da amostra estatstica das principais tabelas.
Problemas com Autovacuum:
11 Se existirem muitas bases, aumente autovacuum_naptime;
11 Ao definir maintenance_work_mem, considere o nmero de workers e o tamanho da RAM;
11 Em servidores de alto poder de processamento, pode-se baixar
autovacuum_vacuum_cost_delay;
11 Se o autovacuum estiver muito frequente e fazendo muito I/O, pode-se aumentar
autovacuum_vacuum_cost_delay.
Reindex e Cluster:
11 Use Reindex se mudar o fillfactor de um ndice ou para ndices inchados.
11 Se existirem tabelas pesquisadas por uma sequncia de dados, pode-se usar o Cluster;
11 Tabelas que foram Clusterizadas devem ser reclusterizadas periodicamente.
Atualizao de verso:
11 Atualizao de minor versions necessitam apenas da troca dos executveis.
22 Uso de link simblico facilita.
104
7
Entender os problemas mais comuns relacionados ao desempenho do PostgreSQL
ao gerenciar conexes ou aplicaes; Conhecer alternativas para a sua soluo,
incluindo boas prticas que podem ajudar a contornar alguns desses obstculos.
conceitos
Exerccio de Nivelamento e
O seu chefe fala para voc: O banco est lento, o sistema est se arrastando!
O que voc faz?
Introduo ao tuning
11 No existe uma receita que se aplique a todos os casos de todas as tabelas da base
objetivos
O ajuste de desempenho do PostgreSQL no diferente. Para cada query lenta que se enfrente,
diversas solues possveis existiro, sendo que cada uma delas deve ser analisada e empiricamente testada at se encontrar a que melhor resolva ou mitigue uma situao negativa.
Dados
Figura 7.1
Servidor dedicado.
Uma das poucas afirmaes que podemos fazer nesta rea sem gerar qualquer controvrsia
a de que o Banco de Dados deve ser instalado em um servidor dedicado. Ainda que isso
possa parecer muito bvio, comum encontrarmos servidores de aplicao, ou servidores
web, na mesma mquina do Banco de Dados. Isso especialmente comum para produtos
de prateleira, softwares de caixa, onde o aplicativo e o Banco de Dados so instalados no
mesmo servidor. Podero at existir situaes onde no existir uma rede entre a aplicao e
o banco possa compensar a concorrncia por CPU, memria, canais de I/O, recursos de SO,
instabilidades e manutenes duplicadas. Mas essas so muito raras.
Infraestrutura
Hardware e Software
Aplicao
Queries
Congurao
PostgreSQL e SO
queries, da eficincia do modelo, na quantidade de dados retornados ou ainda na quantidade de dados processados de forma intermediria. Muitas vezes a soluo mais eficaz para
a lentido simples, e at por conta disso muitas vezes esquecida: criao de ndices.
Depois de analisada a aplicao e o uso que est fazendo do banco, pode ser necessrio
analisar a configurao do PostgreSQL e do Sistema Operacional. Pode-se analisar se a
memria para ordenao suficiente, o percentual de acerto no shared buffer, e ainda os
parmetros de custo do Otimizador. preciso se certificar tambm que a reorganizao do
espao, o vacuum, e estatsticas esto sendo realizados com a frequncia necessria.
Por fim, verificamos se a memria est corretamente dimensionada, a velocidade e organizao dos discos, o poder de processamento, o filesystem e o uso de mais servidores com
replicao. Ou seja, olha-se para infraestrutura de hardware e software.
106
Figura 7.2
Ciclo de Tuning.
Lentido generalizada
Um problema comum o excesso de conexes com o banco, resultando em excesso de processos. Cada processo tem seu espao de endereamento, memria alocada particular, alm
das estruturas para memria compartilhada e o tempo de CPU. Mesmo quando um processo
no faz nada, ele ocupar tempo de processador quando criado e quando destrudo.
Mas o que excesso de processos? Qual a quantidade normal de processos? Esta no ser
a nica vez que vai ouvir como resposta: depende de seu ambiente! Depende das configuraes do pool se existe um pool, depende do uso do sistema, depende de seu hardware.
Provavelmente, com o tempo o administrador j conhecer um nmero de conexes para
qual o servidor ou sistema em questo voa em velocidade de cruzeiro. Caso no saiba, o
ideal ter o histrico disso anualizado atravs das ferramentas Cacti, Zabbix ou similar,
como j foi visto.
De qualquer modo, um nmero muito grande de processos (centenas) compromete a
resposta de qualquer servidor. Para manipular milhares de conexes, voc deve usar um
software de pooling ou agregador de conexes.
Se o sistema uma aplicao web, rodando em um servidor de aplicao, ela provavelmente
j faz uso de uma camada de pool. Nesse caso, deve-se verificar as configuraes de pool.
Por vezes o nmero mnimo de conexes, o mximo e o incremento so superdimensionados. O mnimo normalmente no o grande vilo, pois alocado quando a aplicao
entra no ar. O incremento o nmero de conexes a serem criadas quando faltarem
conexes livres. Ou seja, quando todas as conexes existentes estiverem alocadas, no
ser criada apenas uma conexo adicional, mas sim a quantidade de conexes indicada no
as conexes disponveis, sero solicitados ao SO e ao PostgreSQL a criao de 30 novos
processos de uma s vez. Tenha em mente que o mecanismo de abertura de conexes no
PostgreSQL no barato. Assim, um nmero muito alto para o mximo de conexes que
podem ser criadas pode tambm comprometer a performance do sistema como um todo.
Caso no exista um pool, como comum em sistemas duas camadas ou desktop, a adoo de
um software de pool pode ajudar, e muito. Sem essa camada, se o sistema estiver instalado
em 300, 500 ou 1.000 estaes, voc ter uma conexo de cada cliente com o banco. Esse
grande nmero de processos pode exaurir a memria do servidor e esgotar os processadores.
parmetro relacionado ao incremento. Se esse nmero for 30, toda vez que se esgotarem
107
pgbouncer
Um software de pool para PostgreSQL o pgbouncer. Ele open source, de fcil instalao,
leve e absurdamente eficiente. J a sua configurao pode demandar o entendimento de
conceitos mais complexos para os iniciantes, tornando o processo um pouco confuso. Nada
que no possa ser resolvido com a leitura cuidadosa da documentao existente, e que
certamente trar um resultado mais do que compensador.
Pool
Discos
cd /usr/local/src/
cd pgbouncer-1.5.4/
$ make
$
O passo seguinte tratar da sua configurao, que no exemplo a seguir segue um esquema
bsico:
$
vi /db/pgbouncer/pgbouncer.ini
[databases]
curso = host=127.0.0.1 dbname=curso
[pgbouncer]
pool_mode = transaction
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = md5
auth_file = /db/pgbouncer/users.txt
108
logfile = /db/pgbouncer/pgbouncer.log
pidfile = /db/pgbouncer/pgbouncer.pid
admin_users = postgres
stats_users = stat_collector
pgbouncer -d /db/pgbouncer/pgbouncer.ini
Com o pgbouncer
possvel atender a mil
ou mais conexes de
clientes atravs de um
nmero significativamente menor de
conexes diretas com o
banco. Isso poder
trazer ganhos de
desempenho notveis.
Figura 7.3
Pool de conexes.
Para testar, use o psql para conectar na porta do pool (configurada no arquivo como 6543)
e acesse alguma das bases permitidas na seo [databases]. No exemplo a seguir, a base
escolhida curso:
$
Importante: como nada perfeito, o pgbouncer possui um contratempo. Como ele precisa
autenticar os usurios, preciso indicar um arquivo com usurios e senhas vlidos.
At a verso 8.3, o prprio PostgreSQL mantinha um arquivo assim que era utilizado pelo
pgbouncer. A partir do PostgreSQL 9.0, esse arquivo foi descontinuado e atualmente
necessrio ger-lo manualmente. No complicado gerar o contedo para o arquivo
atravs de comandos SQL lendo o catlogo, inclusive protegendo as respectivas senhas de
forma a que no fiquem expostas (so encriptadas).
Mesmo com um pool j em uso e bem configurado, se a carga normal do sistema exigir
um nmero muito elevado de conexes no PostgreSQL, alternativas tero de ser consideradas. Ser preciso analisar suas configuraes e infraestrutura, e isso ser abordado na
prxima sesso.
109
Caso a consulta esteja correta e no seja possvel restringir a quantidade de dados retornados, a recomendao ento passar a fazer uso das clusulas OFFSET e LIMIT, resultando
no trfego apenas dos dados que realmente sero sendo exibidos para o usurio. Na primeira pgina, passa-se OFFSET 0 e LIMIT 10 (supondo a paginao de tamanho 10), aumentando o OFFSET em 10 para as pginas subsequentes.
postgres=# SELECT generate_series(1,30) OFFSET 10 LIMIT 10;
generate_series
----------------11
12
13
14
15
16
17
18
19
20
Figura 7.4
Exemplo de
paginao com
OFFSET e LIMIT.
(10 rows)
postgres=#
110
sultas online retornando quantidade grande de registros, com todas as colunas e campos com
dados multimdia. Por exemplo, se uma consulta retorna uma lista de registros e cada registro
contm uma coluna do tipo bytea para dados binrios contendo um arquivo, dificilmente a
aplicao abrir todos esses arquivos ao mesmo tempo. Nesse caso, tal coluna no precisaria
ser retornada nessa consulta. Apenas quando o usurio explicitar o desejo de consultar ou
manipular tal arquivo que deve-se ir at o banco busc-lo na coluna binria. O mesmo vale
para campos text com grande volume de texto, muitas vezes com contedo html.
Importante: no recomendvel o armazenamento de arquivos no banco de dados.
Relatrios e integraes
Se existem consultas no seu ambiente que apresentam os problemas com volume de dados
Existem diversas
ferramentas, como o
Pentaho, Jasper Server
e outras comerciais,
que possuem
facilidades para
gerao de relatrios,
executando as
consultas agendadas
e fazendo cache ou
snapshots dos
resultados. Desse
modo, toda vez que
um usurio pede
determinado relatrio,
a consulta no mais
disparada contra
o banco, mas extrada
desse snapshot
dos dados.
conforme acima apresentados, e cujos resultados so demandados por um ou mais usurios, considere a possibilidade de no disponibilizar essas consultas de forma online, mas
sim como relatrios cuja execuo pode ser programada.
Um erro muito comum criar relatrios para usurios, s vezes fechamentos mensais ou
at anuais, e disponibilizar um link no sistema para o usurio ger-lo a qualquer instante.
Relatrios devem ser pr-processados, agendados para executar noite e de madrugada,
e apresentar o resultado para o usurio pela manh.
Integraes entre sistemas por vezes tambm so processos pesados que no devem ser
executados em horrio de pico. Cargas grandes de escrita ou leitura para integrao de
dados entre sistemas feitas com ferramentas de ETL, Web Services ou outras solues similares devem ter o horrio controlado ou serem pulverizadas entre diversas chamadas com
pouco volume de dados a cada vez.
Se ainda assim existem consultas pesadas que precisem ser executadas a qualquer
momento, ou relatrios que no podem ter seus horrios de execuo restringidos, considere usar Replicao (ser tratada na sesso 10) para criar servidores slaves, onde essas
consultas podero ser executadas sem prejudicar as operaes normais do sistema.
Bloqueios
O PostgreSQL controla a concorrncia e garante o Isolamento (o I das propriedades ACID)
com um mecanismo chamado Multi-Version Concurrency Control (MVCC). Devido ao MVCC,
problemas de bloqueios ou locks no PostgreSQL so pequenos. Esse mecanismo basicamente cria verses dos registros, que podem estar sendo manipulados simultaneamente
por transaes diferentes, cada uma tendo uma viso dos dados, chamada snapshot.
Essa uma excelente forma de evitar conteno por locks. A forma mais simples de explicar
a vantagem desse mecanismo que no PostgreSQL uma leitura nunca bloqueia uma escrita
Explicado isso, fica claro que situaes de conflitos envolvendo locks so restritas a
operaes de escritas concorrentes. Na prtica, a maioria das situaes esto ligadas a
operaes de UPDATE. Os INSERTs geram informao nova, no havendo concorrncia. J
os DELETEs podem tambm apresentar problemas com locks, mas so bem mais raros.
At porque uma prtica comum em muitos sistemas no remover seus registros, apenas
marc-los como inativos ou no usados.
Mesmo as situaes de conflitos geradas por locks em UPDATEs no chegam a ser um problema, j que so situaes rotineiras na medida em que o lock um mecanismo de controle
de compartilhamento comum do banco. Problemas surgem de fato quando uma transao
que faz um lock demora para terminar ou quando ocorre um deadlock. A seguir analisamos
cada uma dessas situaes.
BEGIN TRANSACTION;
...
...
UPTADE contas SET...
...
...
...
COMMIT;
Lock Adquirido
Lock Liberado
Essa situao mais frequente com o uso de camadas de persistncia e frameworks, pois
o desenvolvedor no escreve mais o cdigo SQL. Ele no mais responsvel por abrir ou
fechar transaes explicitamente, muito provavelmente apenas marcando o seu mtodo
como transacional, deixando para as camadas de acesso a dados a execuo das operaes
de BEGIN e COMMIT (ou ROLLBACK).
A soluo sempre fazer a transao o mais curta possvel. Deve ser encontrado o motivo
pelo qual a transao est demorando, providenciando a reescrita desta se necessrio.
Vimos na sesso de aprendizagem sobre monitoramento que podemos localizar os locks
atravs do pg_activity, do pgAdmin e da tabela do catlogo pg_locks. possvel tambm ras Administrao de Banco de Dados
trear queries envolvidas em longas esperas por locks ligando o parmetro log_lock_waits.
No postgresql.conf, defina:
log_lock_waits = on
Sero registradas mensagens no log como esta (o prefixo da linha foi suprimido para clareza):
user=aluno,db=curso LOG:
Com os IDs dos processos possvel localizar na log as operaes correspondentes para
entender o que as transaes fazem e avaliar se podem ser melhoradas.
112
Figura 7.5
Transaes longas
e bloqueios.
Se o bloqueio estiver causando problemas graves, a soluo pode ser simplesmente matar
o processo.
Se o processo bloqueante for eliminado, dever ser visto no log algo como o seguinte:
user=postgres,db=postgres LOG:
user=aluno,db=curso LOG:
No exemplo da figura 7.5, o processo 8905 est h mais de 637 minutos executando.
Um olhar mais cuidadoso nos dados de CPU, READ/s e WRITE/s permitir concluir que o processo no est consumindo recursos, simplesmente est parado. O comando exibido, nesse
caso um UPDATE, pode no estar mais em execuo, embora tenha sido o ltimo comando
executado pela transao. Isso pode ser verificado na tabela pg_stat_activity, onde estado
do processo IDLE IN TRANSACTION. Processos nesse estado por longo tempo so o problema a ser resolvido, mas um comportamento que varia de aplicao para aplicao.
Alm dos problemas com locks relacionados a escritas de dados como UPDATE e DELETE, h
as situaes menos comuns e mais fceis de identificar envolvendo DDL. Comandos como
ALTER TABLE e CREATE INDEX tambm bloquearo escritas de dados. Essas alteraes de
modelo devem ocorrer em horrio de baixa atividade do sistema.
Uma outra situao que pode ocorrer so bloqueios gerados por causa do autovacuum.
Se uma tabela passar por uma grande alterao de dados, ela grande candidata a sofrer
autovacuum, potencialmente gerando problemas de performance. Se uma situao como essa
ocorrer, uma alternativa eliminar o processo e configurar a tabela para no ter autovacuum.
Mas o bloqueio mais famoso o deadlock. Essa uma situao especial de lock, necessariamente envolvendo mais de um recurso, no nosso caso provavelmente registros, onde cada
processo obteve um registro e est esperando o do outro ser liberado, o que nunca acontecer. uma situao clssica na cincia da computao sobre concorrncia de recursos.
Deadlocks somente ocorrero se existirem programas que acessam registros em ordens
inversas. Se houver uma lgica geral de ordem de acesso aos registros, garantindo que os
programas sempre acessam os recursos na mesma ordem, um deadlock nunca acontecer.
Figura 7.6
Transaes antigas
boqueando
processos.
113
PostgreSQL
Processo 1
Processo 2
Lock no registro A
Lock no registro B
Esperando registro B
Esperando registro A
Figura 7.7
Deadlock.
deadlock detected
Process 16192 waits for ShareLock on transaction 837; blocked by process
15186.
Process 15186 waits for ShareLock on transaction 838; blocked by process 16192.
Tuning de queries
114
volume de dados retornados e/ou processados que no so o caso ou no podem ser aplicadas,
resta analisar a query mais profundamente. Analisar a consulta ser necessrio tambm nas
situaes em que esta no parece lenta quando executada isoladamente (entre 0,5 ou 1 segundo),
mas que por ser executada dezenas de milhares de vezes acaba gerando um gargalo.
Para entender como o banco est processando a consulta, devemos ver o Plano de Execuo
escolhido pelo SGBD para resolver aquela query. Para fazermos isso, usamos o comando
EXPLAIN, conforme o exemplo a seguir:
bench=# EXPLAIN
SELECT *
FROM pgbench_accounts a
INNER JOIN pgbench_branches b ON a.bid=b.bid
INNER JOIN pgbench_tellers t ON t.bid=b.bid
WHERE a.bid=56;
QUERY PLAN
----------------------------------------------------------Nested Loop
->
Materialize
->
Nested Loop
->
|____
Cada linha no plano com um -> indica uma operao. As demais so informaes adicionais.
Todas as informaes do EXPLAIN sem parmetros so estimativas. Para obter o tempo real,
115
Materialize
3 rows=10 loops=100000)
->
Nested Loop
6 rows=10 loops=1)
->
116
ROLLBACK;
Outro parmetro til do EXPLAIN o BUFFERS, que mostra a quantidade de blocos, 8kB por
padro, encontrados no shared buffers ou que foram lidos do disco ou, ainda, de arquivos
temporrios que foram necessrios ser gravados em disco.
SELECT *
FROM pgbench_accounts a
...
QUERY PLAN
----------------------------------------------------------------------------------Nested Loop
Materialize
ows=10 loops=100000)
Buffers: shared hit=6
Agora a sada mostra os dados shared hit e read. No n superior, que mostra o total, vemos
que foram encontrados no cache do PostgreSQL, shared hit, 519 blocos (~4MB) e lidos do
disco, read, 158218 blocos (~1,2GB).
ndices
Nos exemplos com o EXPLAIN, vimos nos planos de execuo vrias operaes de SEQ
SCAN. Essa operao varre a tabela toda e executada quando no h um ndice que atenda
a consulta, ou porque o Otimizador acredita que ter de ler quase toda a tabela de qualquer
jeito, sendo um overhead desnecessrio tentar usar um ndice. Especial ateno deve ser
dada a situaes em que no h ndice til, mas poderia haver um.
ndices so estruturas de dados paralelas s tabelas que tm a funo de tornar o acesso
aos dados mais rpido. Em um acesso a dados sem ndices, necessrio percorrer todo um
conjunto de dados para verificar se uma condio satisfeita. ndices so estruturados de
forma a serem necessrias menos comparaes para localizar um dado ou determinar que
uma estrutura em rvore. No PostgreSQL o tipo padro, e se no informado no comando
CREATE INDEX, ele ser assumido.
comum haver confuso entre ndices e restries, ou constraints. Muitos desenvolvedores assumem que so a mesma coisa, criam suas constraints e no se preocupam mais
com o assunto.
ndices e constraints so coisas distintas. ndices, como foi dito, so estruturas de dados,
ocupam espao em disco e tm funo de melhoria de desempenho. Constraints so regras,
restries impostas aos dados. A confuso nasce porque as constraints do tipo PRIMARY
KEY e UNIQUE de fato criam ndices implicitamente para garantir as propriedades das constraints. O problema reside com as FOREIGN KEY.
ele no existe. Existem vrios tipos de ndices, sendo o mais comum o BTree, baseado em
117
10
20
12
16
17
24
19
28
26
29
32
Tabela
19
12
10
Figura 7.8
ndice Btree.
ndices simples
No exemplo de plano de execuo recm-mostrado, vemos um SEQ SCAN com um filter. Esse
o candidato perfeito para criarmos um ndice. Isso significa que o banco teve de varrer a tabela e
aplicar uma condio (bid = 56) para remover os registros que no atendem esse critrio.
->
ndices criam locks nas tabelas que podem bloquear escritas. Se for necessrio cri-lo
em horrio de uso do sistema, pode-se usar CREATE INDEX CONCURRENTLY, que usar
118
Agora, executando a query novamente com EXPLAIN (ANAYZE), vemos o seguinte plano:
QUERY PLAN
---------------------------------------------------------------------------------Nested Loop
(cost=0.00..4278.
Materialize
2 rows=10 loops=100000)
->
Nested Loop
9 rows=10 loops=1)
->
O custo do n caiu de 28 mil para cerca de 4 mil. O tempo para o n que era de quase 35s
caiu para 10s e o tempo total da query de 44s para 13s.
ndices compostos
Outra possibilidade a criao de ndices compostos, com mltiplas colunas. Veja o seguinte
exemplo:
bench=# EXPLAIN (ANALYZE)
SELECT *
FROM pgbench_tellers t
INNER JOIN pgbench_branches b ON t.bid=b.bid
WHERE t.bid = 15 AND t.tbalance = 0;
QUERY PLAN
Nested Loop
s=10 loops=1)
->
----------------------------------------------------------------------------------
119
=10 loops=1)
->
(cost=0.00..4.35 rows=10 w
O custo caiu de 22 para 11. Devemos sempre considerar o custo uma mtrica do PostgreSQL
para estimar o custo das operaes, em vez de somente o tempo, que pode variar conforme
a carga da mquina ou os dados estarem ou no no cache.
ndices parciais
Outra excelente ferramenta do PostgreSQL so os ndices parciais. ndices parciais so
ndices comuns, podem ser simples ou compostos, que possuem uma clusula WHERE. Eles
se aplicam a um subconjunto dos dados e podem ser muito mais eficientes com clusulas
SQL que usem o mesmo critrio.
Suponha que exista uma query muito executada, faz parte da tela inicial dos usurios de
alguma aplicao.
bench=# EXPLAIN ANALYZE
SELECT *
FROM pgbench_accounts
WHERE bid=90 AND abalance > 0;
QUERY PLAN
---------------------------------------------------------------------------------Index Scan using idx_accounts_bid on pgbench_accounts
(cost=0.00..4336.39 rows=
A consulta usa o ndice da coluna bid, porm a segunda condio com abalance precisa ser
filtrada. Uma alternativa o uso de ndices compostos, como vimos anteriormente, porm
nesse caso supomos que o critrio abalance > 0 no mude, sempre esse.
120
Dessa form podemos criar um ndice especfico parcial para esta consulta:
bench=# CREATE INDEX idx_accounts_bid_parcial
ON pgbench_accounts(bid) WHERE abalance > 0;
Criamos um novo ndice na coluna bid mas agora filtrando apenas as contas positivas.
Executando novamente a query:
QUERY PLAN
---------------------------------------------------------------------------------Index Scan using idx_accounts_bid_parcial on pgbench_accounts
(cost=0.00..4.27 r
O custo cai drasticamente de 4 mil para 4! Mas no saia criando ndices parciais indiscriminadamente. H custos de espao, de insero e organizao dos ndices. Cada situao deve
ser analisada e medido o custo-benefcio.
ndices parciais so especialmente teis com colunas boolean, sobre a qual ndices BTree
no so eficazes, em comparao com NULL. Exemplos:
CREATE INDEX idx_conta_ativa ON conta(idconta) WHERE ativa = true;
CREATE INDEX idx_conta_freq ON conta(idconta) WHERE data IS NULL;
Para usar um ndice, nesse caso necessrio criar o ndice com a funo aplicada.
bench=# CREATE INDEX idx_accounts_bid_coalesce
ON pgbench_accounts( COALESCE(bid,0) );
A coluna bid indexada, mas quando foi aplicada uma funo sobre ela, foi feito SEQ SCAN.
121
(cost=0.00..816.13 rows=500
00 width=0)
Index Cond: (COALESCE(bid, 0) = 56)
Esse equvoco em esquecer de indexar a coluna com a funo ou expresso que ser aplicada pela query bastante comum com o uso das funes UPPER() e LOWER().
engenharia de software.
122
8
Conhecer alternativas de solues para problemas de desempenho relacionados
ao ajuste fino dos parmetros de configurao do PostgreSQL; Analisar a infraestrutura
de hardware e software.
conceitos
Busca em texto
Antes de tratar especificamente de questes de desempenho relacionadas com a configurao do PostgreSQL ou com a infraestrutura de hardware e software, veremos ainda questes relativas a busca textual e alternativas de organizao de tabelas muito grandes.
LIKE
Uma situao que comumente gera problemas de desempenho em queries o operador
LIKE/ILIKE. O LIKE permite pesquisar um padro de texto em outro contedo de texto, normalmente uma coluna. ILIKE tem a mesma funo mas no faz diferena entre maisculas e
minsculas (case insensitive).
Ao analisar uma querie com EXPLAIN, podemos esbarrar com uma coluna do tipo texto que
est indexada mas cujo ndice no est sendo utilizando pela query que contm o LIKE. Isso
pode acontecer porque no PostgreSQL preciso utilizar um operador especial no momento
da criao do ndice para que operaes com LIKE possam utiliz-lo.
Esse operador depende do tipo da coluna:
varchar
varchar_pattern_ops
Char
bpchar_pattern_ops
Text
text_pattern_ops
objetivos
123
Por exemplo, para criar um ndice que possa ser pesquisado pelo LIKE, simplesmente use a
seguinte forma, supondo que a coluna seja varchar:
curso=#
Um outro motivo para o PostgreSQL no utilizar os ndices numa query com LIKE se for
usado % no nicio da string, significando que pode haver qualquer coisa antes. Por exemplo:
curso=#
Essa clusula nunca usar ndice, mesmo com o operador de classe sempre varrendo a
tabela inteira.
Full-Text Search
Para pesquisas textuais mais eficientes e mais complexas do que aquelas que fazem uso do LIKE,
o PostgreSQL disponibiliza os recursos FTS Full-Text Search. O FTS permite busca por frases
exatas, uso de operadores lgicos | (or) e & (and), ordenao por relevncia e outras opes.
O uso do FTS requer, no entanto, preparao prvia. Primeiro necessrio preparar a tabela
para utilizar esse recurso, inserindo uma coluna do tipo tsvector:
curso=# ALTER TABLE times ADD COLUMN historia_fts tsvector;
Em seguida, deve-se copiar e converter o contedo da coluna que contm o texto original
para a nova coluna vetorizada:
curso=# UPDATE times SET historia_fts = to_tsvector(portuguese, historia);
Desse ponto em diante pode-se usar o FTS, bastando aplicar o operador @@ e a funo
ts_query:
curso=# SELECT nome, historia
FROM times
WHERE historia_fts @@ to_tsquery(camp & mund);
Esse exemplo bem simples, dando apenas uma noo superficial de como funciona a
soluo de Full-Text Search do PostgreSQL.
documentos de texto, a melhor alternativa talvez seja utilizar softwares especficos, como o
124
Particionamento de tabelas
Se uma tabela ficar to grande que as alternativas at aqui apresentadas no estejam ajudando a melhorar o desempenho das queries, uma a ser considerada o particionamento.
Esse procedimento divide uma tabela em outras menores, baseado em algum campo que
voc definir, em geral um ID ou uma data. Isso pode trazer benefcios de desempenho, j
que as queries faro varreduras em tabelas menores ou ndices menores. No PostgreSQL,
o particionamento feito usando herana de tabelas.
Tabela Master Vazia
Aplicao
<2011
2012
2013
2014
q
Captulo 8 - Desempenho Tpicos sobre configurao e infraestrutura
Figura 8.1
Tabela
particionada.
125
Adicionar uma CHECK constraint em cada tabela filha, ou partio, para aceitar dados
apenas da faixa certa para a partio:
curso=# ALTER TABLE item_financeiro_2012
ADD CHECK (data >= 2012-01-01 AND data < 2013-01-01);
...
Criar uma trigger na tabela principal, que direciona os dados para as filhas.
curso=#
CREATE OR REPLACE FUNCTION itemfinanceiro_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
ELSE
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
curso=#
CREATE TRIGGER t_itemfinanceiro_insert_trigger
...
126
Aps ter inserido ou migrado os dados para as tabelas particionadas, importante executar
uma atualizao de estatsticas.
Agora, usando o EXPLAIN para ver o plano de uma consulta tabela a principal, podemos
ver que foi necessrio apenas acessar uma partio:
curso=# curso=# EXPLAIN ANALYZE
SELECT *
FROM item_financeiro
WHERE data = DATE 2013-03-22;
QUERY PLAN
---------------------------------------------------------------------------Result
->
Append
ps=1)
->
(cost=
Procedimentos de manuteno
Na sesso 6 foram apresentados inmeros procedimentos que devem ser executados para
garantir o bom funcionamento do PostgreSQL. Dentre eles, vale destacar 3 que podem
impactar significativamente o desempenho do banco:
Vacuum
A operao de Vacuum pode afetar o desempenho das tabelas, especialmente se no estiver
sendo executada, ou sendo executada com pouca frequncia.
de 25874. Essa situao pode ser explicada pelo fato de o autovacuum estar desabilitado.
Assim, a tabela est cheia de dead tuples, verses antigas de registros que devem ser eliminadas, mas que esto sendo varridos quando a tabela passa por um SCAN.
11 Vacuum
11 Estatsticas
11 ndices Inchados
bench=# EXPLAIN ANALYZE SELECT * FROM contas;
QUERY PLAN
---------------------------------------------------------------------------------Seq Scan on contas
Ao analisar uma query especfica, executar um Vacuum manual nas tabelas envolvidas pode ajudar a resolver alguma questo relacionada a dead tuples.
O exemplo a seguir envolve uma tabela que possui apenas um registo, mas que tem custo
127
Estatsticas
Uma query pode estar escolhendo um plano de execuo ruim por falta de estatsticas, ou por
estatsticas insuficientes. Os procedimentos para gerar e atualizar estatsticas foram vistos
anteriormente com mais detalhes, mas vale destacar que no exemplo recm-citado, ilustrando a
no execuo do autovacuum, tambm no est sendo feito o autoanalyze. Assim, o Otimizador
acredita que h 1000000 registros na tabela, quando na verdade h apenas um registro vlido.
Da mesma forma que acontece em relao ao Vacuum, ao analisar uma query em particular,
executar o ANALYZE nas tabelas envolvidas pode ajudar o Otimizador a escolher um plano
de execuo mais realista.
ndices inchados
Bloated indexes, ou ndices inchados, so ndices com grande quantidade de dead tuples.
Executar o comando REINDEX para reconstruo de ndices nessa situao apenas mais um
exemplo de como as atividades de manuteno podem ser importantes para preservar e
garantir o desempenho do banco.
11 shared_buffers
11 effective_cache_size
11 Checkpoints
11 Parmetros de Custo
11 statement_timeout
At agora estivemos analisando situaes que impactam o desempenho do banco e que esto
diretamente relacionadas com aspectos das aplicaes para acesso e manipulao de dados.
Foram trabalhadas situaes envolvendo principalmente queries e volumes de dados envolvidos, incluindo tambm a criao de estruturas de apoio, tais como ndices, parties etc.
Uma abordagem diferente buscar ajustar a configurao do PostgreSQL em situaes
especficas. At porque importante frisar que o tuning atravs dos parmetros de configurao s deve ser feito apenas quando se est enfrentando problemas.
work_mem
a quantidade de memria que um processo pode usar para operaes envolvendo ordenao e hash como ORDER BY, DISTINCT, IN e alguns algoritmos de join escolhidos pelo Oti Administrao de Banco de Dados
mizador. Se a rea necessria por uma query for maior do que o especificado atravs deste
parmetro a operao ser feita em discos, atravs da criao de arquivos temporrios.
Ao analisar uma query em particular executando o EXPLAIN (ANALYZE, BUFFERS), um resultado
a ser observado se h arquivos temporrios sendo criados. Se no for possvel melhorar a
query restringindo os dados a serem ordenados, deve-se estudar aumentar o work_mem.
Se esse parmetro estiver muito baixo, muitas queries podem ter que ordenar em disco e
isso causar grande impacto negativo no tempo de execuo dessas consultas. Por outro
lado, se esse valor for muito alto, centenas de queries simultneas poderiam demandar
memria, resultando na alocao de uma quantidade grande demais de memria, a ponto
de at esgotar a memria disponvel.
128
O valor default, 1MB, muito modesto para queries complexas. Dependendo da sua quantidade de memria fsica, deve-se aument-lo para 4MB, 8MB ou 16MB e acompanhar se est
ocorrendo ordenao em disco.
Lembre-se tambm que se sua base tiver muitos usurios, pode-se definir um work_mem
maior apenas para as queries que mais esto gerando arquivos temporrios, ou apenas para
uma base especfica, conforme foi visto na sesso de aprendizagem sobre configurao.
Pode-se verificar se est ocorrendo ordenao em disco atravs da view do catlogo
pg_stat_database, mas esta uma informao geral para toda a base. Atravs do parmetro
log_temp_files possvel registrar no log do PostgreSQL toda vez que uma ordenao em
disco ocorrer, ou que passe de determinado tamanho. Essa informao inclusive mostrada
nos relatrio do pgBadger.
O valores para log_temp_files so:
0 todos os arquivos temporrios sero registrados no Log
-1 nenhum arquivo temporrio ser registrado
N
size 269557760
user=curso,db=curso STATEMENT: SELECT ...
shared_buffers
Conforme j explicado, Shared Buffers a rea de cache de dados do PostgreSQL. Como o
PostgreSQL tira proveito tambm do page cache do SO, no correto assumir que aumentar
o valor de shared_buffers ser sempre melhor.
Se estiver enfrentando problemas de desempenho em queries que esto acessando muito
pela aplicao. Se nenhuma delas tiver efeito, a sim devemos analisar o aumento do parmetro shared_buffers.
Nos casos em que o servidor no dedicado ao Banco de Dados (o que j no recomendvel), no h garantia de que o page cache do SO contenha dados do banco (outros
softwares podero estar colocando dados nesse cache). Nesse cenrio, aumentar o shared_
buffers uma possibilidade para forar mais memria do sistema para o PostgreSQL.
Calcular a taxa de acerto no shared buffer atravs da view pg_stat_database, como j
exemplificado anteriormente, pode ajudar a tomar uma deciso sobre aumentar essa rea.
difcil dizer o que um percentual de acerto adequado, mas se for uma aplicao transacional de uso frequente deve-se com certeza absoluta buscar trabalhar com taxas superiores a 90% ou 95% de acerto. Valores abaixo disso devem ser encarados com preocupao.
postgres=# SELECT datname,
CASE WHEN blks_hit = 0 THEN 0
ELSE (( blks_hit / (blks_read + blks_hit)::float) * 100)::float
END as cache_hit
FROM pg_stat_database
WHERE datname NOT LIKE template_
ORDER BY 2;
129
Figura 8.2
Taxa de acerto
no shared buffers
por base.
Tambm pode ser til analisar o contedo do shared buffer. Ver quais objetos mais possuem
buffers em cache pode, por exemplo, mostrar se h alguma tabela menos importante no
sistema ocupando muito espao, ou seja, sendo muito referenciada por alguma operao.
Pode-se localizar o programa que est poluindo o shared buffer e tentar algo como
mud-lo de horrio ou considerar reescrev-lo.
effective_cache_size
O parmetro effective_cache_size no define o tamanho de um recurso do PostgreSQL.
Ele apenas uma informao, uma estimativa, do tamanho total de cache disponvel,
shared_buffer + page cache do SO. Essa estimativa pode ser usada pelo Otimizador para
decidir se um determinado ndice cabe na memria ou se a tabela deve ser varrida, da
sua importncia.
Para defini-la, some o valor do parmetro shared_buffers ao valor observado da memria
sendo usada para cache em seu servidor. O tamanho do cache pode ser facilmente consultado com free, mas tambm com top, vmstat e sar.
Checkpoints
A operao de Checkpoint uma operao de disco cara. A frequncia com que ocorrero
checkpoints definida pelos parmetros checkpoints_segments e checkpoints_timeout,
130
Parmetro
Descrio
Valor
checkpoint_segments
checkpoint_timeout
possvel verificar a ocorrncia de checkpoints (se est muito frequente, quanto tempo est
levando e a quantidade de dados sendo gravada) atravs de registros no log. Para isso,
deve-se ligar o parmetro log_checkpoint. Exemplo de mensagem registrando a ocorrncia
de um checkpoint pode ser visto a seguir:
LOG:
Tabela 8.1
Os parmetros
checkpoints_
segments e
checkpoints_
timeout.
Parmetros de custo
A configurao seq_page_cost uma constante que estima o custo para ler uma pgina
sequencialmente do disco. O valor padro 1 e todos as outras estimativas de custo so
relativas a esta.
O parmetro random_page_cost uma estimativa para se ler uma pgina aleatria do disco.
O valor padro 4. Valores mais baixos de random_page_cost induzem o Otimizador a pre-
Esse valor pode ser aumentado ou diminudo, dependendo da velocidade de seus discos
e do comportamento do cache. Em ambientes onde h bastante RAM, igual ou maior ao
tamanho do banco, pode-se testar igualar o valor ao de seq_page_cost. Veja que no faz
sentido ele ser menor do que seq_page_cost.
Se o ambiente est fortemente baseado em cache, com bastante memria disponvel,
pode-se inclusive baixar os dois parmetros quase ao nvel de operaes de CPU, utilizando,
por exemplo, o valor 0.05.
possvel alterar esses parmetros para um tablespace em particular. Isso pode fazer
sentido em sistemas com discos de estado slido, SSD, definindo um random_page_cost de
1.5 ou 1.1 apenas para tablespaces nesses discos.
curso=# SET random_page_cost = 1;
statement_timeout
Uma medida mais drstica para evitar queries que esto sobrecarregando o banco definir
um tempo mximo de execuo a partir do qual o comando ser abortado. O parmetro
statement_timeout define esse tempo mximo em milissegundos.
Normalmente as camadas de pool possuem um timeout, no sendo necessrio faz-lo no
PostgreSQL. Tambm possvel definir esse timeout apenas para um usurio ou base especfica que esteja apresentando problemas.
Por exemplo, para definir um timeout de 30 segundos para todas as queries na base curso:
postgres=# ALTER DATABASE curso SET statement_timeout = 30000;
Se uma query ultrapassar esse tempo, ser abortada com a seguinte mensagem:
ERROR:
Infraestrutura e desempenho
Vamos analisar as seguintes possibilidades:
11 Escalabilidade Horizontal;
11 Balanceamento de Carga;
11 Memria;
11 Filesystems;
11 Armazenamento:
22 RAID;
l
Lembre-se de que no
h frmula pronta:
todas as alteraes
devem ser testadas.
Pode-se configurar
esses parmetros
apenas para uma
sesso e executar
diversas queries para
verificar o comportamento resultante,
aplicando definies
globalmente no
postgresql.conf
somente se os
resultados forem
satisfatrios.
ferir varrer ndices, enquanto valores mais altos faro o Otimizador consider-los mais caros.
22 Separao de Funes.
131
11 Virtualizao;
11 Processadores;
11 Redes e Servios.
Quando esgotadas as possibilidades de melhorias na Aplicao e nas Configuraes do
PostgreSQL e SO, temos de comear a analisar mudanas de infraestrutura, tanto de software
quanto de hardware. Essas mudanas podem envolver adicionar componentes, trocar
tecnologias, crescer verticalmente mais memria, mais CPU, mais banda etc. ou crescer
horizontalmente adicionar mais instncias de banco.
Escalabilidade Horizontal
O PostgreSQL possui um excelente recurso de replicao que permite adicionar servidores
rplicas que podem ser usados para consultas. Nas prximas sesses, esse mecanismo ser
explicado em detalhes.
Essas rplicas podem ser especialmente teis para desafogar o servidor principal, redirecionando para elas consultas pesadas e relatrios. Tambm pode-se utilizar as rplicas para
balancear a carga de leitura por 2, 3 ou quantas mquinas forem necessrias.
Balanceamento de carga
Para utilizar as rplicas, podemos adaptar a aplicao para apontar para as novas mquinas
e direcionar as operaes manualmente.
Outra abordagem utilizar uma camada de software que se apresente para a aplicao
como apenas um banco e faa o balanceamento automtico da leitura entre as instncias.
Um software bastante usado para isso o pgPool-II. Ele ser estudado na sesso especfica
sobre Replicao.
Memria
Sistemas com pouca memria fsica podem prejudicar a performance do SGBD na medida
em que podero demandar muitas operaes de SWAP e, consequentemente, aumentar
significativamente as operaes de I/O no sistema. Outro sintoma da falta de memria pode
ser um baixo indice de acerto no page cache e shared buffer. Finalmente, devem ser consideradas situaes especiais tais como "Cache frio" e "cache sujo".
Filesystem
Tuning e escolha de filesystem so tarefas complexas e trabalhosas, pois envolvem a anlise
de parmetros que podem afetar de forma distinta questes relacionadas com o desem-
132
penho e com a segurana contra falhas, em ambos os casos exigindo testes exaustivos.
Nos Sistemas Operacionais de hoje, o sistema de arquivos mais usado, o EXT4, mostra-se
bastante eficiente, bem mais do que o seu antecessor, o EXT3. Uma opo crescente o
XFS, que parece ter melhor desempenho. Podem ser utilizados filesystems diferentes para
funes diferentes, por exemplo, privilegiando aquele com melhor desempenho de escrita
para armazenar os WAL, escolhendo outro filesystem para os ndices.
Um parmetro relacionado ao filesystem que pode ser ajustado sem preocupao com
efeitos colaterais, para bancos de dados, o noatime. Definir esse parmetro no arquivo
/etc/fstab para determinada partio, indica ao kernel para no registrar a ltima hora em
l
O PostgreSQL no tem
um modo raw, sem o
uso de filesystem, onde
o prprio banco
gerencia as operaes
de I/O.
que cada arquivo foi acessado naquele filesystem. Esse um overhead normalmente desnecessrio para os arquivos relacionados ao Banco de Dados.
Armazenamento
Em Bancos de Dados convencionais, os discos e o acesso a eles so componentes sempre
importantes, variando um pouco o peso de cada propriedade dependendo do seu uso:
tamanho, confiabilidade e velocidade.
Atualmente as principais tecnologias de discos so SATA, que apresenta discos com maior
capacidade (3TB), e SAS, que disponibiliza discos mais rpidos, porm menores. A tendncia
que servidores utilizem discos SAS.
Existem tambm os discos de estado slido, discos flash ou, simplesmente, SSD. Sem partes
mecnicas, eles possuem desempenho muito superior aos discos tradicionais. Porm, trata-se
de tecnologia relativamente nova, com debates sobre sua confiabilidade principalmente
para operaes de escrita. Os SSD so ainda muito caros e possuem pouca capacidade.
Se estiver considerando o uso de dessa tecnologia para Banco de Dados, no use marcas
baratas e confirme com o fabricante o funcionamento do Write Cache, que a bufferizao
de requisies de escrita at atingirem o tamanho mnimo de bloco para serem gravadas
de fato. Se no houver um write cache com bateria, os dados ali armazenados podem ser
corrompidos em caso de interrupo no fornecimento de energia (falta de luz).
Se estiver disponvel, o uso de redes Storage Array Network (SAN) pode ser a melhor opo.
Nesse cenrio os discos esto em um equipamento externo, storage, e so acessados por
rede Fiber Channel ou Ethernet. verdade que um sistema SAN sobre ethernet de 1Gb pode
no ser to eficiente quanto discos locais ao servidor, mas redes fiber channel de 8Gb ou
ethernet 10Gb resolvem esse ponto.
Normalmente esses storages externos possuem grande capacidade de cache, sendo 16GB
uma capacidade comumente encontrada. Assim, a desvantagem da latncia adicionada pelo
j que os dados quase sempre esto no cache do storage. Esses caches so battery-backed
cache, cache de memria com bateria. Assim o storage pode receber uma requisio de
escrita de I/O, grav-la apenas no cache e responder Ok, sem o risco de perda do dado e
sem o tempo de espera da gravao no disco.
RAID
As opes de configurao de um RAID so:
uso da rede para acessar o disco compensada por quase nunca ler ou escrever dos discos,
133
RAID 0
Nessa organizao dividem-se os dados para grav-los em vrios discos em paralelo.
A leitura tambm feita em paralelo a partir de todos os discos envolvidos. Isso fornece
grande desempenho e nenhuma redundncia. Se um nico disco falhar, toda a informao
perdida. Essa quebra dos dados chamada de striping.
1
Escrita
Dado
...
Leitura
Dado
RAID 1
No nvel RAID 1, os dados so replicados em dois ou mais discos. Nesse caso o foco redundncia para tolerncia a falhas, mas o desempenho de escrita impactado pelas gravaes
adicionais. Esse recurso chamado mirroring.
Figura 8.3
RAID 0 o dado
quebrado em
diversos discos:
desempenho sem
segurana.
RAID 1+0
Tambm chamado RAID 10, a juno dos nveis 0 e 1, fornecendo desempenho na escrita e
na leitura com striping e segurana com o mirroring. o ideal para Bancos de Dados,
principalmente para logs de transao. A desvantagem fica por conta do grande consumo de
espao, necessrio para realizar o espelhamento.
Escrita
Dado
134
Leitura
...
1
Dado
Figura 8.4
RAID 1+0:
segurana com
desempenho.
RAID 5
Esse layout fornece desempenho atravs de striping, e tambm segurana atravs de
paridade. Esse um recurso como um checksum, que permite calcular o dado original em
caso de perda de algum dos discos onde os dados foram distribudos. Em cada escrita feito
o clculo de paridade e gravado em vrios discos para permitir a reconstruo dos dados
em caso de falhas. Fornece bom desempenho de leitura, mas um certo overhead para
escrita, com a vantagem de utilizar menos espao adicional do que o RAID1+0.
1
Escrita
Dado
1
...
P
2
...
P
...
3
...
P
P
...
...
Leitura
Dado
Figura 8.5
RAID 5: striping
com clculo de
paridade para
reconstruo dos
dados.
135
Virtualizao
No podemos deixar de tecer comentrios sobre Bancos de Dados em mquinas virtuais.
Esse um tema muito controverso e no h resposta fcil. Para alguns administradores de
Bancos de Dados, uma verdadeira heresia sequer considerar bancos em ambientes virtualizados. O senso comum indica que um Banco de Dados instalado em uma mquina fsica
executar melhor do que em um ambiente virtual. At porque existe custo para adicionar
uma camada adicional para acesso aos recursos do banco.
A questo que se coloca se vale a pena enfrentar esse custo em funo dos benefcios
oferecidos. A virtualizao pode garantir escalabilidade, vertical e horizontal, impensveis
para administradores de mquinas fsicas. Em virtualizadores modernos pode-se clonar um
mquina com um simples comando, enquanto criar uma nova mquina fsica poderia tomar
uma semana de configurao, sem falar dos custos de aquisio.
Com respeito escalabilidade vertical, bastam dois cliques para que um administrador de
ambientes virtuais possa dobrar o nmero de ncleos de processadores e memria de uma
mquina que esteja enfrentando sobrecarga. Seu banco pode estar trabalhando com 8 core
e no instante seguinte passar a operar com 16 core, sem qualquer downtime. Essas facilidades no podem ser desprezadas.
Por outro lado, algumas situaes ou cargas de sistemas no so to facilmente virtualizadas.
A melhor estratgia tentar tirar o melhor proveito dos dois mundos. No caso de discos
para Bancos de Dados em ambientes virtuais, use sempre o modo raw, em que o disco apresentado para a mquina fsica repassado diretamente para a mquina virtual, evitando
(ou minimizando) a interferncia do hipervisor nas operaes de I/O.
Memria
Na sesso de monitoramento, foram vistas vrias formas de monitorar os nmeros da
memria. Pode-se analisar a quantidade de memria ocupada e para cache, em conjunto
com o tamanho do Shared Buffer, permitindo identificar se necessrio aumentar a
memria fsica do servidor.
Um sinal de alerta sempre a ocorrncia de swap. Mas lembre-se de que o SO pode decidir
fazer swap de determinados dados mesmo sem estar faltando memria. O Linux normalmente no deixa memria sobrando, alocando a maior parte da memria livre para cache e
desalocando partes quando necessrio atender pedidos dos processos. Assim, possvel
ocorrer swap com grandes quantidades de memria em cache.
O aumento de carga de I/O tambm pode ser evidncia de falta de memria. Quando
Administrao de Banco de Dados
os dados no forem mais encontrados no shared buffer e no page cache, tornando mais
136
frequente o acesso a disco, essa uma situao que pode indicar a necessidade de mais
memria, especialmente se o tuning na configurao do banco ou nas queries envolvidas j
tiver sido realizado sem corrigir o problema.
importante considerar que algumas situaes especficas envolvendo a memria resultam
de cache sujo ou vazio. Aps reiniciar o PostgreSQL, o shared buffer estar vazio e todas as
requisies sero solicitadas ao disco. Nesse caso ainda podero ser encontradas no page
cache, mas se a mquina tambm foi reiniciada, o cache do SO estar igualmente vazio. Nessa
situao poder ocorrer uma sobrecarga de I/O. Isso frequentemente chamado de cold
cache, ou cache frio. Deve-se esperar os dados serem recarregados para analisar a situao.
J o cache sujo quando alguma grande operao leu ou escreveu uma quantidade alm do
comum de dados que substituram as informaes que a aplicao estava processando.
O impacto o mesmo do cold cache.
Processadores
No pretendemos fazer uma anlise profunda sobre processadores, mas apenas sugerir a
reflexo sobre a necessidade de ter maior quantidade de ncleos ou ncleos mais rpidos.
A arquitetura de acesso memria por chip, por zona ou simtrica, tambm merece
alguma considerao.
Se a sua carga de sistema for online para muitos usurios, como a maioria dos sistemas web
atuais, mais ncleos apresenta-se como a melhor opo. Caso seu ambiente demande quantidade menor de operaes, mas essas operaes sejam mais pesadas, como o caso em solues de BI, a melhor alternativa passa a ser uma quantidade menor de ncleos mais rpidos.
Rede e servios
Em uma infraestrutura estvel, difcil que a rede se configure como um problema para o
Banco de Dados. Algumas consideraes talvez possam ser feitas quanto ao caminho entre
servidores de aplicao e o servidor de Banco de Dados. Caso seja possvel, respeitando
as polticas de segurana da instituio, no ter um firewall entre o banco e aplicao pode
melhorar bastante o desempenho e evitar gargalos.
Outro ponto a ser analisado a dependncia do desempenho do DNS na ligao entre servidores de aplicao e bancos de dados. Um erro numa configurao de uma entrada DNS
ou DNS reverso pode causar uma lentido na resoluo de nomes que acabar refletindo no
acesso ao banco.
137
Figura 8.6
Problemas de
Desempenho.
Resumo
Problema de desempenho
Vacuum
SIM
Geral
NO
Generalizado?
Especco
Analyse
Manuteno
Muitas
conexes?
NO
Processos
bloqueados?
SIM
SIM
Excesso de
conexes
No. conexes
normais
SIM
IO Wait?
SIM
Problemas
com IO
NO
SWAP?
SIM
Muitos
dados?
NO
Excesso de
conexes?
Ver rewall,
DNS, interfaces...
Paginada?
Paginar
oset e limit
SIM
Escalar
Diminuir
colunas
Aumentar
memria
Usar
rplicas
Aniquilar
blobs
Melhorar
hardware (cpu)
Consulta
pesada/relatrio
SIM
138
NO
Indices
SIM
Usa
expresso?
NO
Muitas
colunas?
SIM
SIM
NO
ndice com
expresses
Blobs?
Problemas
com o IO
Problemas
escrita?
SIM
Serv. relatrios
cache/snapshot
Muitos
checkpoints
Discos
rpidos?
NO
SIM
Restringir
horrio
SIM
ndice com
opclass
Ajustar
checkpoints
RAID
adequado?
NO
Trocar RAID
SIM
Discos
separados?
SIM
Testar
lesystems
Criar
ndice
NO
ndices
parciais
Query
timeout
SIM
NO
Melhorar
discos
NO
SIM
Pouco
restritiva?
Adicionar
condies
NO
NO
NO
SIM
Ajustar
pool
NO
SIM
Pouca
memria?
NO
NO
Seq Scan
SIM
Rede
lenta?
NO
Deadlock?
SIM
Instalar
pool
Tunning de
Query-Explain
NO
SIM
Pool bem
congurado?
NO
SIM
SIM
Bug na
aplicao
SIM
Grande volume
de dados
Idle in
Transaction?
NO
Transaes
longas?
Muito
executada?
NO
SIM
Problemas
com locks
NO
Existe
pool?
Muitos
dados?
NO
Usar FTS
NO
Separar dados,
WAL, ndices
ndices
compostos
Cluster
NO
Like?
SIM
Operador
de classe
SIM
NO
Vericar
eective_cache_size
Aumentar
work_men
SIM
Parmetros
de custo
NO
Temp
les
9
objetivos
Backup e recuperao
Conhecer as formas de segurana fsica de dados fornecidas pelo PostgreSQL, suas
opes mais comuns e suas aplicaes; Entender as variaes do dump, ou backup
lgico, e o mecanismo que viabiliza o Point-in-Time Recovery (PITR).
conceitos
Dump; Restore; Backup online; Backup Lgico e Fsico; Dump Texto; Dump Binrio;
log
loglog
logloglog
loglog
log
SQL
Backup
Figura 9.1
Estratgias
de backup do
PostgreSQL.
139
O arquivos de dump so altamente portveis, podendo ser executados em verses diferentes do PostgreSQL ou de plataforma, como em um SO diferente ou em outra arquitetura
de processadores (p.e., de 32 bits para 64 bits). Em funo disso, o dump muito usado no
processo de atualizao de verses do banco.
A Ferramenta pg_dump
O pg_dump pode ser usado remotamente. Com a maioria dos clientes do PostgreSQL,
aplicam-se as opes de host (-h), porta (-p), usurio (-U) etc.
Por padro, os backups so gerados como scripts SQL em formato texto. Pode-se tambm
usar um formato de archive, chamado tambm binrio, que permite restaurao seletiva,
por exemplo, de apenas um schema ou tabela.
No existe um privilgio especial que permita fazer ou no backup, depende do acesso
tabela. Assim, necessrio ter permisso de SELECT em todas as tabelas da base para fazer
um dump completo. Normalmente executa-se o dump com o superusurio postgres.
A sintaxe bsica para executar um dump :
$ pg_dump curso > /backup/curso.sql
ou
$ pg_dump -f /backup/curso.sql curso
Isso ger um dump completo em formato texto da base. O pg_dump possui uma infinidade
de opes e diversas combinaes possveis de parmetros. As principais so apresentadas a seguir.
Formato
O parmetro -F indica formato e pode ter os seguintes valores:
11 c (custom) archive ou binrio, compactado e permite seleo no restore.
11 t (tar) formato tar, limitado a 8GB.
11 d (directory) objetos em estrutura de diretrios, compactados.
11 p (plain-text) script SQL.
Para fazer um dump binrio, usamos a opo -Fc.
11 $ pg_dump -Fc -f /backup/curso.dump curso.
O dump nesse formato compactado por padro, e no humanamente legvel.
140
possvel especificar quais schemas faro parte do dump com o parmetro -n. Ele incluir
apenas os schemas informados.
No exemplo a seguir, feito um dump apenas do schema extra:
$ pg_dump -n extra -f /backup/extra.sql curso
Note que pode-se excluir um ou mais schemas selecionados atravs da opo -N. Isso far o
dump de todos os schemas da base, exceto os informados com -N. Um exemplo de dump de
toda a base curso, exceto do schema extra:
$
Tambm pode-se informar -t mltiplas vezes para selecionar mais de uma tabela:
$ pg_dump -t public.times -t public.grupos -f /backup/times_grupos.sql curso
Tanto para schemas quanto para tabelas, possvel utilizar padres de string na passagem
de parmetros, conforme demonstrado a seguir:
$
Somente dados
Para fazer dump somente dos dados, sem os comandos de criao da estrutura, ou seja,
sem os CREATE SCHEMA, CREATE TABLE e assemelhados, utiliza-se o parmetro -a.
O dump da estrutura
pode ser feito com
a opo -s ou
--schema-only.
Por causa desse nome,
s vezes confundido
com o dump de um
schema apenas, que na
verdade feito com -n.
Note que para restaurar um dump destes necessrio garantir que os respectivos objetos j
existam ou sejam previamente criados.
Somente estrutura
possvel fazer dump apenas da estrutura do banco (definio da base de dados e seus
schemas e objetos).
Para isso, usa-se a opo -s:
$
Dependncias
Quando utilizado -n para escolher um schema ou -t para uma tabela, podem existir dependncias de objetos em outros schemas. Por exemplo, pode existir uma foreign key ou uma
viso apontando para uma tabela de outro schema. O pg_dump no far dump desses
objetos, levando a ocorrer erros no processo de restaurao. Cabe ao administrador cuidar
para que sejam previamente criados os objetos dessas relaes de dependncia.
141
Large objects
Os large objects so includos por padro nos dumps completos, porm, em backups seletivos com -t, -n ou s, eles no sero includos.
Nesses casos, para inclu-los, necessrio usar a opo -b:
$ pg_dump -b -n extra -f /backup/extra_com_blobs.sql curso
Essa opo tem como desvantagem o fato de que os comandos so sempre executados
durante a restaurao, mesmo que os objetos no existam. Nessa situao, o comando de
drop para um objeto que no existe exibir uma mensagem de erro. Essas mensagens no
impedem o sucesso da restaurao, mas poluem a sada e complicam a localizao de algum
erro mais grave.
Combinado com o parmetro -c, emitir um comando de drop da base de dados antes de cri-la:
$ pg_dump -C -c -f /backup/curso.sql curso
Se a base indicada j existir, esta ser excluda, desde que no existam conexes. Se houver
conexes, ser gerado um erro no DROP DATABASE. Como o comando CREATE DATABASE
executado em sequncia, um novo erro ser gerado, j que a base j existe (pois no foi
possvel exclu-la). Ao final do processo, contudo, ser feito o \connect na base, que no foi
142
Como o dump com -C tem a funo de criar uma base nova, no so emitidos comandos
para apagar objetos (somente a base apagada). O resultado que os comandos CREATE dos
objetos na base tambm vo gerar mensagens de erro, uma vez que eles j existem.
Essas questes em torno da excluso ou criao de objetos tornam o uso das respectivas
opes no pg_dump um pouco confuso.
A prtica comum o administrador manualmente apagar uma base pr-existente,
cri-la vazia e restaurar os dumps sem utilizar parmetros de excluso ou criao,
conseguindo assim uma restaurao mais clara..
Permisses
Para gerar um dump sem privilgios, usa-se a opo -x:
$ pg_dump -x -f /backup/curso_sem_acl.sql curso
No sero gerados os GRANTs, mas continuam os proprietrios dos objetos com os atributos OWNER. Para remover tambm o owner, usa-se a opo -O:
$ pg_dump -O -x -f /backup/curso_sem_permissoes.sql curso
Compresso
possvel definir o nvel de compactao do dump com o parmetro -Z. possvel informar
um valor de 0 a 9, onde 0 indica sem compresso e 9 o nvel mximo. Por padro, o dump
binrio (custom) compactado com nvel 6. Um dump do tipo texto no pode ser compactado.
A seguir apresentamos, respectivamente, exemplos de dump binrio com compactao
mxima e sem nenhuma compactao:
$
Desabilitar triggers
Para dumps somente de dados, pode ser til emitir comandos para desabilitar triggers e
Essa opo emitir comandos para desabilitar e habilitar as triggers antes e depois da carga
das tabelas.
$
143
pg_dumpall
um utilitrio que faz o dump do servidor inteiro. Ele de fato executa o pg_dump internamente
para cada base da instncia, incluindo ainda os objetos globais roles, tablespaces e privilgios
que nunca so gerados pelo pg_dump. Este dump gerado somente no formato texto.
O pg_dumpall possui diversos parmetros coincidentes com o pg_dump. A seguir destacamos aqueles que so diferentes. Sua sintaxe geral :
$
ou
$
pg_dumpall -f /backup/servidor.sql
Objetos globais
Para gerar um dump somente das informaes globais usurios, grupos e tablespaces
possvel informar a opo -g:
$
pg_dumpall -g -f /backup/servidor_soment_globais.sql
Roles
Para gerar o dump apenas das roles usurios e grupos use a opo -r:
$
pg_dumpall -r -f /backup/roles.sql
Tablespaces
Para gerar o dump apenas dos tablespaces, use a opo -t:
$
pg_dumpall -t -f /backup/tablespaces.sql
mento b para os incluir far com que todos os large objects da base sejam includos no
144
O comando acima no criar a base curso (ela deve existir previamente). Outra opo
gerar o dump com a opo C, conforme foi visto em Criar a base de dados.
Ou pipeline. uma
forma de comunicao entre processos
largamente utilizada em
sistemas baseados em
Unix/Linux, atravs do
operador |, em que a
sada de um programa
passada diretamente
como entrada para
outro. A vantagem de
utiliz-lo em bancos de
dados que ele uma
estrutura apenas em
memria, logo no utilizado espao em disco
em sua execuo.
Assim, pode-se conectar em qualquer base antes de executar o script, conforme o seguinte
exemplo:
$
Os usurios que recebero grants ou que sero donos de objetos tambm devem ser criados
previamente. Se isso no for feito, teremos grande quantidade de erros, que no causaro a
interrupo da restaurao. Porm, ao final do processo, os privilgios previamente existentes
no tero sido aplicados, e o owner dos objetos ser o usurio executando a ao.
Para mudar esse comportamento, interrompendo a execuo em caso de erro, pode-se
informar o parmetro ON_ERROR_STOP = on. tambm possvel executar a restaurao em
uma transao, desde que se informe o parmetro single-transaction.
Uma possibilidade interessante para o uso de dumps texto com o psql numa transferncia
direta entre mquinas fazendo uso do pipe:
$
Esse comando pode ser executado em uma terceira mquina, como uma estao de
trabalho, que tenha acesso aos dois servidores. Reforamos que essa operao no usar
espao em disco para a transferncia devido ao uso do pipe.
Pipe
145
A Ferramenta pg_restore
Uma das principais vantagens do dump binrio, alm da compresso, a possibilidade de
restaurao seletiva, seja de schemas, tabelas, dados ou somente da estrutura da base.
Para restaurar um dump em formato binrio, usa-se o utilitrio pg_restore, que possui
algumas opes de seleo semelhantes ao pg_dump, com a vantagem de poder filtrar
objetos de um arquivo de dump completo (enquanto o pg_dump ir gerar apenas a informao selecionada).
As seguintes opes tem significado anlogo as do pg_dump:
-n
-t
-a
-s
-c
-C
-x
no executar os GRANTs
-O
--no-tablespaces
--disable-triggers
desabilitar triggers
Como na restaurao com o psql, a base curso deve existir previamente ou a opo -C deve
ser usada.
Apresentamos agora algumas opes especficas do pg_restore.
Seleo de objetos
possvel especificar apenas um ndice, trigger ou funo para ser restaurado com as opes
-I, -T e P, respectivamente. Porm, esses objetos possuem fortes dependncias, exigindo
muito cuidado na hora da restaurao. Para se restaurar os ndices, necessrio que as tabelas
existam. Para restaurar uma trigger, necessrio que a tabela e a trigger function existam.
146
Processamento paralelo
Por padro, a restaurao executada sequencialmente, usando um processo. possvel
informar com o parmetro -j um nmero de processos paralelos para restaurar os dados do
dump. Definir o valor desse parmetro depende do nmero de processadores e velocidade
de disco do ambiente em que o restore ser realizado.
Por exemplo, para restaurar um dump com quatro processos paralelos:
$
Controle de erros
O pg_restore no interrompe uma restaurao por conta de eventuais erros. As mensagens
so emitidas e ao final exibido um totalizador com os erros ocorridos.
Mas possvel mudar esse comportamento atravs da opo e, causando uma interrupo
do restore caso qualquer erro acontea.
$
147
11 wal_level = archiv
148
Deve ser definido como archive ou hot_standby. As duas opes permitem backup
de wals;
11 archive_mode = on
Deve estar ligado para ser possvel executar o comando de arquivamento;
11 archive_command = cp %p /backup/pitr/atual/wals/%f
O comando para fazer o backup dos segmentos de log. Pode ser um simples cp para
um diretrio local, um scp para outra mquina, um script personalizado, um rsync ou
qualquer comando que possa arquivar o segmento de log.
Para que essa configurao tenha efeito, ser necessrio reiniciar o PostgreSQL. Aps o
banco estar no ar, acompanhe se o backup de logs est ocorrendo. No nosso exemplo isso
ocorre no diretrio /backup/pitr/atual/wals.
No prximo passo, veremos detalhes sobre a criao desses diretrios dinamicamente, a
cada vez que se executa um backup base. Atente para o fato de que podero ocorrer erros
se no momento do arquivamento o diretrio no existir. Um exemplo de erro desse tipo,
registrado no log:
WARNING:
oo many failures
cp: cannot create regular file
`/backup/pitr/atual/wals/000000010000000200000074: No such file or directory
LOG:
DETAIL:
pg_xlog/000000010000000200000074
/backup/pitr/atual/wals/000000010000000200000074
A funo pg_start_backup recebe uma string como parmetro, que deve ser o nome de um
arquivo temporrio criado dentro do pgdata, com informaes sobre o backup. Pode ter um
rtulo qualquer, por exemplo, backup_base_20140131.
Para perfeito funcionamento e organizao, antes desses passos do backup, pode-se adicionar a criao de um diretrio para o backup com a data corrente e tambm de um link
simblico chamado atual. Assim, tanto o processo do backup principal quanto o arquiva-
/backup/pitr/atual/
mkdir /backup/pitr/atual/wals
postgres@pg01:~$ ls -l /backup/pitr/
total 8
drwxrwxr-x 2 postgres 4096 Apr
3 22:07 2014-02-22/
Figura 9.3
Definio do
diretrio de backup
com link simblico.
Nesse momento voc possuir um backup base e os arquivos de wal gerados sob o mesmo
diretrio atual. Pode-se copi-lo para fitas, outros servidores da rede etc.
A gerao do backup base pode ser agendada uma vez por dia ou por semana, dependendo
da carga e de quanto tempo para o processo de restaurao tolervel no seu ambiente.
A Ferramenta pg_basebackup
Esse utilitrio pode ser usado para fazer o backup base de um backup contnuo, bem como
para construir servidor standby. Ele coloca automaticamente o banco em modo de backup e
faz a cpia dos dados da instncia para o diretrio informado.
Antes de usar o pg_basebackup, entretanto, necessrio providenciar as
seguintes configuraes:
11 O acesso do tipo replication, a partir da prpria mquina, precisa estar liberado no pg_hba.
conf. A linha a seguir mostra como deve ser essa entrada:
local
eplication
postgres
trust
11 preciso ter pelo menos um slot disponvel para replicao. A quantidade definida pelo
parmetro max_wal_sender no postgresql.conf. O valor deve ser pelo menos um, podendo
ser um nmero maior de acordo com a quantidade de rplicas que se possua:
max_wal_senders = 1
$ pg_basebackup -P -D /backup/pitr/atual
150
A partir desse ponto, o backup est concludo se o arquivamento de WALs j estiver funcionando. Lembre-se de que mesmo usando pg_basebackup necessrio criar a estrutura de
diretrios para o backup base e WALs.
Cuidados adicionais devem ser observados caso sejam usados tablespaces alm do padro
pg_default (pgdata/base). Isso porque o modo padro de funcionamento do pg_basebackup
supe que ser feita uma cpia do backup base entre mquinas diferentes, para uso com
replicao. Nessa situao, os tablespaces existentes na origem sero movimentados exatamente para o mesmo caminho no destino.
l
Quanto maior o
intervalo de tempo
entre os backups base,
maior a quantidade de
log de transaes
produzido. Consequentemente, maior ser o
tempo de restaurao.
Aumenta tambm a
quantidade de arquivos
e a probabilidade de
um deles estar
corrompido.
A mensagem gerada quando o utilitrio tenta criar o tablespace no mesmo lugar do original, uma vez que um tablespace nunca criado em um diretrio com dados.
Para evitar esse problema, usa-se a opo -Ft, que empacotar o contedo dos tablespaces
com tar e coloc-los no mesmo diretrio do backup principal. A opo -z tambm compactar o backup.
$ pg_basebackup -Ft -z -P -D /backup/pitr/atual
1094167/1094167 kB (100%), 3/3 tablespaces
postgres@pg01:~$ ls -l /backup/pitr/atual/
total 8
drwxrwxr-x 2 postgres
drwxrwxr-x 3 postgres
Figura 9.4
rea de dados
padro e
tablespaces
compactados com
pg_basebackup.
151
rm -Rf /db/data/*
/db/data/
mkdir /db/data/pg_xlog
mkdir /db/data/pg_xlog/archive_status
vi /db/data/recovery.conf
restore_command = cp /backup/pitr/2014-01-15/wals/%f %p
recovery_target_time
152
user=,db= LOG:
user=,db= LOG:
user=,db= LOG:
Figura 9.5
Log do PostgreSQL
exibindo mensagem
de recuperao
concluda.
Resumo
Dump
Dump em formato texto:
pg_dump -f /backup/curso.sql curso
Dump seletivo:
-n/-N
-t/-T
-a/-s
-c/-C
Restaurao de Dump
Restaurar dump texto
153
Backup Contnuo
Habilitar Arquivamento de WALs :
Definir wal_level
= archive
Definir archive_mode = on
Definir archive_command
= cp
154
10
Saber o que replicao, as possibilidades para seu uso e os modos suportados pelo
PostgreSQL para esse recurso; Conhecer o funcionamento das formas de replicaes
nativas, Log Shipping e Streaming Replication, assim como a configurao e operao
bsica de cada uma delas.
conceitos
Alta Disponibilidade; Warm Standby; Hot Standby; Replicao por Log Shipping; Stream
Replication; Replicao Sncrona; Replicao Assncrona e Balanceamento de Carga.
Viso geral
Replicao a possibilidade de se ter uma ou mais cpias de um banco de dados repetidas em
outros ambientes. Apesar de ser um conceito amplo, diferentes softwares e fabricantes fazem
sua implementao de forma distinta. Em geral, a replicao implica em termos uma fonte de
dados primria e rplicas desses dados em outros servidores.
O uso de replicao est normalmente associado a:
objetivos
Replicao
155
Existem uma srie de ferramentas que fornecem replicao para o PostgreSQL, tais como:
11 Slony-I
11 Bucardo
11 pgPool-II
11 pl/Proxy.
Todas essas ferramentas apresentam vantagens e desvantagens, sendo que a maioria demanda
uma configurao complexa. O Bucardo, por exemplo, baseado em triggers para replicar os
dados. O pgPool-II funciona como um middleware que recebe as queries e as envia para os servidores envolvidos no cluster. J a pl/Proxy uma linguagem atravs da qual deve-se escrever
funes para operar os dados particionados em ns.
Merece destaque o fato de o PostgreSQL possuir duas formas nativas de replicao:
apenas para casos de falha. Nessa situao a rplica deve ser retirada do estado de restau-
156
rao e poder passar a receber conexes com operaes sobre os dados. Ou seja, tratar as
operaes que forem direcionadas para ela, mas no estar mais recebendo alteraes sendo
feitas em outro servidor. Assim, no podem contribuir para um balanceamento de carga.
Outra questo que deve ser considerada o tempo de atraso na replicao dos dados. Com
o log shipping, os segmentos de WAL so disponibilizados para consumo pela rplica apenas
aps serem arquivados no servidor principal. Esse arquivamento feito somente quando
um segmento de WAL est cheio (16MB de informaes de transaes), ou ento pelo tempo
definido no parmetro archive_timeout, tipicamente um intervalo de alguns minutos.
Slave
Postmaster
Postmaster
Sender
Receiver
Atende
Figura 10.1
Streaming
Replication.
Solicita
Streaming Replication
0x78AB4
0x78AA7
0x78A92
Master
157
all 192.168.25.93/32
trust
Sem essa liberao, uma mquina rplica no conseguir se autenticar contra o servidor
principal para executar a replicao binria.
No arquivo postgresql.conf devem ser feitos os seguintes ajustes:
O parmetro wal_level, definido como archive para permitir o arquivamento de logs de
transao, deve ser redefinido para hot_standby, permitindo assim a realizao das duas
operaes: arquivamento e replicao por streaming.
wal_level = hot_standby
158
Backup Base
Na sesso 9, sobre backup e recuperao, foi apresentada a ferramenta pg_basebackup,
que deve ser usada para fazer o backup e a restaurao inicial de dados no processo de
criao de servidores rplicas.
rm -Rf /db/data/*
Esse comando far a conexo com o servidor principal (master) e copiar todo o contedo
do pgdata de l para o diretrio informado; no caso, o pgdata do servidor rplica. O procedimento deve terminar com uma mensagem similar a:
NOTICE:
LOG:
trigger_file = /db/data/trigger.txt
159
reached at 2/820000C8
2014-02-23 21:30:31 BRT [2145]: [2-1] user=,db= LOG:
Figura 10.2
Replicao
concluda.
Tuning
Foram apresentados os procedimentos bsicos para colocar em funcionamento a replicao
binria. Mas existem diversos ajustes que podem ser feitos nas configuraes dos servidores envolvidos na replicao, especialmente no caso de situaes especiais.
Se uma carga de alterao muito grande ocorrer no servidor principal, pode acontecer que os
segmentos de WAL precisem ser reciclados antes que os servidores rplica possam obter todas
as informaes que precisam. Nessa situao poder surgir uma mensagem de erro como esta:
LOG:
FATAL:
Dois ajustes podem ser feitos ajudando a evitar este tipo de erro:
160
Definir esse parmetro uma escolha entre priorizar as consultas ou priorizar a replicao,
optando por um dos seguintes valores:
11 0: sempre replica, mata as queries;
11 -1: sempre aguarda as queries terminarem;
11 N: tempo que a replicao aguardar antes de encerrar as queries conflitantes.
Essa deciso deve considerar a prioridade do seu ambiente. tambm possvel configurar
duas ou mais rplicas, pelo menos uma priorizando a replicao e as demais priorizando
as consultas.
Monitorando a replicao
Uma forma simples para saber se a replicao est executando verificar a existncia do
processo sender na mquina principal.
$
/usr/local/pgsql/bin/postmaster -D /db/data
\_ postgres: logger process
\_ postgres: checkpointer process
\_ postgres: writer process
\_ postgres: wal writer process
\_ postgres: archiver process
/usr/local/pgsql/bin/postmaster -D /db/data
recovering 000000020000000200000094
streaming 2/947A6F50
Em ambos os casos, se a informao do registro de log estiver mudando com o tempo, isso
significa que a replicao est em andamento.
Uma alternativa para monitorar a replicao a funo pg_is_in_recovery(), que retorna
true se o servidor est em estado de recover, ou seja, uma mquina standby.
161
Uma outra funo, que pode ser usada no servidor rplica para exibir o ltimo log
record recebido do servidor principal, :
postgres=# select pg_last_xlog_receive_location();
receive-delay=0;1000;10000
Replicao em cascata
A partir da verso 9.2 do PostgreSQL, passou a ser possvel fazer a replicao em cascata, ou
seja, uma rplica obtendo os dados de outra rplica. Os passos para essa configurao so
os mesmos descritos at agora, apenas informando no lugar do servidor master os dados de
um servidor rplica como sendo a origem dos dados em recovery.conf. A rplica que servir
como origem dos dados deve atender os mesmos requisitos estipulados para um servidor
principal, ajustando os seus parmetros wal_level e max_wal_senders.
Master
Slave
162
Slave
Slave
Replicao em cascata
Replicao Sncrona
O funcionamento da replicao mostrada at agora dito Assncrono: as alteraes so
aplicadas na mquina principal de forma totalmente indiferente ao estado das rplicas.
Ou seja, a replicao das alteraes no servidor rplica feita de forma assncrona ao que
ela realmente acontece no servidor principal.
Figura 10.5
Replicao em
cascata.
Entretanto, possvel habilitar a execuo de replicao sncrona com uma nica rplica,
de tal forma que quando ocorrer um COMMIT no servidor principal essa alterao ser
propagada para a rplica de forma sncrona. Nessa configurao, a transao original s
concluda aps a confirmao de sua execuo tambm no servidor rplica.
Master
Master
Postmaster
Postmaster
Wal Writer
0x78AB4
Sender
Figura 10.6
Replicao
sncrona.
0x78AB4
Wal Writer
Sender
Envia
Conrma
Conrmao
Replicao Sncrona
0x78AB4
Para configurar a replicao sncrona necessrio apenas definir no parmetro
synchronous_standby_names o servidor que ser a rplica sncrona.
Deve-se ter em mente que o impacto nas requisies de escrita pode ser drstico e
causar grande conteno e problemas com locks.
Balanceamento de carga
A infraestrutura de replicao do PostgreSQL fornece uma enorme possibilidade a ser explorada para o crescimento horizontal com carga de leitura. Como a maioria dos sistemas tem
uma parcela de leitura de dados muito maior do que a de escrita, os recursos de Streaming
Replication e Hot Standby trazem uma soluo sob medida para esses cenrios.
Balanceamento de Carga
Leitura / Escrita
Master
Figura 10.7
Balanceamento
de carga.
Leitura
Slave
Replicao
Leitura
Slave
Aplicao
163
O desafio passa a ser as aplicaes tirarem proveito dessa arquitetura. Uma possibilidade
balancear a leitura em uma ou mais rplicas enquanto escritas so enviadas para um
servidor especfico. Essa tarefa pode ser executa pela prpria aplicao, construda para
tirar proveito desse modelo de replicao. Uma alternativa utilizar um software que faa o
papel de balanceador de carga.
Solues em nvel de rede e conexes no podem ser utilizadas, pois o comando sendo
executado deve ser interpretado para ser identificado como uma operao de escrita ou
leitura. O pgPool-II prov essa funcionalidade de balanceamento. Ele funciona como um
middleware e atua de forma transparente para a aplicao (que o enxerga como se fosse o
prprio banco de dados).
Por outro lado, o pgPool-II esbarra em uma configurao complexa, j que no uma ferramenta especfica para balanceamento e nem foi pensado para trabalhar com a Streaming
Replication nativa do PostgreSQL. De qualquer modo, possui funcionalidade de agregador
de conexes bem como recursos prprios para replicao e paralelismo de queries.
O Postgres-XC um projeto open source de soluo de cluster para PostgreSQL, que tem
como objetivo fornecer uma soluo onde se possa ter tantos ns de escrita quanto forem
necessrios, fornecendo escalabilidade de escrita que no se pode alcanar com uma nica
mquina. um projeto relativamente recente, com uma arquitetura complexa, mas com
uma proposta ambiciosa e aparentemente promissora.
Resumo
Configurando um Ambiente Streaming Replication.
11 No servidor principal:
No pg_hba.conf
192.168.25.93/32
trust
11 No servidor rplica:
Executando e restaurando o backup base.
$
pg_clt stop
rm -Rf /db/data/*
164
standby_mode = on
primary_conninfo = host=servidor-master
trigger_file = /db/data/trigger.txt
restore_command=scp postgres@servidor-master:/backup/pitr/atual/wals/%f %p
pg_ctl start
l
Se houver necessidade
de escalar operaes
de escrita, outras
solues, como o
Postgres-XC, devem ser
consideradas.
Bibliografia
11 RAMAKRISHNAN, Raghu; GEHRKE, Johannes. Sistemas de Gerenciamento
de Banco de Dados. Ed. McGraw-Hill Interamericana do Brasil, 2008.
11 PostgreSQL 9.2 Documentation
http://www.postgresql.org/docs/9.2/static/index.html
11 SMITH, Gregory. PostgreSQL 9.0 High Performance. Packt Publishing, 2010
11 The PostgreSQL Global Development Group. The PostgreSQL 9.0 Reference Manual, Volume 3: Server Administration Guide. Network Theory
LTD, 2010
11 RIGGS, Simo; KROSING Hannu. PostgreSQL 9 Administration Cookbook.
Bibliografia
Packt Publishing
165
166
O objetivo do curso o desenvolvimento das competncias necessrias para administrar o PostgreSQL - sistema
gerenciador de banco de dados em software livre que
considerado um dos mais completos e robustos do mercado. Ser apresentada a arquitetura geral deste SGBD,
conceitos e prticas para tarefas de instalao, operao
mento e otimizao de desempenho (tuning), bem como
rotinas comuns de manuteno do ambiente, incluindo
aspectos de segurana, backup e recuperao de dados.
O curso tambm abordar alternativas de replicao de
dados para distribuio de carga e alta disponibilidade.
ISBN 978-85-63630-51-3
9 788563 630513