Você está na página 1de 130

Administrao Profissional do PostgreSQL - Introduo

Introduo
Falar sobre PostgreSQL certamente no uma tarefa das mais fceis. Sempre acreditei nessa idia,
devido s dificuldades que enfrentei para encontrar um material mais completo sobre este S!".
So poucos os livros em portugu#s sobre o assunto. $esmo em ingl#s, devido evolu%o do banco
em suas &ltimas vers'es, no muito dif(cil topar com algum material defasado.
)m se tratando de administra%o do servidor, tambm muito comum encontrar receitas de bolo
como* configure seu shared_buffers para tanto, aumente o work_mem para tanto. Libere tanto
de mem+ria disso, tanto daquilo e eu sempre me perguntei* ,Sim, mas por qu#-..
Por outro lado, a vasta documenta%o oficial salvou min/a pele algumas ve0es 1sou professor de
PostgreSQL e no me envergon/o de recorrer a ela mesmo durante algumas aulas2. 3o entanto, o
que poderia ser bom, imagino que possa ter provocado um efeito colateral. $uita gente pode ter
pensado como eu* ,4omo escrever um material sobre PostgreSQL que organi0e os assuntos de um
5eito que penso ser mais didtico, mas que no fique com cara de c+pia descarada da documenta%o
oficial-..
)sta ento min/a misso. Preciso escrever algo sobre administra%o do PostgreSQL que se5a mais
breve que sua documenta%o oficial 1at a(, fcil... bronca seria se tivesse que ser maior2, que possa
recorrer a ela em momentos oportunos, mas que no fa%a voc# ac/ar que gastou din/eiro toa
comprando algo que no acrescentou nada s sagradas escrituras de !er6ele7
8
.
Ementa e organizao
9 conte&do foi cuidadosamente arran5ado para focar em tarefas administrativas do PostgreSQL e do
ambiente em quest'es que influenciem em como o S!" dever funcionar 1ou no, como diria
4aetano2.
:rataremos aqui da verso ;.<, apesar dos caras 5 estarem com o ;.= no forno com algumas idias
interessantes como o suporte ao 5 bem esperado >ot Standb7 1e?plicar isso agora- ...2. :odos os
testes foram reali0ados na verso ;.<.@ em sistema "ebian netinst virtuali0ado com Airtual !o? aqui
em um vel/o note de guerra, com /ospedeiro rodando Bbuntu >ard >eron que s+ atuali0o quando
sair outro L:S. )m alguns momento, posso apresentar alguns resultados e?ecutados em outras
mquinas. Quem sou eu para di0er qualquer coisa, mas em min/a /umilde opinio, o PostgreSQL
ainda um sistema e?tremamente vinculado fam(lia Bni?, portanto, quando me referir ao
CindoDs, vai ser s+ para no dizer que no falei das flores.
4ap(tulo 8 E Primeiros passos. 3o primeiro momento, vamos tratar do processo de instala%o em
mais de uma plataforma, utili0ando mais de um mtodo, alm de con/ecer a disposi%o f(sica do
servidor instalado. Fpesar do nome Primeiros passos, no se trata aqui de um cap(tulo de
nivelamento. Aamos assumir que o leitor 5 possui mais de 8= minutos de e?peri#ncia com
PostgreSQL e tem no%'es de instru%'es SQL e Sistemas erenciadores de !ancos de "ados
Gelacionais 1S!"G ou G"!$S2.
4ap(tulo @ E 9p%'es de configura%o. 3este cap(tulo, colocaremos uma lupa sobre o
postgresql.conf, principal arquivo de configura%o do banco e veremos como este est organi0ado.
Aeremos ainda alguns recursos de configura%o definidos pelos clientes.
1 Cidade sede da Universidade da Califrnia, bero do PostgreSQL
1
Administrao Profissional do PostgreSQL - Introduo
4ap(tulo H E Futentica%'es e permiss'es. Fp+s um embasamento nas op%'es de configura%o,
importante saber como conectar e como o PostgreSQL fa0 para di0er quem pode fa0er o qu# e onde.
)ste cap(tulo aborda do grosso modo aos a5ustes finos sobre cone?'es, papis e permiss'es do
PostgreSQL.
4ap(tulo < E :ransa%'es e Crite F/ead Logging. 4ertamente um dos cap(tulos mais legais. 9 CFL
a alma neg+cio no PostgreSQL. I ele quem garante a durabilidade de uma transa%o e con/ec#Jlo
bem pode l/e tra0er boas idias de desempen/o, integridade e disponibilidade.
4ap(tulo = E Gotinas administrativas. Se estamos em um livro sobre administra%o do PostgreSQL,
este cap(tulo o principal responsvel. Aacuum, anal70e, logging e monitoria so tarefas
administrativas que precisam estar bastante claras na mente do "!F PostgreSQL.
4ap(tulo K E !ac6ups E )les podem salvar seu emprego. Se voc# sentiu falta dos bac6ups como
tarefas administrativas fundamentais, n+s tambm. :anto que um cap(tulo inteiro foi reservado s+
para eles. Aeremos o mecanismo dump te?to e binrio, alm do famoso PointJinJ:ime Gecover7
para bac6ups incrementais e timelines. Ser visto aqui o que poderia estar apenas no cap(tulo L E
Flta "isponibilidade, que a tcnica de Carm Standb7 baseada no log s/ipping de um servidor
master para um slave que assume a ponta caso detecte que algo de ruim aconteceu ao master
1failover2. Fqui ser fundamental que voc# entenda bem o cap(tulo < E :ransa%'es e Crite F/ead
Logging.
4ap(tulo M E Flgo sobre infraestrutura. 3este cap(tulo eu me aventuro a falar sobre algo que no
bem min/a praia. Sou desenvolvedor, mas tive o cuidado de apresentJo previamente a diversos
amigos Sysadmins e eles no riram da min/a cara. )spero sinceramente que no ten/a sido por pura
ami0ade. Para ser um bom "!F PostgreSQL, voc# precisar con/ecer bem este assunto.
4ap(tulo ; E :unning E )nsinando o elefante a voar. Fqui voc# con/ecer algumas ferramentas para
medi%o de desempen/o, dicas para evitar gargalos e diversas op%'es de configura%o para
transformar seu PostgreSQL num "umbo envenenado. 1Perdo leitor. :en/o certe0a de que se no
fossem H/ da man/ e eu no estivesse morto de sono, esta frase infame no teria surgido2.
4ap(tulo L E Flta disponibilidade. )m muitos sistemas, disponibilidade algo ainda mais cr(tico do
que desempen/o. Ae5amos algumas tecnologias que podero au?iliJlo em situa%'es onde parar ou
perder dados se5am simplesmente inadmiss(veis.
Para quem estou escrevendo
Se voc# est procurando um material introdut+rio sobre PostgreSQL, modelagem de dados e
linguagem SQL, pode voltar se%o Best-sellers: Livros mais vendidos de todos tempos da livraria
e recolocar este livro na estante. Fproveite e pe%a para o vendedor utili0ar algo mel/or como
encal%o para a estante. *J2
$aterial assim, voc# encontra uns muito bons l naquela prateleira da se%o !ancos de "ados, na
rea de informtica. $e preocupei em falar para quem 5 sabe disso mas precisa administrar um
servidor PostgreSQL.
)screvo tambm para desenvolvedores curiosos na rea como eu. I impressionante como n+s
somos capa0es de, ao menor desli0e, estragar tudo e congelar o banco. Se meu son/o se reali0asse e
todo desenvolvedor que trabal/e com o PostgreSQL se especiali0asse nos assuntos que este livro
aborda, acredito que eu gan/aria o nobel da pa0 por tr#s anos seguidos 1no quarto eu negaria para
dar c/ance a algum 9bama desprestigiado2.
2
Administrao Profissional do PostgreSQL - Introduo
) por que no di0er que escrevo para coveiros, ascensoristas, deputados e quem mais puder
encontrar um tempo livre para ler um livrin/o lig/t e bem /umorado. )screvo at mesmo para
torcedores do 3utico ou do Santa 4ru0. 4oitados, eles precisam de algo que l/es traga mais
alegria.
3
Administrao Profissional do PostgreSQL - Introduo
Sumrio
Introduo.............................................................................................................................................1
)$)3:F ) 9GF3NOFPQ9........................................................................................................................8
PFGF QB)$ )S:9B )S4G)A)3"9..............................................................................................................@
1 -Primeiros passos...............................................................................................................................8
8.8PG94)SS9 ") N3S:FLFPQ9..................................................................................................................;
1.1.1Instalao no Debian Lenny..................................................................................................
Escolha e download do Debian Lenny...................................................................................8
Processo de instalao em modo grfico................................................................................9
Efetuando o download dos fontes.........................................................................................48
Preparando o ambiente.........................................................................................................52
Instalando o PostgreSQL a partir do cdigo fonte...............................................................54
Ps-instalao.......................................................................................................................55
Inicializao..........................................................................................................................60
Customizaes, facilitaes e automatizaes.....................................................................60
Instalao via apt-get............................................................................................................64
1.1.!Instalao do "nterpriseDB no #indo$s...........................................................................%&
1.1.'Instalao no (buntu via Synapti).....................................................................................*
8.@N3N:"! E N3R4N9 "9 "F:F!FS) 4LBS:)G..............................................................................................;=
1.!.1+rquivos e diret,rios do )luster..........................................................................................-
Diretrio base.......................................................................................................................87
Como o armazenador funciona............................................................................................94
Mapeamento de espao livre em pginas de dados..............................................................97
Um pouco de prtica.............................................................................................................99
Outros diretrios.................................................................................................................107
Arquivos de configurao do cluster..................................................................................109
1.!.!"n)odin. e lo)alizao......................................................................................................11*
Problemas com o Debian / Ubuntu.....................................................................................112
Contornando o problema no Debian...................................................................................113
Contornando o problema no Ubuntu...................................................................................114
Escolha de locales no initdb e no CREATE DATABASE..................................................115
8.H9PPS)S ") N3N4NFLNOFPQ9 .............................................................................................................88;
1.'.1Ini)ializao via post.res..................................................................................................11
1.'.!Ini)ializao via p./)tl.....................................................................................................1!*
Modos de encerramento......................................................................................................121
Sinais para processos em execuo....................................................................................124
8.<SFN3"9 "9 4LBS:)G 49$ 39A9S :F!L)SPF4)S..................................................................................8@=
Infraestrutura e catlogo.....................................................................................................128
8.=G)SB$9 )GFL............................................................................................................................8@L
2 -Opes de configurao...............................................................................................................130
@.8QBF3"9 ) 49$9 FL:)GFG 9PPS)S ") 493FNBGFPQ9.......................................................................8HT
@.@49$9 )S:U 9GF3NOF"9 9 P9S:G)SQL.493F..................................................................................8HT
!.!.1Lo)alizao de arquivos....................................................................................................1'*
!.!.!0one12es e autenti)a2es..................................................................................................1'!
!.!.'0onsumo de re)ursos.........................................................................................................1'3
4
Administrao Profissional do PostgreSQL - Introduo
!.!.&Lo.s de transao #+L.....................................................................................................1&1
!.!.34unin. de plane5amento de )onsultas...............................................................................1&3
!.!.%Lo.s do sistema.................................................................................................................13!
!.!.-0oletor de estat6sti)as.......................................................................................................1%*
!.!.+utova)uum.......................................................................................................................1%1
!.!.78adr2es para os )lientes...................................................................................................1%&
Mais sobre esquemas e search_path....................................................................................171
Como funciona a tabela Base64.........................................................................................173
Representao temporal......................................................................................................175
!.!.1*9esto de lo):.................................................................................................................1--
!.!.110ompatibilidade..............................................................................................................1-
@.H4934LBSQ9.................................................................................................................................8;@
3 -Autenticaes e permisses..........................................................................................................183
H.8493:G9LF3"9 F4)SS9S................................................................................................................8;H
'.1.1Interfa)es e )one12es no post.resql.)onf..........................................................................1'
'.1.!+utenti)a2es no p./;ba.)onf...........................................................................................13
Autenticao local..............................................................................................................190
Identidade de usurios........................................................................................................192
Mapas de identificao.......................................................................................................194
H.@9 :4P"B$P AFN ")"BGFG F 493A)GSF "FS 493)VS)S >9S:...............................................................8L<
H.H493)VS)S SSLW:LS...................................................................................................................8L<
'.'.10ertifi)ados di.itais..........................................................................................................17&
Gerao de certificados atravs do OpenSSL.....................................................................194
Gerao de certificados atravs do Java KeyTool...............................................................194
'.'.!<ealizando )one12es.........................................................................................................17&
H.<BSBUGN9S, GBP9S ) PFPINS 1G9L)S2...............................................................................................8L<
H.=P9LR:N4F ") P)G$NSSS)S 1GF3: ) G)A9X)2.....................................................................................8L<
H.KAF$9S FFLFG S9!G) S)BGF3PF-..................................................................................................8L<
4 -Transaes e Write Ahead Logging..............................................................................................195
<.8ANSQ9 )GFL S9!G) :GF3SFPS)S...................................................................................................8L=
&.1.1=6veis de isolamento..........................................................................................................173
<.@$A44 E $BL:NA)GSN93 4934BGG)3: SYS:)$.............................................................................8L=
<.H49$9 FB34N93F 9 CFL 39 SNS:)$F ") FGQBNA9S..........................................................................8L=
<.<4>)4XP9N3:S ) 9 PG94)SS9 !CGN:)G............................................................................................8L=
<.=L94XS........................................................................................................................................8L=
5 -Rotinas administrativas.................................................................................................................196
=.8LN$P)OF ") G)NS:G9S FPFF"9S 49$ AF4BB$...............................................................................8LK
3.1.10onfi.ura2es de autova)uum..........................................................................................17%
3.1.!Dete)o de espao livre...................................................................................................17%
3.1.'<ein6)io de >ID.................................................................................................................17%
=.@49L):F ") )S:F:RS:N4FS................................................................................................................8LK
3.!.14abelas de )at?lo.o...........................................................................................................17%
3.!.!0onfi.ura2es do )oletor autom?ti)o...............................................................................17%
=.HL9N3 SQL ) G)P9G:)S ") )GG9S..............................................................................................8LK
=.<$93N:9GNF..................................................................................................................................8LM
3.&.10on;e)endo os pro)essos..................................................................................................17-
3.&.!@onitorando pro)essos )om p./top..................................................................................17-
3.&.'@onitorando uso de mem,ria )om vmstat e sar...............................................................17-
5
Administrao Profissional do PostgreSQL - Introduo
3.&.&@onitorando uso de dis)o.................................................................................................17-
3.&.3@onitorando lo.s do sistema )om 8.Aouine....................................................................17-
3.&.%@onitoramentos )om 0edrus............................................................................................17-
3.&.-@ais monitoramentos )om Babbi1....................................................................................17-
6 -Backups Eles podem salvar seu emprego..................................................................................198
K.8!F4XBPS "B$PWG)S:9G)...............................................................................................................8L;
%.1.19erando dumps )om p./dump e p./dumpall...................................................................17
%.1.!9erando dumps no 8.+dmin III.......................................................................................17
%.1.'<e)uperando dumps em te1to............................................................................................17
%.1.&<e)uperando dumps bin?rios )om p./restore..................................................................17
K.@!F4XBPS N34G)$)3:FNS 49$ P9N3:JN3J:N$) G)49A)GY 1PN:G2........................................................8L;
%.!.10oleta )ont6nua de lo.s de transa2es..............................................................................17
%.!.!Ba):up f6si)o Ca quenteD..................................................................................................17
%.!.'Simulao de )ras; e re)uperao do ba):up..................................................................17
%.!.&4imelines............................................................................................................................17
K.HCFG$JS:F3"!Y..........................................................................................................................8L;
%.'.1Lo. s;ippin. )om rsyn) e p./standby..............................................................................17
%.'.!Aailover.............................................................................................................................17
%.'.'Eot Aailover )om o #al@.r do S:y4ools..........................................................................17
7 -Algo sobre infraestrutura..............................................................................................................199
M.8)S:Q9 ") "NS49S........................................................................................................................8LL
-.1.1<+ID..................................................................................................................................177
M.@)S:Q9 ") SNS:)$F 9P)GF4N93FL..................................................................................................8LL
-.!.18ro)essos...........................................................................................................................177
-.!.!Se.mentos de mem,ria )ompartil;ada.............................................................................177
-.!.'Sem?foros..........................................................................................................................177
8 -Tuning - Ensinando o elefante a voar..........................................................................................200
;.8!)34>$FGXS :P4......................................................................................................................@T8
;.@F)GGF$)3:FS ") !)34>$FGX........................................................................................................@TH
.!.14estes 480-B )om o p.ben);............................................................................................!*'
.!.!4estes 480-0 )om DB4-!..................................................................................................!*'
.!.'4estes de )ar.a )om Fmeter...............................................................................................!*'
;.H"N4FS !USN4FS.............................................................................................................................@TH
;.<)VPLFN3 E )3:)3"F 9 QB) 9 QB)GY PLF33)G )S:U FFO)3"9............................................................@T<
.&.10usto e tempo de opera2es..............................................................................................!*&
.&.!0at?lo.o de opera2es......................................................................................................!*&
.&.'"1plain no 8.+dmin III.....................................................................................................!*&
;.=493SBL:FS ") GF3") A9LB$).....................................................................................................@T<
.3.19"GH................................................................................................................................!*&
.3.!8arti)ionamento................................................................................................................!*&
;.KG)493FNBGF3"9 9 S)GAN"9G )$ !BS4F ") ")S)$P)3>9..................................................................@T<
.%.1Aerramenta p.tune............................................................................................................!*&
.%.!0onfi.ura2es de )onsumo de re)ursos............................................................................!*&
.%.'Hutras )onfi.ura2es........................................................................................................!*&
;.MG)4BGS9S B3NV SYS:)$ A...........................................................................................................@T=
9 -Alta Disponibilidade....................................................................................................................206
L.8PG9Z):9S ") G)PLN4FPS)S.............................................................................................................@TK
7.1.1<epli)a2es de bai1o n6vel )om D<BD.............................................................................!*%
6
Administrao Profissional do PostgreSQL - Introduo
7.1.!<epli)a2es masterImultislaves )om Slony I.....................................................................!*%
7.1.'<epli)a2es multimaster e load balan)e )om p.pool II....................................................!*%
L.@FFNL9A)GS...................................................................................................................................@TK
7.!.1Linu1 Eearbeat..................................................................................................................!*%
7
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1 - Primeiros passos
Aeremos aqui quase como come%ar do come%o. Precisamos ver o processo de instala%o, mas
vamos atentar um pouco mais aos detal/es, s ve0es negligenciados por quest'es didticas em
livros mais bsicos.
1.1 Processo de instalao
Sero apresentados aqui vrios mtodos de instala%o, a maioria em ambiente Linu?, o que pode ser
&til tambm em outros sabores Bni?. Para que no ocorra de eu utili0ar uma distribui%o que supra
certas depend#ncias que outras no ou eu mesmo 5 /aver instalado 5unto com algum outro
aplicativo, resolvi mostrar o processo de instala%o em mais de uma distribui%o, na tentativa de ser
mais amplo e democrtico.
:entei dispor em uma crescente de facilidade, onde iniciamos com a instala%o em ambiente
"ebian. Fqui veremos a instala%o do pr+prio sistema operacional. 3o que se5a complicado, mas
por ser um e?plica%o completa de tudo que ser necessrio para se ter um ambiente preparado para
o PostgreSQL.
"epois, veremos a instala%o no CindoDs VP 1no testei, mas acredito que sirva para o Aista ou o
Seven2, atravs do prtico instalador mantido pela )nterprise"!, instalador tambm dispon(vel para
o $ac9S.
Por fim, veremos a instala%o de pacotes .deb no Bbuntu, para quem quer tudo muito bem
perfumado, atravs do gerenciador grfico de pacotes S7naptic.
1.1.1 Instalao no Debian Lenny
Sistemas de bancos de dados so famosos por serem vidos consumidores de recursos
computacionais. 4om o PostgreSQL no poderia ser diferente. )m ambientes corporativos,
comum dispor de uma mquina 1ou uma infraestrutura bem mais robusta2 com a fun%o espec(fica
de prover o banco de dados, nelas o ideal que no /a5a ,gasto. de recursos com opera%'es que
poderiam ter sido evitadas.
4om o "ebian, poss(vel instalar um ambiente operacional m(nimo, onde tudo pode ser mais
eficientemente aproveitado pelo banco.
Escolha e download do Debian Lenny
Para efetuar o doDnload do "ebian Lenn7 =.T, v ao endere%o DDD.debian.org e clique no menu
Hbtendo o Debian. L vamos escol/er a verso netinst, que nos trar uma imagem NS9 pequena e
todo resto devendo ser instalado pela pr+pria Nnternet. Para isso, clique no lin6 Bai1e um arquivo de
ima.em pequenoJ .rave-o em um 0DIDKDIdis)o (SBIdisqueteJ e instale usando a Internet. Fgora,
voc# poder bai?ar uma verso pequena 10Ds 8equenos2 ou min&scula 10Ds muito pequenosJ
disquetesJ (SB sti):sJ et)2, alm de poder efetuar uma instala%o inteiramente pela rede.
Aamos optar pela primeira verso. 9 lin6 0Ds 8equenos tra0 uma NS9 de apenas 8=T $b que nem
tanto nem to pouco.
8
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Processo de instalao em modo grfico
Fpesar de estarmos interessados em um ambiente m(nimo, sem gastos de recursos com ,suprfluos.
como o ambiente grfico, o processo de instala%o no precisa ser tortuoso. Aeremos como instalar
em ambiente grfico de modo bem simples e intuitivo.
Fo gravar sua imagem em um 4" ou pendrive, rebootar a mquina a partir da m(dia gravada, voc#
dever se deparar com a seguinte tela*
1 :ela inicial de boot do "ebian Lenn7
Pode optar pelo rap/ical install sem problemas. Feito isso, a pr+?ima tela trar a primeira escol/a,
o idioma a ser utili0ado durante o processo de instala%o e utili0a%o posterior no ambiente
instalado.
2 :ela inicial* )scol/a do idioma
9
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fpesar de termos escol/ido Portugu#s do !rasil, a pr+?ima tela nos perguntar qual o pa(s origem
do idioma. Aamos optar pelo !rasil novamente.
3 :ela de escol/a do pa(s do idioma informado
10
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
F pr+?ima escol/a o la7out do teclado. Aamos respeitar o sugerido.
4 :ela de escol/a do la7out do teclado
11
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fp+s a escol/a, o instalador ir efetuar algumas verifica%'es sobre os dispositivos.
5 :ela de detec%o e montagem de dispositivos
12
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Flguns componentes adicionais devero ser carregados
6 :ela de carregamento de componentes adicionais
13
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3este momento, o instalador tentar se conectar a algum servidor ">4P a fim de obter um NP
vlido na rede. I recomendvel /a5a este servidor em sua rede e que se5a poss(vel a mquina em
questo acessar a Nnternet.
7 :ela de configura%o do cliente do servi%o ">4P
14
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Quando o instalador parar de mostrar barras de progresso, voc# ser questionado a informar o nome
que pretende bati0ar seu novo sistema.
8 :ela de configura%o de nome da mquina na rede
15
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3a pr+?ima tela, no desmere%a a configura%o do fusoJ/orrio. Nsso muito importante.
3ormalmente, o rel+gio da !N9S dever estar corretamente configurado para o /orrio $: 1fuso
0ero2 com a escol/a pelo nosso fusoJ/orrio de JH /oras.
9 :ela de escol/a de cidade a fim de registrar o fusoJ/orrio
16
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
$ais algumas detec%'es sero feitas para que voc# possa entrar com mais alguma informa%o.
3este caso
10 "etec%o de novos /ardDares
17
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
9 pr+?imo momento ser sobre a configura%o das parti%'es do sistema.
11 :ela de carregamento do aplicativo de particionamento
18
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fqui, o critrio seu. Aamos criar as parti%'es manualmente.
12 :ela inicial de defini%o de parti%'es
19
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Para facilitar a escrita deste material, instalei o "ebian sobre o Airtual !o?, reservando apenas
8Tb para todo o sistema, mesmo assim optei por criar uma parti%o sDap e uma e?tH reservada
rai0 do sistema de arquivos. 3o vou entrar no mrito de quais mais parti%'es deveriam ser criadas,
isso sempre vai depender dos recursos que voc# tiver dispon(veis. 3o entanto, vou voltar a falar
sobre sistemas de arquivos e particionamento em outros momentos.
13 :ela de escol/a do >" a ser particionado
20
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
14 9p%o por criar nova tabela de parti%'es no >" escol/ido
21
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
15 9p%o por criar nova parti%o
22
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3a pr+?ima tela, vamos definir o taman/o da parti%o sDap. SDap a opera%o de escrita em discos
no momento em que /ouver um esgotamento da mem+ria GF$. 3o CindoDs, o sDap din[mico e
ocorre por padro na mesma parti%o onde o sistema for instalado, 5 no Linu?, ela reservada e
otimi0ada em uma parti%o que voc# deve definir.
9 valor e?ato que voc# deve reservar sDap tambm no determinado. $uita gente fala sobre a
mgica e?presso matemtica de @ ve0es a mem+ria GF$, uma ve0 que voc# deve ter uma
propor%o ainda bem maior de espa%o em disco dividido pela mem+ria dispon(vel. \ medida que
sua quantidade de mem+ria GF$ cresce a necessidade de sDap diminui. 9 fato que o sDap
necessrio, mas o bom mesmo que voc# nunca precise dela, sob pena de ver seu elefante sentar
cal%ada.
16 "efinindo o taman/o da parti%o sDap
23
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Se a parti%o for primria, dever ter um n&mero entre 8 e <, se for l+gica acima disso. 3o que /a5a
diferen%a de integridade ou desempen/o entre os dois tipos, mas em geral costumo optar por
parti%'es primrias.
17 "efinindo a parti%o como primria
24
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
18 )scol/a da posi%o da parti%o no in(cio ou no fim do >"
25
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
19 )scol/a da parti%o como sDap
26
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
20 Finali0ando a escol/a
27
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fgora vamos criar a parti%o principal que aqui apenas tomaremos o restante do disco. 3o entanto,
seria poss(vel e bem comum que reservssemos parti%'es para o sistema operacional, para os
diret+rios /ome dos usurios, para registros de log do sistema e para mais uma infinidade de coisas.
9 pr+prio PostgreSQL, dependendo da finalidade pode ser mel/or arran5ado em mais de uma
parti%o, mel/or ainda se estiver em mais de um disco, mas vamos dei?ar este assunto pra depois
que voc# resolver parar de ler na livraria e passar logo no cai?a.
21 Particionando o restando do disco
28
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3o vou repetir aqui as telas que voc# vai encontrar agora. Fo final, escol/a o sistema de arquivo e
ponto de montagem rai0.
3ota* Sobre ponto de montagem. Provavelmente voc# 5 sabe disso mel/or
do que eu, mas no custa di0er que no Linu? no tem essa de unidade 4*,
unidade "* e tal. Sempre deve /aver uma parti%o que ser utili0ada como
unidade principal 1a famosa 4*2. )la dita parti%o rai0 e deve ser escrita no
ponto de montagem W 1barra2. Fs demais parti%'es 1a e?ce%o da sDap2
devem ser montadas em subdiret+rios da rai0. Fssim* /boot, /var,
/home so sugest'es recorrentes em manuais de instala%o de Linu? uma
ve0 que separam em parti%'es diferentes subdiret+rios com fun%'es
recon/ecidamente diferentes, tornandoJas capa0es de evoluir de modo
independente, por e?emplo os diret+rios dos usurios devem estar abai?o de
W/ome. Se esta parti%o crescer e ficar c/eia, em ve0 de sair por a(
e?terminando os usurios mais c/atos, voc# pode simplesmente montar uma
parti%o de um >" maior no mesmo lugar da anterior sem ningum se
abalar.
9 "ebian Lenn7 ainda no tra0 o e?t< na instala%o padro, vamos discutir um pouco sobre
sistemas de arquivos em um momento mais oportuno.
22 )scol/a do sistema de arquivos da parti%o rai0
29
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
23 Finali0ando o particionamento
30
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
24 )screvendo as mudan%as no disco
31
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fp+s escrever a nova tabela de parti%o, seu disco ser formatado.
25 Formatando nova tabela de parti%'es
32
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fgora s+ ir tomar um caf.
26 Nnstalando sistema
33
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Sistema bsico instalado, a pr+?ima tela ir l/e sugerir e l/e perguntar o nome de um usurio
adicional para que voc# possa evitar entrar como root.
27 :ela de configura%o de novo usurio
34
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
28 )scol/a a sen/a deste usurio
35
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
9ptamos pela verso netinst do "ebian, portanto o final ser instalado pela rede. "evemos escol/er
o pa(s de onde buscar os demais pacotes a serem instalados.
29 )scol/a do pa(s origem dos pacotes a serem instalados
36
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
30 3o !rasil, estes so os reposit+rios servidores
37
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
4aso voc# se conecte rede atravs de um servidor pro?7, configureJo aqui.
31 4onfigura%o do servidor pro?7
38
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
F pr+?ima tela ir apenas e?ibir uma barra de progresso de acordo com a leitura e configura%o do
novo reposit+rio.
32 4onfigurando o apt
39
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
33 Flguns softDares 5 sero instalados neste momento
40
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
I bom sempre contribuir. 3a pr+?ima tela, voc# dever concordar ou descordar do seu sistema
participar da pesquisa de popularidade de pacotes. 3eguei por aqui, mas recomendo que voc#
aceite.
34 Participa%o na estat(stica de uso de pacotes
41
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)sta tela fundamental. Fqui vamos optar pelo sistema bsico, sem interface grfica ou quaisquer
outros servi%os que possam concorrer com nosso banco.
35 )scol/a pela instala%o apenas do sistema bsico
42
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
36 9 resto dos pacotes ser instalado agora
43
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fp+s instalado o sistema, voc# ser questionado se dese5a instalar o gestor de boot grub no in(cio da
parti%o reservada rai0 ou no registro pricipal do disco $!G 1master boot record2.
37 Nnstalando o grub na $!G
44
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
38 Fndamento do trmino da instala%o
45
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
39 4;atLs all fol:sM
46
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fp+s reiniciar, escol/a a primeira op%o de boot.
40 :ela de boot
47
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Efetuando o download dos fontes
Para voc# no perder o /bito de navegar na Nnternet, vamos instalar um navegador de modo te?to
para podermos ir ao site do PostgreSQL bai?Jlo de l.
4onfira na imagem abai?o*
41 Nnstalando o pacote l7n?
3ote que precisamos e?ecutar este comando como usurio root. 9 indicador # esquerda do cursor
indica que somos o root, do contrrio, /averia um $.
3ota* F partir deste momento, para citar qualquer comando no console,
apenas informaremos o indicador # quando este precisar ser reali0ado pelo
48
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
usurio root, ou o $ quando ele no for necessrio.
3ota* Poder(amos instalar o pr+prio PostgreSQL via aptJget, ele est
dispon(vel nos mesmos reposit+rios. 3o o fi0emos primeiramente por ser o
"ebian uma distribui%o fortemente focada na estabilidade, o que a torna
um pouco mais lenta na disponibili0a%o de pacotes de softDares. Ft o
momento, a verso do PostgreSQL dispon(vel nos reposit+rios "ebian a
;.H. 9utro motivo foi 5ustamente por querermos ver o que acontece de fato
em um processo de instala%o. 9 comando # apt-get install
postgresql vai pedir sua confirma%o para efetuar o doDnload de
depend#ncias e s+ vai parar depois que o banco tiver sido bai?ado,
configurado e iniciali0ado, tarefas que pretendemos digerir mastigando um
pouco mais.
Fp+s bai?ar o navegador, digite*
] l7n? DDD. postgresql.org
Aoc# vai se deparar com toda a bele0a da pgina principal do postgresql.org em modo te?tual.
42 :ela do l7n? na pgina DDD.postgresql.orgWdoDnload
3avegue atravs das setas, at a op%o sour)e )ode acender de amarelo. )nter para ,clicar. na
op%o*
43 Lin6 para o doDnload do PostgreSQL
49
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
A at a opco de verso. 3este momento, a verso ;.= ainda se encontra em estgio alp/a, optamos
pela ;.<.@.
44 9p%o de verso do PostgreSQL
F pr+?ima tela tra0 a escol/a do mirror de onde vamos bai?ar o S!", escol/a qualquer um e
confirme o salvamento do arquivo no final.
50
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
45 )scol/a do site espel/o
46 :ela de salvamento do arquivo
51
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Preparando o ambiente
Finda no estamos completamente preparados para receber o PostgreSQL. 3o temos sequer um
descompactador para abrirmos o b0@. )?ecute o comando abai?o para instalJlo*
# apt-get install bzip2
4om o b0ip@ instalado podemos descompactar o fonto do PostgreSQL bai?ado anteriormente
atravs do comando abai?o.
$ tar xvf postgresql-8.4.2.tar.bz2
)ntre no diret+rio gerado e liste seu conte&do*
$ cd postgresql-8.4.2
$ ls -l
Aoc# vai obter uma sa(da como esta*
total 1744
-rw-r--r-- 1 258 258 445 Abr 23 2004 aclocal.m4
drwxrwxrwx 2 258 258 4096 Fev 1 15:03 config
-rwxr-xr-x 1 258 258 801991 e! 9 23:56 config"re
-rw-r--r-- 1 258 258 61120 e! 9 23:56 config"re.in
drwxrwxrwx 41 258 258 4096 Fev 1 15:03 con#rib
-rw-r--r-- 1 258 258 1192 $an 1 2009 %&'()*+,-
drwxrwxrwx 5 258 258 4096 Fev 1 15:21 doc
-rw-r--r-- 1 258 258 4331 $an 14 2009 +./ma0efile.in
-rw-r--r-- 1 258 258 119345 e! 10 00:08 ,*2-&)(
-rw-r--r-- 1 258 258 18381 e! 10 00:08 *.2-A33
-rw-r--r-- 1 258 258 1423 $an 20 2001 4a0efile
-rw-r--r-- 1 258 258 1281 4ai 6 2008 )5A45
drwxrwxrwx 14 258 258 4096 Fev 1 15:18 6rc
Para seguir adiante, basta digitar o comando abai?o, mas no fa%a agora no, vamos conversar
primeiro*
$ ./configure
9 comando acima est listado no arquivo INSTALL deste diret+rio, voc# at poderia seguir seus
passos, mas vale uma pausa aqui. Precisamos instalar os pacotes requeridos pelo PostgreSQL. Para
fa0er tudo de uma s+ ve0, e?ecute o comando 1no esque%a de que onde /ouver # o comando deve
ser reali0ado como root2*
# apt-get install gcc make libreadline5-dev zlib1g-dev flex bison
9 processo de instala%o feito atravs da verstil ferramenta ma6e 1ou 3B $a6e para os mais
puristas2. SoftDares que a utili0am constroem um roteiro ditando cada passo que deve ser feito no
ato de instala%o, como criar diret+rios, c/ecar e?ist#ncia de depend#ncias, tomar decis'es de
acordo com alguma configura%o na mquina e, claro, modificar o roteiro de acordo com
informa%'es do usurio.
)ste roteiro se c/ama 3B$a6efile. Para criJlo necessrio e?ecutar o arquivo configure
presente na listagem acima. )ste arquivo um pun/ado de s/ell scripts que podem receber
par[metros em tempo de c/amada 1faremos isso daqui a pouco2 e vo escrever o nosso
3B$a6efile de acordo com eles ou com o padro de suas configura%'es.
Logo no in(cio das c/ecagens do configure, ser gerado um erro se no tivermos na mquina
52
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
nen/um compilador 4 1isso mesmo, nosso elefante tambm feito em 42. "a( a necessidade do
primeiro pacote do comando anterior* gcc.
)sse nosso blaJblaJbl sobre o ma6e. Fp+s a e?ecu%o do configure, ele quem vai rodar o
3B$a6efile gerado.
9s demais pacotes so recomendados estarem instalados. Sem a libreadline5-dev e a
zlib1g-dev, a princ(pio nosso configure no vai passar, mas seria poss(vel desabilitJlas. Z
flex e bison no impedem a instala%o, mas tambm so &teis.
Ae5amos*
Libreadline= uma biblioteca utili0ada pelo console de lin/a de comando psql para guardar o
/ist+rico de comandos reali0ados e poder navegar por ele com o uso das setas. I um recurso
e?tremamente &til, sobretudo no nosso caso 5 que contamos apenas com o modo te?to para
administrar o servidor. 4aso voc# ten/a tend#ncias masoquistas v em frente e use a op%o
--without-readline na c/amada ao configure.
Z Olib utili0ada pelos aplicativos de gera%o e importa%o de bac6ups 1dumps2 pg^dump e
pg^restore. Sem ela, no ser poss(vel e?portar e importar dumps compactados. Aou falar s+ por
falar* se no quiser a 0lib, use --without-zlib. Pronto, falei. $as se voc# disser que fui eu que
falei isso, eu nego.
Fle? e !ison so ferramentas Le? e Yacc respectivamente que podem ser usadas separadamente.
4om elas, poss(vel criar novos interpretadores de programa%o 1parsers2. 3o so fundamentais
para o uso do PostgreSQL 1a no ser que voc# este5a instalando uma verso ainda em
desenvolvimento2, mas outras ferramentas como o Slon7JN podem se valer delas.
4alma, ainda no e?ecute o configure. Pra qu# tanta pressa-
Ae5amos algumas op%'es de configura%o*
I. Tabela Algumas opes para o configure
9p%o 1JJop%o_valor^default2 Pra que serve-
--prefix=/usr/local/pgsql
4ertamente a configura%o mais utili0ada. 4om ela voc#
pode escol/er o local base de instala%o do servidor.
--exec-prefix
"iret+rio onde sero colocados arquivos dependentes da
plataforma. )m geral no informada valendo o mesmo
camin/o de --prefix.
--bindir=EXEC-PREFIX/bin
Se voc# quiser, pode colocar todos os e?ecutveis do
PostgreSQL em um diret+rio espec(fico.
--libdir=EXEC-PREFIX/lib
Local onde sero dispostas bibliotecas necessrias para
o servidor rodar corretamente
--includedir=PREFIX/include
9nde sero salvos arquivos /eader 4 e 4``
--with-blocksize=8
"efine o taman/o 1em Xb2 da menor unidade de
arma0enamento. 9 PostgreSQL nunca vai ao disco
escrever menos do que isso. )m geral, o padro ;Xb
atende s necessidades.
--with-*,
)?istem diversas op%'es --with. S+ para citar
53
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
--without-readline e
--without-zlib
algumas*
--with-perl e --with-python para instalar
respectivamente as linguagens Perl e P7t/on para
programar as fun%'es do banco. --with-openssl
para /abilitar cone?'es cifradas 1SSL2. --with-krb5,
--with-pam, --with-ldap para /abilitar outros
mtodos de autentica%o de cone?'es. Fs op%'es
--without 5 foram citadas.
--with-wal-segsize=16,
--with-wal-blocksize=8
)sses par[metros configuram o mecanismo CFL que
nos aprofundaremos no cap(tulo <. F op%o segsize
e?pressa em $b, pode ir de @ a K<$b e tem como
padro 8K$b. F op%o blocksize semel/ante
op%o --with-blocksize.
)?istem diversas outras op%'es, para con/ec#Jlas consulte a documenta%o oficial no endere%o*
DDD.postgresql.orgWdocsW;.<WinteractiveWinstallJprocedure./tml.
Instalando o PostgreSQL a partir do cdigo fonte
Fgora que acabou nosso blaJblaJbl, e?ecute o ./configure. F/, 5 /avia e?ecutado- :ranquilo.
Listando o diret+rio novamente voc# vai ver o 3B$a6efile gerado*
debian-7g68l:97o6#gre68l-8.4.2: l6 -l
#o#al 2020
-rw-r--r-- 1 258 258 445 Abr 23 2004 aclocal.m4
drwxrwxrwx 2 258 258 4096 Fev 1 15:03 config
-rw-r--r-- 1 roo# roo# 221113 Fev 1 15:18 config.log
-rwxr-xr-x 1 roo# roo# 39990 Fev 1 15:18 config.6#a#"6
-rwxr-xr-x 1 258 258 801991 e! 9 23:56 config"re
-rw-r--r-- 1 258 258 61120 e! 9 23:56 config"re.in
drwxrwxrwx 41 258 258 4096 Fev 1 15:03 con#rib
-rw-r--r-- 1 258 258 1192 $an 1 2009 %&'()*+,-
drwxrwxrwx 5 258 258 4096 Fev 1 15:21 doc
-rw-r--r-- 1 root root 4331 Fev 1 15:18 GNUmakefile
-rw-r--r-- 1 258 258 4331 $an 14 2009 +./ma0efile.in
-rw-r--r-- 1 258 258 119345 e! 10 00:08 ,*2-&)(
-rw-r--r-- 1 258 258 18381 e! 10 00:08 *.2-A33
-rw-r--r-- 1 258 258 1423 $an 20 2001 4a0efile
-rw-r--r-- 1 258 258 1281 4ai 6 2008 )5A45
drwxrwxrwx 14 258 258 4096 Fev 1 15:18 6rc
9 ma6e baseado em alvos que voc# passar no ato da c/amada. )?ecute a instru%o*
$ make
)la equivale a di0er make all. Nsto ir compilar o servidor para instala%o posterior.
)?ecute agora*
$ make install
3ote que colocamos aqui o sinal $ para representar a no obrigatoriedade de reali0ar o comando
54
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
como root. 3o entanto, se voc# e?ecutou o ./configure sem op%'es de mudan%a de diret+rio
1e?.* --prefix2, o padro ser instalar no diret+rio /usr/local/pgsql que certamente no
e?iste e dever ser criado no make install. Fcontece que o diret+rio /usr/local pertence
ao root e s+ ele tem permiss'es de escrita neste diret+rio. )m bom portugu#s, cara plida* Goda esta
baga%a como root mesmo.
Ps-instalao
9l/a a(, o passo anterior foi fcil demais. S+ que ele apenas instalou o servidor no --prefix.
4/eca l que o conte&do dele*
# ls -l /usr/local/pgsql
total 16
drwxr-sr-x 2 root staff 4096 Fev 4 14:26 bin
drwxr-sr-x 6 root staff 4096 Fev 4 14:26 include
drwxr-sr-x 3 root staff 4096 Fev 4 14:26 lib
drwxr-sr-x 7 root staff 4096 Fev 4 14:26 share
I importante agora criar um usurio para administrJlo. F &nica recomenda%o que este usurio
con/ecido como ,o cara. no nosso servidor deve ser um usurio digamos ?elelento no sistema
operacional, ou se5a, esque%a o root, vamos criar outro.
3ormalmente ele se c/ama postgres e est so0in/o no grupo postgres 1 meio autista o rapa02.
"igite o comando abai?o para criar o usurio*
# adduser postgres
3o somos obrigados a c/amar o usurio de postgres. )m min/as aulas, costumo at pedir para que
os alunos criem um usurio com o nome deles, primeiro porque o postgres 5 est criado e 5 /
uma outra instala%o do PostgreSQL nas mquinas para as turmas de outras disciplinas. $as
tambm gosto de dei?ar claro que o superusurio do PostgreSQL normalmente, mas no
obrigatoriamente, o postgres.
)ste comando vai l/e solicitar algumas coisas listadas em destaque nas mensagens abai?o*
Adicionando o usurio `postgres' ...
Adicionando novo grupo `postgres' (1001) ...
Adicionando novo usurio `postgres' (1001) ao grupo `postgres' ...
Criando diretrio pessoal `/home/postgres' ...
Copiando arquivos de `/etc/skel' ...
Digite a nova senha UNIX:
Redigite a nova senha UNIX:
passwd: senha atualizada com sucesso.
Modificando as informaes de usurio para postgres
Informe o novo valor ou pressione ENTER para aceitar o padro
55
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Nome Completo []: postgres
Nmero da Sala []:
Fone de Trabalho []:
Fone Domstico []:
Outro []:
Is the information correct? [Y/n] y
Fcredito que a sa(da se5a bastante intuitiva pra no precisar e?plicar. Fpenas note que no criei o
grupo, o adduser criou pra mim.
Fdduser na realidade um script em perl pra facilitar as coisas. )le c/ama por bai?o dos panos os
comandos do sistema useradd 1concordo, isso confunde mesmo2 para criar o usurio e
groupadd para criar o grupo dele.
4aso voc# este5a querendo fa0er algum script que crie automaticamente um usurio 1sem intera%o
/umana2, use useradd e ve5a como ele recebe par[metros que definem grupo, diret+rio /ome, s/ell
padro, etc atravs do comando man useradd. 3o entanto, se voc# quer apenas criar um usurio,
adduser me parece uma escol/a mais saudvel.
4riado nosso usurio, vamos iniciar o database cluster atravs do comando initdb.
3ota* 9 termo )luster usado tambm no PostgreSQL no a ver com um
con5unto de mquinas de prov#em um servi%o como se fossem uma s+, mas
sim em men%o ao con5unto de arquivos utili0ados para prover uma
inst[ncia do banco. 9u se5a, quando o servi%o estiver ativo, database )luster
significa quais arquivos iro arma0enar os dados de todas as bases,
incluindo data files e logs de transa%'es 1CFL2.
F menos que voc# crie novas tablespaces, todo o conte&do f(sico das bases
de uma inst[ncia ativa do PostgreSQL estar salva no interior do diret+rio
database cluster prJconfigurado pelo initdb.
9s passos so os seguintes*
1. # mkdir /usr/local/pgsql/data
2. # chown postgres:postgres /usr/local/pgsql/data
3. # su postgres
4. $ cd /usr/local/pgsql
5. $ bin/initdb -D data
Pra o bonde que eu quero descer. 3ingum aqui roba pra s+ repetir comando sem saber o que
est realmente fa0endo 1ten/o alguns amigos robas que so assim2.
3o passo 8, n+s, ento como usurio root 1ol/a a #, t cego? "esculpe, me e?alteib2, criamos um
subdiret+rio c/amado data no local onde instalamos o PostgreSQL. Lembra do ./configure --
prefix- Se no, volta um pouco a fita.
3o passo @, com o comando c/oDn 1);an.e o$ner2, o caridoso root, disse que esse diret+rio data
56
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
em questo no pertence a ele e sim ao usurio postgres, do grupo postgres. Se voc# criou um
usurio com outro nome, manten/a a coer#ncia aqui e use ele. 9 initdb e?plode o monitor se voc#
tentar rodJlo em um diret+rio pertencente ao root, cuidado.
$entira, ele vai fa0er isso aqui +*
$ bin/initdb -D data
The files belonging to this database system will be owned by user
"postgres".
This user must also own the server process.
The database cluster will be initialized with locale pt_BR.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "portuguese".
fixing permissions on existing directory data ... initdb: could not
change permissions of directory "data": Operao no permitida
9l/a l a &ltima lin/a. 9 initdb muda as permiss'es do diret+rio para s+ o nosso novo usurio poder
me?er com ele, os demais no conseguiro fa0er nada 1dando o famoso chmod 700 data2. Se
no conseguir, ele aborta a opera%o.
3o passo H, nos tornamos o usurio postgres. Z no <, fomos at o diret+rio data criado na
instala%o. 3o =, e?ecutamos o initdb para que ele monte a infraestrutura necessria dentro do
diret+rio data.
9 resultado ser apresentado na tela como o disposto abai?o. Aale ressaltar que ainda vamos
discutir o initdb com mais detal/es, o foco no esse por enquanto.
The files belonging to this database system will be owned by user
"postgres".
This user must also own the server process.
The database cluster will be initialized with locale pt_BR.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "portuguese".
fixing permissions on existing directory data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 28MB
creating configuration files ... ok
creating template1 database in data/base/1 ... ok
57
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
Success. You can now start the database server using:
bin/postgres -D data
or
bin/pg_ctl -D data -l logfile start
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option
next time you run initdb.
:elecurso @TTT, vamos tradu0ir esse in.rNis a(*
Os arquivos pertencentes a este sistema e banco de dados sero
propriedade do usurio postgres.
Este usurio deve tambm ser o dono do processo do servidor.
O database cluster 1claro que no vou tradu0ir isso2 ser inicializado com o
locale pt_BR.UTF-8.
A codificao padro de acordo foi setada para UTF8.
A configurao de pesquisa de texto ser definida como portugus.
Ajustando permisses no diretrio data ... ok 1ol/a a( a fonte da disc+rdia, a
culpa de no ter rodado antes dessa lin/a2
criando subdiretrios ... ok
selecionando o padro max_connections ... 100
selecionando o padro shared_buffers ... 28MB
58
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
criando arquivos de configurao ... ok 1vamos falar muito deles ainda2
criando a base template1 em data/base/1 ... ok 1tambm falaremos mais
sobre isso2
iniciando pg_authid ... ok
iniciando dependncias
criando system views ... ok
carregando descries de objetos de sistema ... ok
criando converses ... ok
definindo privilgios nos objetos nativos ... ok
criando information schema ... ok 1um esquema que abordaremos tambm2
vacuuming database template1 ... ok 1vacuum tambm ser e?plorado aqui2
copiando template1 para template0 ... ok
copiando template1 para postgres ... ok
Sucesso. Voc j pode iniciar o servidor usando:
bin/postgres -D data
ou
bin/pg_ctl -D data -l logfile start
9l/a s+, 5 foi criada a base de dados template8 e duas outras foram criadas a partir delas* templateT
e postgres. Aale ressaltar que mesmo que o usurio oDner do banco no se5a o postgres, ser criada
uma base de dados postgres, mas no ser criada uma base de dados para o outro usurio. "a( a
indica%o de se usar o postgres mesmo.
9l/a s+ o conte&do do diret+rio data agora*
postgres@debian-pgsql:/usr/local/pgsql$ ls -l data
total 68
drwx------ 5 postgres postgres 4096 Fev 5 09:11 base
drwx------ 2 postgres postgres 4096 Fev 5 09:11 global
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_clog
-rw------- 1 postgres postgres 3652 Fev 5 09:11 pg_hba.conf
-rw------- 1 postgres postgres 1631 Fev 5 09:11 pg_ident.conf
drwx------ 4 postgres postgres 4096 Fev 5 09:11 pg_multixact
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_stat_tmp
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_subtrans
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_tblspc
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_twophase
59
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
-rw------- 1 postgres postgres 4 Fev 5 09:11 PG_VERSION
drwx------ 3 postgres postgres 4096 Fev 5 09:11 pg_xlog
-rw------- 1 postgres postgres 16819 Fev 5 09:11 postgresql.conf
F gente ainda vai conversar muito sobre esse pessoal a(.
Inicializao
Nniciar o servidor simples tambm. > um comando vi0in/o do initdb, no diret+rio bin, c/amado
postgres para esta tarefa. Fntigamente este arquivo se c/amada postmaster. )les resolveram trocar
para postgres para ser mais intuitivo, mas por ra0'es /ist+ricas eu acredito, ainda e?iste um lin6
simb+lico l c/amado postmaster. )m resumo, postgres e postmaster so !atman e !ruce Ca7ne.
Aoc# pode iniciar o servidor com o seguinte comando*
postgres@debian-pgsql:/usr/local/pgsql$ bin/postgres -D data
9 que vem antes do comando em negrito s+ pra l/e mostrar o diret+rio onde estamos para reali0ar
este comando.
9 problema que desta forma, todos os logs gerados nas opera%'es do banco sero 5ogados na tela
e voc# ter o console travado enquanto o servi%o do banco estiver ativo. Seria mel/or fa0er ento
1estando no mesmo diret+rio, s+ omiti aqui pra no encarecer seu livro2*
$ bin/postgres -D data > data/logfile 2>&1 &
Fgora, todas as mensagens da sa(da padro 1stdout2 sero desviadas para o arquivo c/amado
logfile, criado dentro de data. Z a sa(da de erro 1stderr2, devido ao trec/o 2>&1, ser tambm
desviada para a sa(da 8 que a stdout, o vai acabar parando no mesmo arquivo. Z o & do final
para liberar o console.
Flm do postgres e seu alterJego postmaster, e?iste um script bem legal c/amado pg^ctl. Para
iniciar com ele obtendo o mesmo resultado do comando anterior, use*
$ bin/pg_ctl -l logfile -D data start
)le mais legal por ser mais limpo e possuir comandos como start, stop e restart.
Customizaes, facilitaes e automatizaes
Aamos simplificar a vida do nosso usurio postgres. Para isso, edite o arquivo .bas/rc no diret+rio
/ome do usurio postgres. Aamos aos passos*
# apt-get install vim
# su postgres
$ vi .bashrc
F primeira instru%o instalou o pacote de mel/orias 1AN Nmprovement2 pro editor Vi. Aoc# pode
optar por no e?ecutar esse comando e ou usar o Ai cru 1voc# tomou seu remdio /o5e-2 ou usar
algum editor de te?to sua escol/a como o pico ou seu sucessor nano.
60
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3a segunda instru%o voc# se transformou no postgres 1e o sinal de menos foi para voc# ser
direcionado ao diret+rio /ome do postgres2. Z na terceira, voc# est abrindo para edi%o o arquivo
.bashrc presente neste diret+rio. )ste arquivo sempre lido ao logon do usurio.
Se voc# no est familiari0ado com o Ai, tecle a letra i para entrar no modo de inser%o. 3o vou
entrar no mrito de ensinar o Ai, at porque tambm me considero um usurio bsico dele, mas
saiba que um editor que aceita comando, mas quando est no modo inser%o, vai aceitar digita%'es
para dentro do te?to.
)?istem alguns comando alias que esto comentados 1iniciam com a c2. 4ostumo retirar o
comentrio para contar com comandos como ll, que 5 reali0a um ls -l.
"epois, v at o final do arquivo e insira as seguintes lin/as*
export PGDATA=/usr/local/pgsql/data
export PATH=$PATH:/usr/local/pgsql/bin
F primeira lin/a cria uma varivel de ambiente &til para os aplicativos do PostgreSQL. Nsto inclui o
initdb, o postgres e o pg^ctl para que eles no precisem digitar a op%o J" e informar o database
cluster.
F segunda lin/a altera a varivel de ambiente PATH. )la tra0 os camin/os para arquivos para os
diret+rios onde o interpretador de comandos vai varrer em busca de qualquer comando digitado.
Fssim, no ser necessrio informar o camin/o para os comandos postgres, pg_ctl ou
quaisquer outros do diret+rio bin de nossa instala%o.
"epois, tecle ESC e digite :wq 1D para salvar E Drite E e q para sair E quit2.
)ste arquivo s+ ser lido no pr+?imo logon do usurio. )nto d# o comando exit e entre com o su
postgres novamente.
Fgora saia. Aamos voltar a ser o root. Aamos di0er ao sistema que queremos iniciar o PostgreSQL
no boot da mquina. 9 diret+rio contrib da instala%o 1aquele diret+rio que voc# listou no ano
passado logo ap+s o comando tar2 tra0 uma srie de coisas interessantes 1que vamos inclusive citar
outras mais2. 3ele / um subdiret+rio start-scripts com scripts que vo servir para iniciar o
banco em arquiteturas diferentes. 9 script que queremos o do arquivo linux.
Aamos aos comandos*
debian-pgsql:~postgresql-8.4.2# cp contrib/start-scripts/linux
/etc/init.d/postgresql
debian-pgsql:~postgresql-8.4.2# update-rc.d postgresql start 98 2 .
stop 20 0 1 6 .
F primeira lin/a copia o script dentro do contrib/start-scripts para o diret+rio
/etc/init.d/ que reservado na maioria das distribui%'es linu? para scripts de start, stop,
restart dos servi%os. Nsso vai ser necessrio para o segundo comando. 3ote que inseri e destaquei em
negrito o label anterior ao cursor para voc# prestar aten%o onde deve estar para e?ecutar o
comando uma ve0 que utili0ei um camin/o relativo. )m resumo, este5a no diret+rio de instala%o ou
reflita o camin/o at o diret+rio.
Z seria poss(vel efetuar o start do servidor c/amando o comando /etc/init.d/postgresql
start. Ae5a o conte&do desse arquivo, ele vai c/amar o pg^ctl pra repassar o start pra ele.
9 segundo comando um pouco mais obscuro e requer uma e?plica%o prvia.
61
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)m ambientes Bni?, e?iste o conceito de runlevels 1n(veis de e?ecu%o2. )stes so categori0a%'es
de opera%'es do sistema. )m outras palavras, quais processos devo levantar 1ou derrubar2 no
momento que um determinado runlevel for c/amado.
3o "ebian, os runlevels so*
T E 3(vel de desligamento 1/alt2
8 E 3(vel single user W modo m(nimo
@ a = E 3(veis de iniciali0a%o do sistema 1o padro o @2
K E 3(vel de religamento 1reboot2
Se voc# inventar de e?ecutar o comando init T, vai mandar o sistema desligar, uma ve0 que todos os
scripts configurados para disparar no runlevel T c/amam sua op%o stop.
9 comando update-rc postgresql vai di0er que queremos atuali0ar as c/amadas
automticas ao script postgresql 1aquele que n+s criamos no comando cp anterior2. "issemos
que queremos que o sistema operacional c/ame o script passando o par[metro start, com prioridade
L; no runlevel @ 1o que c/amado por padro quando ligamos a mquina2. "issemos que queremos
c/amar com o par[metro stop com prioridade @T nos runlevels T, 8 e K.
Prioridade- 9 que isso-
I simplesmente a ordem de c/amada ao script. F sen/a da fila do cai?a de um banco. Quando
inventamos este n&mero cabal(stico L; 1sugerido pelo pr+prio script postgresql que criamos no
WetcWinit.d2, apenas demos uma ordem muito alta, o que vai colocar o nosso servi%o PostgreSQL no
final da fila de iniciali0a%'es. Nsso bom, afinal o banco s+ deve iniciar depois de alguns servi%os
fundamentais do sistema 5 terem iniciado. 3o stop, fi0emos o contrrio, o n&mero @T 5 mais
bai?o, o que deve colocar o PostgreSQL para ser desligado logo no in(cio de desligamentos de
servi%os no s/utdoDn da mquina.
9l/a s+ a listagem do diret+rio /etc/rc0.d, que tra0 lin6s para os scripts c/amados neste
runlevel. F lin/a do PostgreSQL foi destacada em negrito. 9 X remete a 6ill 1c/amamos com a
opco stop2 e o n&mero @T colocou ele no come%o da lista.
# ll /etc/rc0.d
total 4
lrwxrwxrwx 1 root root 13 Fev 1 14:47 K11atd -> ../init.d/atd
lrwxrwxrwx 1 root root 15 Fev 1 14:47 K20exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root root 20 Fev 1 14:47 K20nfs-common -> ../init.d/
nfs-common
lrwxrwxrwx 1 root root 23 Fev 1 14:47 K20openbsd-inetd ->
../init.d/openbsd-inetd
lrwxrwxrwx 1 root root 20 Fev 5 15:51 K20postgresql -> ../init.d/
postgresql
lrwxrwxrwx 1 root root 20 Fev 1 14:29 K25hwclock.sh -> ../init.d/
hwclock.sh
lrwxrwxrwx 1 root root 26 Fev 1 14:29 K63mountoverflowtmp ->
../init.d/mountoverflowtmp
62
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
lrwxrwxrwx 1 root root 17 Fev 1 14:29 K90rsyslog ->
../init.d/rsyslog
-rw-r--r-- 1 root root 353 Dez 23 2007 README
lrwxrwxrwx 1 root root 18 Fev 1 14:29 S20sendsigs ->
../init.d/sendsigs
lrwxrwxrwx 1 root root 17 Fev 1 14:29 S30urandom ->
../init.d/urandom
lrwxrwxrwx 1 root root 22 Fev 1 14:29 S31umountnfs.sh ->
../init.d/umountnfs.sh
lrwxrwxrwx 1 root root 17 Fev 1 14:47 S32portmap ->
../init.d/portmap
lrwxrwxrwx 1 root root 20 Fev 1 14:29 S35networking -> ../init.d/
networking
lrwxrwxrwx 1 root root 18 Fev 1 14:30 S36ifupdown ->
../init.d/ifupdown
lrwxrwxrwx 1 root root 18 Fev 1 14:29 S40umountfs ->
../init.d/umountfs
lrwxrwxrwx 1 root root 20 Fev 1 14:29 S60umountroot -> ../init.d/
umountroot
lrwxrwxrwx 1 root root 14 Fev 1 14:29 S90halt -> ../init.d/halt
Fgora a listagem do WetcWrc@.d. Fgora o PostgreSQL aparece com um S 1start2 e o n&mero L; o
5ogou pro fim da fila.
# ll /etc/rc0.d
total 4
-rw-r--r-- 1 root root 556 Ago 12 2008 README
lrwxrwxrwx 1 root root 17 Fev 1 14:29 S10rsyslog ->
../init.d/rsyslog
lrwxrwxrwx 1 root root 15 Fev 1 14:31 S12acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 15 Fev 1 14:47 S20exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root root 20 Fev 1 14:47 S20nfs-common -> ../init.d/
nfs-common
lrwxrwxrwx 1 root root 23 Fev 1 14:47 S20openbsd-inetd ->
../init.d/openbsd-inetd
lrwxrwxrwx 1 root root 13 Fev 1 14:47 S89atd -> ../init.d/atd
lrwxrwxrwx 1 root root 14 Fev 1 14:29 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 20 Fev 5 15:51 S98postgresql -> ../init.d/
postgresql
lrwxrwxrwx 1 root root 18 Fev 1 14:29 S99rc.local ->
63
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
../init.d/rc.local
lrwxrwxrwx 1 root root 19 Fev 1 14:29 S99rmnologin ->
../init.d/rmnologin
lrwxrwxrwx 1 root root 23 Fev 1 14:29 S99stop-bootlogd ->
../init.d/stop-bootlogd
Instalao via apt-get
:odo esse trabal/o que tivemos 1t, foi fcil, mas tivemos que e?ecutar algumas tarefas na un/a2
poderia ter sido dispensado se tivssemos instalado o postgresql atravs do aptJget. "o 5eito que
fi0emos para instalar algumas bibliotecas necessrias.
)?ecute o comando*
# apt-get install postgresql postgresql-contrib
)sse postgresql um metapacote que vai fa0er o apt l/e perguntar se voc# aprova a instala%o dos
pacotes libpq=, openssl, opensslJblac6list, postgresql, postgresqlJ;.H, postgresqlJclientJ;.H,
postgresqlJclientJcommon, postgresqlJcommon, sslJcert.
9 pacote postgresqlJcontrib vai instalar o pacote postgresqlJcontribJ;.H.
3ote que no "ebian, no momento em que escrevo este material 1denunciado pelas datas dos
comandos ls utili0ados2 a verso do PostgreSQL no reposit+rio a ;.H.
)ste o &nico comando necessrio para que ele bai?e dos reposit+rios todos os pacotes citados,
instale o servidor, crie o usurio postgres 1se no e?istir previamente2, e?ecute o initdb. "etal/e* se
5 /ouver um PostgreSQL rodando na porta padro 1=<H@2, ele vai detectar e definir a configura%o
para outra porta =<HH ou uma pr+?ima dispon(vel. )le vai ainda iniciar o sistema, colocar os
e?ecutveis no PF:>, criar o script de iniciali0a%o e colocJlo para iniciar e encerrar 5unto com o
sistema.
9u se5a, fa0er absolutamente tudo que fi0emos na mo. F/, agora perdeu a gra%ab _2
Fc/ei importante falar do processo na mo anteriormente para que voc# saiba o que realmente est
acontecendo. Aerifique no final deste processo os diret+rios onde ele vai 5ogar nossos arquivos.
1.1.2 Instalao do EnterpriseDB no Windows
"esde os anos ;T, nos idos do 8ost-In.res 1nosso con/ecido postgres2 do professor da Bniversidade
da 4alif+rnia $ic/ael Stonebra6er, muitas empresas apoiaram o pro5eto do /o5e con/ecido sob o
slogan ,o mais avan%ado banco de dados open source do mundo..
3ota* :/e Dorldds most advanced open source database. 4onfira um lin6 at
mesmo camico sobre iniciativas de atuali0ar este slogan no endere%o* /ttp*WW
mom5ian.usWmainWblogsWpgblogW@T8T./tmlcZanuar7^@L^@T8T.
S+ pra citar algumas, a 4ommandPrompt, a )nterprise"! e a SGF 5 lan%aram vers'es comerciais
do PostgreSQL, que possui licen%a !S" e permite este tipo de coisa.
Fundada em @TT<, a )nterprise"! contratou diversos nomes de peso do universo em redor do
PostgreSQL lobal "evelopment roup 1P"2, como !ruce $on5iam, "ave Page, >ei66i
Linna6angas, Xorr7 "ouglas, entre outros. Gecebe tambm investimentos pesados de empresas de
como a N!$, 3::, Ged >at, Son7, entre outras que v#em no PostgreSQL uma alternativa vivel a
64
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
produtos comerciais, sobretudo o 9racle 1alis, o maior alvo dos produtos corporativos da
)nterprise"!2 e na pr+pria )nterprise"! como uma institui%o de marca capa0 de vencer barreiras
de entrada em grandes empresas consumidoras que precisam do suporte e de peito forte pra bater se
algo em seus bancos de dados der errado.
3ota* I meu amigo, o mundo open source sim um mundo corporativo
regido por empresas com interesses comerciais, por mais que s ve0es
selvagens, infeli0mente leg(timos. F pr+pria Sun / muito que investe
bastante no P", dispondo de um grupo liderado por Zos/ !er6us. )m
@TT;, ela adquiriu a $7SQL F!, ento mantenedora do $7SQL, o que
assustou a comunidade PostgreSQL e em @TTL foi adquirida pela 9racle. 9
que levou at o pr+prio $ont7 Cidenius, criador do $7SQL, a mover uma
campan/a mundial ao estilo* ,H;J e a.oraJ quem poder? nos defenderO.
para que a 9racle no comprasse o $7SQL temendo sua descontinuidade
1/ttp*WW/elpm7sql.orgWptWt/eissueWcustomerspa7t/ebill2. Posso estar defasado
quando voc# ler este material, mas at agora a 9racle nada mudou no
$7SQL a ol/o nu.
Bma das contribui%'es mais not+rias da )nterprise"! comunidade o instalador do PostgreSQL
para CindoDs, mantido por "ave Page. Para bai?Jlo, v se%o doDnload do site oficial do
PostgreSQL 182 e clique no lin6 do pacote binrio para CindoDs 1@2.
47 9nde encontrar o PostgreSQL para CindoDs
65
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
L, voc# vai se deparar com o lin6 1H2 do Hne )li): installer. ,9ne clic6. c/ega a ser propaganda
enganosa, mas ele ser bem fcil de instalar tambm.
48 Lin6 para o one )li): installer
66
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Aoc# ser levado pgina da )nterprise"! para bai?Jlo de l. > vers'es para outras plataformas,
mas estamos aqui em busca da verso CindoDs 1<2.
49 Lin6 do one )li): installer para CindoDs na )nterprise"!
67
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)fetuado o doDnload, e?ecute o arquivo para iniciar a instala%o.
50 Nn(cio da instala%o no CindoDs
68
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Sabe aquelas instala%'es 33F- 1:radu%o infame* 3e?tJ3e?tJFinis/2. I quase isso. 3a pr+?ima
tela confira o local onde ele pretende instalar nosso PostgreSQL.
51 )scol/a do diret+rio de instala%o
69
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)le reserva uma tela tambm para que voc# possa escol/er o diret+rio do database )luster. Lembra
dele-
52 )scol/a do diret+rio do database cluster
70
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
F pr+?ima tela 5 a da escol/a da sen/a do usurio postgres. Fqui, diferente do primeiro instalador
para CindoDs que saiu na verso ;.T do PostgreSQL, e ainda est dispon(vel at a verso ;.H, voc#
no escol/e o usurio, eles ser necessariamente o postgres. Se ele no e?istir, o instalador dever
criJlo, se e?istir, voc# fornecer a sen/a dele. F &nica recomenda%o que ele no se5a
Fdministrador.
3ota* Bm detal/e curioso que o instalador antigo recomendava que voc#
criasse sen/as distintas para o usurio do CindoDs que detm o processo
postgres e para o superusurio do banco. 3o entanto, aqui eles desistiram
dessa idia, nem ao menos poss(vel fa0er isso.
53 )scol/a da sen/a do usurio postgres
71
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
F pr+?ima tela inteira apenas para que voc# escol/a a porta onde ele vai rodar. )ssa tela me
dei?ou com pena da fol/a de papel gasta com sua impresso.
54 )scol/a da porta
72
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
F pr+?ima tela a das ,configura%'es avan%adas.. 3em tanto. )scol/a a regionali0a%o 1locale2 que
preferir 1falaremos mais sobre este assunto2 e diga que voc# concorda que a linguagem plWpgsql se5a
instalada no template8, o que acabar replicando esta instala%o para as demais bases criadas, uma
ve0 que a template8 a template padro adotada nos 4G)F:)s "F:F!FS)s.
55 :ela de ,op%'es avan%adas.
73
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
9pa. Fgora est tudo pronto para instalar.
56 Pronto para instalar
74
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3ote que assim como nos pacotes .deb no Linu?, aqui a instala%o vai rodar o initdb e iniciar o
servidor.
57 :ela de in(cio da instala%o
75
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
58 :ela de in(cio do servi%o
76
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
4/egamos ao final. Fgora, se voc# pretender instalar softDares adicionais, clique em Finis/ com o
c/ec6bo? marcado. )le ir c/amar o Stac6 !uilder, que tambm estar dispon(vel no menu para
c/amadas posteriores.
59 :ela de finali0a%o da instala%o
77
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
60 :ela inicial do Stac6 !uilder E )scol/a o servidor ativo
78
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
61 :ela de op%'es de softDares adicionais do Stac6 !uilder
79
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1.1.3 Instalao no Ubuntu via Synaptic
Finda mais fcil que a instala%o no CindoDs, o gerenciador de pacotes S7naptic uma ferramenta
grfica com funcionalidade semel/ante ao aptJget. 3ele, voc# pode pesquisar algum softDare que
ele vai buscar nos mesmos reposit+rios do aptJget.
3ota* 9 S7naptic no e?clusividade do Bbuntu nem to pouco o aptJget
do "ebian. I poss(vel ter um ambiente des6top bastante interessante sem
muito esfor%o no "ebian, como tambm e?iste verso Server do Bbuntu. 3o
entanto, o que pretendi aqui foi mostrar as duas distribui%'es onde elas so
mais comuns. I mais fcil ac/ar drivers para ambiente visual no Bbuntu e
voc# viu como interessante reali0ar a instala%o m(nima do "ebian para
no congestionar seu sistema 1e por que no di0er potenciali0ar os riscos de
seguran%a2 com a instala%o de pacotes que no sero utili0ados pelo
PostgreSQL.
3ota* 9s reposit+rios do Bbuntu so diferentes do "ebian, mas so
locali0ados a partir das configura%'es do mesmo arquivo*
/etc/apt/sources.list. )diteJo vontade se pretender adicionar ou
remover novos reposit+rios de instala%o.
Para abrir o S7naptic, v ao menu* Sistema e Fdministra%o e erenciador de Pacotes S7naptic.
62 9nde est o S7naptic
Aoc# 5 deve saber que no Bbuntu n+s no lo.amos como root. Precisamos criar uma conta de
usurio durante a instala%o. )ste usurio ser um sudoer, ou se5a, um usurio que tem condi%'es de
se fa0er passar por root se c/amar um dos comandos sudo ou gksu 1um sudo visual2. 9 lin6 para
80
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
o S7naptic na verdade um comando gksu synaptic 1se voc# e?ecutar isso no terminal ter o
mesmo resultado2.
63 :ela inicial do S7naptic
3a tela inicial, digite 4trl`F para abrir um pequeno dilogo para pesquisar. )ntre com a palavra
postgresql, voc# ver a enorme quantidade de aplicativos ligados ao PostgreSQL.
64 "ilogo de pesquisa pelo postgresql
4om o boto direito, marque para instalar o meta pacote postgresql. )le ir l/e informar que vai
instalar os pacotes dispostos na imagem abai?o*
65 :ela de mudan%as adicionais
81
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Nnstale tambm os pacotes postgresqlJcontrib 1contribui%'es da comunidade2 e pgadminH 1cliente
visual bem interessante E instalado automaticamente no instalador do )nterprise"! no CindoDs2.
66 Pacotes a serem instalados
82
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
,:rabal/oso. como no mtodo aptJget. )le vai efetuar o doDnload de tudo que for necessrio,
reali0ar o initdb e levantar nosso servidor. Aoc# poder levantar e ir ao ban/eiro se dese5ar 1por
favor, dei?e o livro sobre a mesa2.
67 "ilogo de efetuando o doDnload
83
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
68 :ela final. 9 servidor est sendo iniciado. 9l/a s+ onde ficaro os arquivos
84
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1.2 Initdb Incio do database cluster
9 processo de cria%o do database cluster inicial merece um pouco mais de detal/amento. Flm do
diret+rio onde sero arma0enados os arquivos de todos os databases criados, / outros par[metros
que podemos passar neste momento. 4onfira os mais importantes deles na tabela abai?o*
II. Tabela Opes de parmetros mais utilizados para o initdb
Opo Descrio
-A metodo
--auth=metodo
$todo que o servidor ir utili0ar para autenticar as cone?'es dos
usurios da mquina local. 9 valor padro trust, que significa
que o servidor vai confiar que usurio quem di0 ser, sem nem
perguntar qual a sen/a dele. Aeremos mais este assunto no
4ap(tulo H E Futentica%'es e Permiss'es.
85
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
-D diretrio
--pgdata=diretrio
9p%o que 5 con/ecemos 1se voc# pulou a se%o de instala%o no
"ebian, talve0 ten/a pulado o que no devia2. "efine o diret+rio
onde dever ser criada a infraestrutura necessria para arma0enar
os arquivos de todas as bases de dados. )sta informa%o
obrigat+ria, no entanto este par[metro pode ser omitido se /ouver
uma varivel de ambiente P"F:F.
9 initdb ir retornar uma fal/a caso o usurio em questo no se5a
dono do diret+rio passado. 9 usurio que iniciar o servidor
tambm dever ser o mesmo que detiver o diret+rio e
consequentemente e?ecutar o initdb.
-E encoding
--encoding=encoding
)specifica a tabela utili0ada para representar os caracteres em
campos desta nature0a. Falaremos sobre este assunto em um
t+pico espec(fico mais adiante.
--locale=locale,
--lc_collate=locale,
--lc_ctype=locale,
--lc_messages=locale,
--lc_monetary=locale,
--lc_numeric=locale,
--lc_time=locale
"efine a regionali0a%o padro das bases de dados criadas no
cluster. Fs vers'es lc^f so id#nticas opco locale, mas servem
para uma subcategoria espec(fica de regionali0a%o. Fpenas
--locale afeta todas as categorias.
)ste assunto tambm ser analisado no mesmo t+pico que a op%o
--encoding.
-X diretrio
--xlogdir=diretrio
)specifica o diret+rio onde sero salvos os logs de transa%o. I
utili0ado em algumas configura%'es que buscam desempen/o
onde estes logs so gravados em um diret+rio montado em uma
controladora de disco e?clusiva para isso. F opco padro o
subdiret+rio pg_xlog abai?o de --pgdata. :rataremos deste
assunto no 4ap(tulo < E Crite F/ead Log e no 4ap(tulo ; E
:uning.
-U usurio,
--username=usurio
3ome do superusurio do banco. 9 padro o usurio do sistema
que e?ecutar o initdb, no entanto poss(vel passar um usurio
com um nome diferente dentro do servidor. 9 recomendado no
utili0ar esta op%o, mas uma prtica utili0ar o usurio postgres
caso no se5a este o nome do usurio no sistema operacional.
-W
--pwprompt
9p%o que simplesmente vai solicitar a sen/a do superusurio do
banco. Sem esta op%o o superusurio criado sem sen/a e voc#
no tem condi%'es de conectar usando algum mtodo que precise
de sen/a como passDord ou md= at que defina uma entrando por
algum outro mtodo de autentica%o como trust ou ident.
Falaremos sobre isto novamente no 4ap(tulo H. Futentica%'es e
permiss'es.
86
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1.2.1 Arquivos e diretrios do cluster
Aamos tratar dos arquivos e diret+rios gerados pelo init. Aamos dar uma ol/ada novamente no
conte&do do diret+rio data. Nniciemos pelos diret+rios*
postgres@debian-pgsql:/usr/local/pgsql/data$ ll | grep ^d
drwx------ 6 postgres postgres 4096 Fev 5 15:56 base
drwx------ 2 postgres postgres 4096 Fev 9 11:50 global
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_clog
drwx------ 4 postgres postgres 4096 Fev 5 09:11 pg_multixact
drwx------ 2 postgres postgres 4096 Fev 9 12:49 pg_stat_tmp
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_subtrans
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_tblspc
drwx------ 2 postgres postgres 4096 Fev 5 09:11 pg_twophase
drwx------ 3 postgres postgres 4096 Fev 5 09:11 pg_xlog
Diretrio base
9 diret+rio base onde ficam os arquivos de dados de todos os ob5etos de cada database. )le
organi0ado em um subdiret+rio para cada database, confira uma listagem inicial*
ll base
total 20
drwx------ 2 postgres postgres 4096 Fev 10 08:44 1
drwx------ 2 postgres postgres 4096 Fev 10 08:42 11563
drwx------ 2 postgres postgres 4096 Fev 10 08:44 11564
9 diret+rio 8 fcil. I reservado aos arquivos da base template1. Z os outros so reservados s
bases templateT e postgres. $as como saber qual deles-
Aamos l, primeiramente vamos entrar no psql para buscar nas tabelas de catlogo. 4onsiderando
que voc# 5 ten/a configurado o camin/o para o diret+rio bin do PostgreSQL instalado 1se instalou
sem ser a partir de c+digos fonte, o instalador 5 fe0 isso por voc#2.
3ota* )stou considerando que voc# 5 tem um m(nimo de familiaridade com
instru%'es SQL e 5 teve contato com psql. $esmo que este &ltimo se5a
algum descon/ecido, a prtica ao longo deste livro vai dei?Jlo mais
familiari0ado com a ferramenta.
$ psql
psql (8.4.2)
Type "help" for help.
postgres=# select datname, oid from pg_database;
datname | oid
87
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
-----------+-------
template1 | 1
template0 | 11563
postgres | 11564
(3 rows)
F tabela de catlogo pg_database tra0 as informa%'es sobre as bases de dados 5 criadas.
Aeremos tabelas de catlogo no cap(tulo = E Gotinas Fdministrativas. 9 campo datname onde o
nome de cada base arma0enado. 9 oid 1ob5ect identifier2 um identificador de todo ob5eto no
PostgreSQL.
3ota* 9 PostgreSQL um S!" que implementa diversas caracter(sticas
do modelo ob5etoJrelacional. "entre elas o identificador de ob5etos. 3o
PostgreSQL, cada tabela, sequ#ncia, registro, database, etc, possui um
identificador seguindo a premissa da 99 que di0 que todo ob5eto possui
uma refer#ncia.
Fpesar de alguns esfor%os nos padroni0a%'es SQL F3SN mais recentes, o
modelo ob5etoJrelacional no um padro claramente definido. Nnclusive foi
visto por muitos como algo que trou?e mais comple?idade aos S!"s
relacionais. )les diferem bastante em o qu# e como implementam. Bma boa
leitura sobre o assunto o livro de um dos precursores do PostgreSQL, o
professor $ic/ael Stonebra6er, 9b5ectJGelational "!$Ss* :/e 3e?t reat
Cave, $organ Xaufmann Pub. I um pouco antigo, de 8LLK, mas uma
leitura bem interessante.
Bm material bem interessante, apesar de tambm no to recente 1@TTH2,
dispon(vel na site da BL!GFJGS sobre como o PostgreSQL implementa o
modelo ob5etoJrelacional o :44 de "enise !oness 4un/a entitulado*
)studo comparativo sobre caracter(sticas de bancos de dados ob5eto
relacionais, onde ela discute como o PostgreSQL e o 9racle tratam este
modelo.
> uma ferramenta, dispon(vel apenas no contrib, c/amada oid@name. Aamos instalJla para no
precisar reali0ar consultas diretamente nas tabelas do catlogo.
debian-pgsql:~/postgresql-8.4.2/contrib/oid2name# make
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-
after-statement -Wendif-labels -fno-strict-aliasing -fwrapv
-I../../src/interfaces/libpq -I. -I../../src/include -D_GNU_SOURCE
-c -o oid2name.o oid2name.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-
after-statement -Wendif-labels -fno-strict-aliasing -fwrapv
oid2name.o -L../../src/port -lpgport -L../../src/interfaces/libpq -
lpq -L../../src/port -Wl,--as-needed -Wl,-rpath,'/usr/local/pgsql/
lib' -lpgport -lz -lreadline -lcrypt -ldl -lm -o oid2name
debian-pgsql:~/postgresql-8.4.2/contrib/oid2name# cp oid2name /usr/
local/pgsql/bin/
88
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)stamos no diret+rio oid@name do contrib, e?ecute o comando ma6e para compilar a ferramenta.
"epois copie para o diret+rio bin do servidor instalado. Fo logar como postgres, simplesmente
e?ecute o comando abai?o*
postgres@debian-pgsql:~$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
11564 postgres pg_default
11563 template0 pg_default
1 template1 pg_default
3ota* 9 e?ecutvel oid@name funciona de modo semel/ante s demais
ferramentas do diret+rio bin que precisem conectar ao servidor 1e.g. psql,
createdb, etc2. 4onsulte oid2name --help para mais op%'es de
comando.
9 nome do diret+rio de cada base de dados 5ustamente o 9N" dele que voc# pade conferir na
consulta acima ou atravs da oid@name. Aamos criar uma nova base e verificar o diret+rio criado.
postgres=# CREATE DATABASE livro;
CREATE DATABASE
postgres=# \q
postgres@debian-pgsql:/usr/local/pgsql/data$ ll base/
total 16
drwx------ 2 postgres postgres 4096 Fev 10 08:44 1
drwx------ 2 postgres postgres 4096 Fev 10 08:42 11563
drwx------ 2 postgres postgres 4096 Fev 10 08:44 11564
drwx------ 2 postgres postgres 4096 Fev 10 08:50 16384
Bm novo diret+rio 1163842 criado automaticamente. "entro de cada um desses diret+rios, e?istem
diversos arquivos. Se voc# um dia pensou que a base template8 era va0ia, d s+ uma ol/ada no
conte&do de seu diret+rio.
postgres@debian-pgsql:/usr/local/pgsql/data$ ls base/1
112 11474 2602_vm 2615_fsm 2663 2702 3600_fsm
113 11476 2603 2615_vm 2664 2703 3600_vm
11447 11477 2603_fsm 2616 2665 2704 3601
11447_fsm 11479 2603_vm 2616_fsm 2666 2753 3601_fsm
11447_vm 11481 2604 2616_vm 2667 2753_fsm 3601_vm
11449 1247 2605 2617 2668 2753_vm 3602
11451 1247_fsm 2605_fsm 2617_fsm 2669 2754 3602_fsm
11452 1247_vm 2605_vm 2617_vm 2670 2755 3602_vm
89
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
11452_fsm 1249 2606 2618 2673 2756 3603
11452_vm 1249_fsm 2606_fsm 2618_fsm 2674 2757 3603_fsm
11454 1249_vm 2606_vm 2618_vm 2675 2830 3603_vm
11456 1255 2607 2619 2678 2831 3604
11457 1255_fsm 2607_fsm 2619_fsm 2679 2832 3605
11457_fsm 1255_vm 2607_vm 2619_vm 2680 2833 3606
11457_vm 1259 2608 2620 2681 2834 3607
11459 1259_fsm 2608_fsm 2620_fsm 2682 2835 3608
11461 1259_vm 2608_vm 2620_vm 2683 2836 3609
11462 1417 2609 2650 2684 2837 3712
11462_fsm 1418 2609_fsm 2651 2685 2838 3764
11462_vm 174 2609_vm 2652 2686 2838_fsm 3764_fsm
11464 175 2610 2653 2687 2838_vm 3764_vm
11466 2328 2610_fsm 2654 2688 2839 3766
11467 2600 2610_vm 2655 2689 2840 3767
11467_fsm 2600_fsm 2611 2656 2690 2840_fsm 548
11467_vm 2600_vm 2612 2657 2691 2840_vm 549
11469 2601 2612_fsm 2658 2692 2841 PG_VERSION
11471 2601_fsm 2612_vm 2659 2693 3501
11472 2601_vm 2613 2660 2696 3502
11472_fsm 2602 2614 2661 2699 3503
11472_vm 2602_fsm 2615 2662 2701 3600
:odos esses arquivos foram gerados a partir dos ob5etos e?istentes na base de dados. Por mais que a
template8 normalmente no ten/a nen/uma tabela criada no esquema padro 1public2, ela 5 tra0 =
esquemas, onde os outros possuem sim diversos ob5etos.
$ psql template1
psql (8.4.2)
Type "help" for help.
template1=# \dn
List of schemas
Name | Owner
--------------------+----------
information_schema | postgres
pg_catalog | postgres
90
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
pg_toast | postgres
pg_toast_temp_1 | postgres
public | postgres
(5 rows)
9s n&meros dos arquivos no interior dos diret+rios de cada base de dados pode ser mas no
necessariamente o 9N" dos ob5etos da base.
> uma tabela no esquema pg^catalog c/amada pg^class que registra cada tabela ou (ndice criado.
Aou criar uma tabela na base que gerei para mostrar a gera%o do arquivo*
template1=# \c livro
psql (8.4.2)
You are now connected to database "livro".
livro=# CREATE TABLE capitulo (id serial primary key,
livro-# nome varchar (50));
NOTICE: CREATE TABLE will create implicit sequence
"capitulo_id_seq" for serial column "capitulo.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"capitulo_pkey" for table "capitulo"
CREATE TABLE
Ae5amos agora uma consulta tabela pg^class para verificarmos onde nossa nova tabela ser
arma0enada.
livro=# SELECT relname, relfilenode, oid
livro-# from pg_class where relname='capitulo';
relname | relfilenode | oid
----------+-------------+-------
capitulo | 16387 | 16387
livro=# \q
postgres@debian-pgsql:/usr/local/pgsql/data$ ll base/16384/16387
16387
-rw------- 1 postgres postgres 0 Fev 10 09:04 16387
9 campo relname registra os nomes dos ob5etos e o oid um n&mero que os identifica. F
novidade fica por conta do campo relfilenode, que inicialmente o mesmo do oid, mas ele
quem realmente identifica o arquivo gerado no disco. Aamos a uma prtica para mostrar porque eles
podem diferir*
livro=# INSERT INTO capitulo (nome) values ('Introduo');
INSERT 0 1
Ft a(, nada demais, apenas inserimos um registro na tabela.
91
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
livro=# TRUNCATE capitulo RESTART IDENTITY;
TRUNCATE TABLE
livro=# INSERT INTO capitulo (nome) values ('Introduo');
INSERT 0 1
Fgora, truncamos a tabela e reinserimos o valor. Aoc# bem deve saber que o :GB34F:) funciona
como um ")L):) sem filtro, ou se5a, apaga todos os registos, no entanto sua opera%o ""L e
no "$L, como o ")L):). 3a prtica, o :GB34F:) reali0a um "G9P na tabela e um novo
4G)F:) com as mesmas caracter(sticas.
3ota* Bma novidade do PostgreSQL ;.< a op%o G)S:FG: N")3:N:Y,
que assim como FL:)G S)QB)34) nome^sequencia G)S:FG:, reinicia
a sequ#ncia.
livro=# select relname, oid, relfilenode, reltuples,
livro-# relpages * 8 * 1024 as size
livro-# from pg_class where relname='capitulo';
relname | oid | relfilenode | reltuples | size
----------+-------+-------------+-----------+------
capitulo | 16387 | 16397 | 0 | 0
(1 row)
Aerifique agora que o relfilenode est diferente do oid. "escendo mais ainda o n(vel,
veremos que o PostgreSQL copiou o arquivo da tabela para um novo e apagou o anterior. Para no
perder o lin6 para o arquivo, ele a5ustou o relfilenode na tabela pg^class.
3ota* 9utros comandos alteram o refilenode. Flm do :GB34F:), as
instru%'es G)N3")V e 4LBS:)G e alguns tipos de FL:)G :F!L)
tambm o fa0em.
F ferramenta oid@name tambm retorna o relfilenode da tabela, para isso e?ecute o comando*
$ oid2name -t capitulo -d livro
From database "livro":
Filenode Table Name
----------------------
16397 capitulo
9 que so essas colunas reltuples e relpages utili0adas anteriormente- )las tra0em,
respectivamente, o n&mero de tuplas 1registros2 e o n&mero de unidades de escrita 1pginas2
utili0adas para arma0enas essas informa%'es no disco.
3ota* Lembra quando tratamos do par[metro para ./configure na
instala%o via fontes no "ebian- L foi citado o par[metro --with-
blocksize onde era poss(vel definir o taman/o dessas unidades de
escrita. 9 valor padro ;Xb. Por isso, relpages f ; f 8T@< vai dar o
n&mero de unidades f ;Xb.
92
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
)stran/o, por que o valor delas est em 0ero- )u no acabei de inserir um valor-
Aamos tentar inserir outro pra ver se o PostgreSQL agora pega no tranco.
livro=# INSERT INTO capitulo (nome) values ('Primeiros passos');
INSERT 0 1
livro=# select relname, oid, relfilenode, reltuples,
livro-# relpages * 8 * 1024 as size
livro-# from pg_class where relname='capitulo';
relname | oid | relfilenode | reltuples | size
----------+-------+-------------+-----------+------
capitulo | 16387 | 16397 | 0 | 0
(1 row)
"eu na mesma. Ser que ele t com defeito-
Feli0mente nob 3osso dign(ssimo elefante no tem bugs 1o pessoal que participa do seu
desenvolvimento vai gostar de ler esta frase2. Nsso ocorre porque as tabelas de catlogo no so
alteradas sempre, seria custoso fa0er isso a cada transa%o de manipula%o. Nmagine isso em um
banco 9L:P afogado em cone?'es.
Feli0mente, temos o comando F3FLYO) para atuali0ar esses valores.
livro=# ANALYZE capitulo ;
ANALYZE
livro=# select relname, oid, relfilenode, reltuples,
livro-# relpages * 8 * 1024 as size
livro-# from pg_class where relname='capitulo';
relname | oid | relfilenode | reltuples | size
----------+-------+-------------+-----------+------
capitulo | 16387 | 16397 | 2 | 8192
(1 row)
Fgora foib Aamos listar o diret+rio novamente para verificar o que foi feito no disco*
$ ls -lh base/16384/16397
-rw------- 1 postgres postgres 8,0K Fev 10 12:10 16397
9 arquivo anterior 18KH;M2, o mesmo do oid, 5 no e?iste mais. Fgora, temos um arquivo com
outro n&mero 18KHLM2, que bate 5ustamente com relfilenode e seu taman/o e?atamente o
relpages f ;Xb 1bloc6si0e2.
Quando o valor de reltuples era 8, relpages foi 8 tambm. Quando inserimos mais um
registro e reltuples foi atuali0ado para @, relpages continuou valendo 8. Nsto significa que o
conte&do dos dois registros coube em apenas uma pgina 1;Xb2.
3ota* Bma forma de saber se seu banco possui registros grandes ou
93
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
pequenos verificar a ra0o reltuples W relpages. Quanto maior for
este valor mais tuplas cabem em uma pgina de ;Xb 1ou o taman/o definido
em bloc6si0e2, quanto menor o contrrio. Se a resposta for entre T e 8
significa que, em mdia, seus registros consomem mais do que ;Xb no
disco, cada.
Como o armazenador funciona
Quando o PostgreSQL vai ao disco para ler uma informa%o de uma tabela, ele l# pelo menos uma
pgina 1bloc6si0e E ;Xb2, podendo ler mais caso o conte&do se5a maior. Quando altera algum dado,
ele escreve o novo valor do registro no final e marca o registro anterior como invlido. Falaremos
deste procedimento novamente no 4ap(tulo =. Gotinas administrativas, ao tratarmos de Aacuum.
Sabendo que o disco possui um desempen/o, por mel/or que se5a, bem inferior ao da mem+ria
principal, o PostgreSQL, a cada consulta, l# essas pginas de dados e arma0ena em uma rea de
mem+ria denominada buffer )a);e. 4ada pgina do disco comp'e uma pgina no buffer cac/e em
mem+ria. )ste buffer compartil/ado por todos os processos criados a partir das cone?'es ao
servidor.
Quando o servidor precisar ler uma nova pgina, tentar colocJla no cac/e e o buffer 5 estiver
completamente c/eio, uma pgina menos utili0ada ser apagada 1pa.e evi)tion2, o que vai for%ar
uma nova leitura de disco caso seu dado precisar ser relido por algum cliente conectado. 9 taman/o
do buffer regido pelo par[metro shared_buffers do arquivo principal de configura%o do
cluster postgresql.conf. F princ(pio, antes da anlise mais aprofundada que faremos no 4ap(tulo ; E
:uning, aumentar o shared_buffers indica mel/or desempen/o em consultas.
4ada transa%o precisa que os dados este5am no disco 1m(dia persistente2 para que se5a considerada
finali0ada. 9 PostgreSQL adota o processo de log antes da escrita 1CFL2, o que significa que as
pginas de dados alteradas so salvas em arquivos sequenciados 1normalmente, no diret+rio
pg_xlog2, mas so mantidas tambm em mem+ria. Quando / uma nova consulta que precise de
tuplas contidas nas pginas que ainda esto apenas nesses arquivos CFL, o servidor apenas l# as
pginas da mem+ria, nunca precisa consultar esses arquivos.
Quando uma dessas pginas precisa ser descarregada elas so consideradas su5as 1em uma tradu%o
ao p da letra para o termo dirty2 ou modificadas, para tra0er um termo que mel/or e?plique sua
situa%o em bom portugu#s, uma ve0 que ou ela est com seu conte&do alterado ou ainda nem ao
menos e?iste nos arquivos de dados 1no diret+rio base2. )sta e?pulso do para(so da mem+ria
1dirty pa.e evi)tion2 provoca uma escrita nos arquivos de dados. Fssim, o servidor continua sem
precisar ler os arquivos CFL.
$as ento por que cargas ddgua ele gera esses arquivos. Simplesmente por ser mais rpido do que
sobrescrever as pginas envolvidas em uma transa%o, que pode me?er com um n&mero ra0ovel de
pginas no cont(guas, o que provocaria um movimento bem maior da controladora do disco. >
um processo no servidor denominado b.$riter 1escritor em bac6ground2 que procura ler o conte&do
desses arquivos CFL e registrar suas informa%'es nas pginas de dados. "Jse a essa leitura o
nome de );e):point.
$udando um pouco de assunto, se um registro for grande demais para e?ceder o taman/o da
pgina, o PostgreSQL adota duas abordagens, compacta%o e fragmenta%o. )ssas abordagens so
denominadas :9FS: E 4;e Hversized-+tribute Stora.e 4e);nique. 4ampos que no vo admitir
valores grandes como um AFG4>FG de taman/o limitado ou n&meros no podem ser :9FS:ados
94
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1perdo pelo neologismo, :9FS:ado at que soa legal _2. Nsso bom porque o :9FS: adiciona
um certo over;ead em leituras e escritas que no deve recair em campos menores. )ste over/ead s+
vai compensar em campos maiores, para que eles no gerem muito deslocamento do ponteiro ao
percorrer os valores menores.
Rndices tambm podem ser :9FS:ados. Fpenas de, em geral, os campos que podem ser maiores de
;Xb no serem bons candidatos a (ndice, se voc# criar um sobre um campo desta nature0a o arquivo
gerado para o (ndice tambm ter um comportamento semel/ante ao que vamos e?plicar com as
tabelas.
Fntes de prosseguir, ve5amos o seguinte cenrio*
livro=# \d capitulo
Table "public.capitulo"
Column | Type | Modifiers
-----------+-----------------------+-----
id | integer | default ...
nome | character varying(50) |
descricao | text |
Indexes:
"capitulo_pkey" PRIMARY KEY, btree (id)
Fqui, apenas refresquei sua mem+ria com rela%o estrutura da tabela utili0ada at agora nos
e?emplos. 3ote que nen/um campo pode c/egar a ;8L@ b7tes 1;Xb2.
livro=# select relname, oid, relfilenode, reltoastrelid
from pg_class where relname='capitulo';
relname | oid | relfilenode | reltoastrelid
----------+-------+-------------+---------------
capitulo | 16387 | 16397 | 0
(1 row)
F consulta a pg^class trou?e um campo novo c/ama reltoastrelid, que vai informar o nome
do arquivo que ser utili0ado para arma0enar os valores que e?cederem ;Xb. Aamos criar um
campo com potencial de ser :9FS:ado.
livro=# ALTER TABLE capitulo ADD descricao text;
ALTER TABLE
livro=# select relname, oid, relfilenode, reltoastrelid
from pg_class where relname='capitulo';
relname | oid | relfilenode | reltoastrelid
----------+-------+-------------+---------------
capitulo | 16387 | 16397 | 16399
(1 row)
95
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fo adicionar o campo descricao do tipo te?t, no estamos restringindo seu taman/o, o que
gerou um arquivo, por enquanto 0erado, cu5o nome baseado no 9N" da tabela :9FS: associada
nossa tabela capitulo. 3o possuir taman/o definido umas das regras bsicas para um campo
ser :9FS:vel 1legal ,:9FS:vel. tambmb2. )sta tabela :9FS: um procedimento totalmente
transparente ao usurio, estou mostrando aqui porque domingo, o Fantstico est muito c/ato e
voc# est de bobeira querendo arrumar alguma coisa pra matar o tempo.
Fo inserir um registro em uma tabela :9FS:ada, como a nossa agora, os primeiros H@ bits do
campo do :9FS: so reservados ao n&mero que informa o taman/o do :9FS: 5 incluindo o
pr+prio espa%o ocupado por esses H@ bits. 9u se5a, se a gente registrar apenas uma letra 1um &nico
b7te2 no campo te?to, o n&mero e?presso nesses H@ bits ser HH.
"os H@ bits do taman/o do :9FS:, @ no comp'em o n&mero, so bits de controle. Sobram HT bits.
Se fi0ermos uma conta de padaria 1nos tempos do cru0eiro quando as padarias lidavam com valores
mais altos2, veremos que @
HT
8TMHM<8;@<. )sse trem a( em b7tes equivale a 8T<;=MK Xb, ou
8T@<$b, ou 8b. Logo, um campo no PostgreSQL dever ter no m?imo 8b 1menos 8b7te,
afinal, em tese, tambm poder(amos ter o valor 0ero2.
Pra que servem esses dois bits de controle- !om, se vierem 0erados, significa que o conte&do do
campo inserido coube na pgina de dados, sem precisar correr para a tabela :9FS:. Se um dos bits
vier ligado, significa que o conte&do foi comprimido e arma0enado ainda na pgina de dados. Se o
outro vier ligado, porque o conte&do no coube na pgina de dados e precisou ir para a tabela
:9FS:. 9 que fica na pgina de dados ento o endere%o onde encontrar os dados no arquivo da
tabela :9FS:. Se os dois bits forem 8, tanto a compacta%o quanto a :9FS:ada foram aplicados.
)?istem < tipos de arma0enamento em colunas :9FS:veis. 4onfira a tabela*
III. Tabela Mtodos de armazenamento em tabelas TOAST
Mtodo Descrio
EXTENDED
$todo padro para campos :9FS:. Permite comprimir o valor
a ser arma0enado. Se este ainda for maior do que a pgina
1blocksize E ;Xb2, o valor vai ser 5ogado ao arquivo da
tabela :9FS:.
EXTERNAL
Fssim como EXTENDED, permite :9FS:ar o dado inserido,
mas no permite compresso do valor. Possui um desempen/o
mel/or do que a anterior, uma ve0 que no /aver o over/ead da
compacta%o, no entanto ocupa mais espa%o em disco.
MAIN
Permite compresso, mas procura evitar :9FS:ar os dados.
PLAIN
$todo que torna um campo :9FS:vel, no :9FS:vel. 9u
se5a, campos como o te?t utili0ado nos nossos e?emplos vo
gerar o arquivo da tabela :9FS: em sua cria%o, mas no vo
utili0Jla, nem mesmo tero seus valores compactados na pgina
da tabela principal.
)stes tipos de arma0enamento podem ser modificados em instru%'es FL:)G :F!L), como na
din[mica a seguir*
livro=# INSERT INTO capitulo (nome, descricao) values
96
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
livro-# ('Opes de configurao', repeat('teste', 9999999));
INSERT 0 1
F fun%o repeat, obviamente repete. 3este caso, o valor do campo descri%o ser LLLLLLL ve0es a
palavra teste, o que vai resultar em mais de =TTXb. 4onfira*
livro=# select relname, oid, relfilenode, reltoastrelid
livro-# from pg_class where relname = 'capitulo';
relname | oid | relfilenode | reltoastrelid
----------+-------+-------------+---------------
capitulo | 16387 | 16397 | 16399
(1 row)
livro=# \q
postgres@debian-pgsql:/usr/local/pgsql/data$ ll base/16384/16399*
-rw------- 1 postgres postgres 576K Fev 10 22:38 16399
-rw------- 1 postgres postgres 24K Fev 10 22:38 16399_fsm
Fgora vamos for%ar a barra e definir um outro mtodo de arma0enamento, o PLFN3 que o mais
restritivo.
livro=# ALTER TABLE capitulo ALTER COLUMN descricao SET STORAGE
PLAIN;
ALTER TABLE
livro=# INSERT INTO capitulo (nome, descricao) values
('Autenticaes e permisses', repeat('teste', 9999999));
ERROR: row is too big: size 50000048, maximum size 8164
STATEMENT: INSERT INTO capitulo (nome, descricao) values
('Autenticaes e permisses', repeat('teste', 9999999));
ERROR: row is too big: size 50000048, maximum size 8164
F instru%o S): S:9GF) definiu o novo mtodo de arma0enamento, mas ele no vai dei?ar que
/a5a arma0enamento no arquivo :9FS:, ficando limitado pgina de dados. Pior, a pgina ainda
perdeu seus H@ b7tes iniciais por ser um campo :9FS:vel.Aerifique isso na mensagem de erro
que termina di0endo ma?imum si0e ;8K<. ;8LK 1;Xb2 menos H@ b7tes.
Para fec/ar esta se%o, se uma tabela, mesmo que no conten/a dados :9FS:ados, atingir o limite
de 8b, um outro arquivo ser gerado. Seu nome o mesmo relfilenode da tabela com o
sufi?o .8. 13o nosso caso seria 16397.12, consequentemente, um arquivo .@ ser criado a partir do
pr+?imo 8b, e assim por diante.
Mapeamento de espao livre em pginas de dados
4ada arquivo de arma0enamento de tabela, (ndice e tambm os arquivos :9FS: possuem um
arquivo _fsm associado para mapear o espa%o livre no interior de suas pginas de dados. )sta
97
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
tcnica se c/ama mapeamento de espa%o livre 1FS$ E Free Space $apping2.
Z vimos que poss(vel mais de um registro ocupar a mesma pgina de dados. Fo apagarmos um
registro, este no limpo do disco neste e?ato momento, mas sim marcado para como indispon(vel,
minimi0ando o impacto da dele%o completa sobre a transa%o que mandou que fosse apagado. )sta
opera%o postergada e delegada a um outro processo c/amado AF4BB$ 1falaremos mais sobre
ele no 4ap(tulo =. Gotinas administrativas2.
Fo e?ecutar o AF4BB$, voc# vai limpar o registro 5 apagado, dei?ando a pgina de dados
subutili0ada. Pginas subutili0adas podem inc/ar nosso espa%o em disco. 9 racioc(nio l+gico, se a
cada ;Xb 1bloc6si0e padro2 s+ usarmos <Xb, estamos dobrando o espa%o necessrio para
arma0enar nossos dados.
Ft a verso ;.H do PostgreSQL, /avia uma instru%o no postgresql.conf c/amada
max_fsm_pages que voc# precisaria a5ustar para informar ao processo AF4BB$ qual o limite
m?imo de pginas ele ir procurar para limpar dados obsoletos.
3o momento em que as pginas com registros mortos 1marcados para serem limpos pelo
AF4BB$2 superassem o valor deste par[metro, ter(amos um problema de arma0enamento, 5 que o
AF4BB$ no iria limpar algumas delas dei?ando o banco maior do que deveria, e problemas de
desempen/o, 5 que os dados ficariam mais fragmentados no disco, provocando maior movimento
do ponteiro de leitura nas consultas. Bm valor bem alto em max_fsm_pages viria bem a cal/ar 1e
era o que "!Fs mais cansados e mal alimentados acabavam fa0endo2, mas tambm poderia
comprometer o desempen/o uma ve0 que cada pgina de dados usurparia K b7tes de mem+ria
compartil/ada para tarefas administrativas e comprometeria o pr+prio desempen/o do AF4BB$
que poderia perder tempo tentando limpar muitas pginas que no teriam nada a ser limpo.
Bma solu%o indicada em alguns sistemas seria manter o valor de max_fsm_pages bai?o e rodar
um AF4BB$ FBLL em momentos ociosos 1domingos e feriados, por e?emplo2. F op%o FBLL
fa0 o AF4BB$ tentar limpar todas as pginas. $as quo bai?o bai?o o suficiente- Seu sistema
tem um momento ocioso-
F/, t bomb Aamos parar de falar de AF4BB$ aqui se no a se%o que fi0 s+ pra ele no cap(tulo =
no ter a menor gra%a.
3o no, esta a &ltima* Bma recomenda%o de tuning bem falada seria rodar o AF4BB$
A)G!9S) no sistema em produ%o e verificar a sa(da. )la di0 quantas pginas foram limpas de
fato. Fssim voc# teria uma no%o 1apro?imada, afinal os usurios do seu sistema so seres /umanos,
desconfio eu2 de quantas pginas cada AF4BB$ peri+dico de fato precisa.
Feli0mente, >ei66i Linna6anga, desenvolvedor da )nterprise"!, teve a idia, incorporada no
PostgreSQL ;.<, de trabal/ar com o mapeamento de espa%o livre em disco, 5ogando os par[metros
max_fsm_pages e seu irmo mais +bvio e menos falado max_fsm_relations no saco.
4omo funciona agora-
Seguinte. 9 PostgreSQL reserva um &nico b7te por pgina 1lembra que ela tem ;Xb, ou se5a ;8L@
b7tes2 para informar a dimenso do espa%o livre. 4omo sua professora da primeira srie deve ter l/e
ensinado, o maior n&mero poss(vel em 8 b7te 1; bits2 @==.
9 que- Sua professora da primeira sria no l/e ensinou binrio- F min/a tambm no, mas vou
pedir que a do meu fil/o e?plique bem isso a ele. Ffinal, isso ser e?tremamente importante na
carreira de 5ogador de futebol dele. Nsso mesmo, 5ogador de futebol, preciso dese5ar o mel/or ao pra
ele, programar coisa de nerd liso *J2.
98
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Gecuperado do momento* =on-sense Ps ' da man;, vamos l. 9 valor desse bit ser o taman/o do
espa%o livre dividido pelo taman/o da pgina, o que d um valor entre T e 8. $ultiplicado por @=K,
vai dar algum valor entre T e @=K. Frredondado pra bai?o, como sempre /aver dado na pgina, o
maior n&mero ser @==. Bm b7te bem bonito com todos os bits em 8.
3os arquivos _fsm so arma0enadas em pginas, tambm do taman/o do bloc6si0e 1;Xb2,
cole%'es de refer#ncias s pginas do arquivo principal. )sta cole%o estruturada em rvore
binria de acordo com o o valor do b7te que falamos anteriormente.
9 arquivo README dispon(vel no camin/o
src/backend/storage/freespace do diret+rio de instala%o
e?plica como essa rvore opera e?atamente.
3a primeira ve0 que o servidor vai arma0enar algum dado, ele consulta as pginas FS$ em busca
de pginas de dados com espa%o suficiente dispon(vel. S+ se no /ouver, ele abre uma nova pgina
de dados e registra o seu. Se vai ficar fora de ordem- Fica. $as segundo o padro SQL, os dados s+
devem vir organi0ados se voc# utili0ar 9G")G !Y. Sem voc# usar esta clusula, S!" nen/um
tem a obriga%o de l/e entregar os registros organi0ados por nen/um campo, nem mesmo por
ordem de inser%o.
F partir do segundo arma0enamento, ele no mais consulta o mapa FS$ daquela tabela, afinal isso
poderia comprometer seu desempen/o uma ve0 que o mapa poderia indicar outra pgina mais
distante. "esta forma, /averia movimento e?cessivo para arma0enar e tambm para que os dados,
inseridos pr+?imos, persistidos distantes, serem buscados em uma mesma consulta.
9 que o servidor fa0 tentar arma0enar na mesma pgina de dados at no /aver mais espa%o
dispon(vel. Quando isto ocorrer, o pr+prio mapa FS$ atuali0ado para constar o espa%o que sobrou
naquela pgina. F pr+?ima inser%o consultar o FS$ para ac/ar outra ou, se for o caso, criar uma
pr+?ima.
4omo veremos no cap(tulo <. :ransa%'es e Crite F/ead Logging, at o c/amado );e):point, nada
do que foi dito aqui aconteceu. 9 processo c/amado b.$riter quem e?ecuta esse c/ec6point. Nsso
pode acontecer automaticamente ou atravs da c/amada ao comando 4>)4XP9N3:. 9utros
comandos tambm podem for%ar a reali0a%o do c/ec6point, no entanto se apenas isso que voc#
quer que aconte%a, esse o comando.
9 comando F3FLYO) atuali0a as tabelas de catlogo. I fundamental para que o plane5ador de
consultas ten/a uma idia sempre real ou bastante pr+?ima da dimenso das tabelas de onde buscar
dados. F nossa con/ecida tabela pg^class tra0 reltuples, relpages que vo informar esta
dimenso.
Finda no mesmo cap(tulo =, veremos que o processo autova)uum, alm de limpar registros
marcados para dele%o, tambm atuali0a os arquivos _fsm das tabelas, (ndices e :9FS:s.
9s arquivos _vm s+ esto dispon(veis para os arquivos de dados de tabelas 1nem os (ndices nem os
:9FS:s possuem arquivos _vm au?iliares2. )les servem para registrar quais pginas de dados
foram modificadas desde o &ltimo AF4BB$. Nsso au?ilia o processo de AF4BB$ para que ele
no saia louco por a( procurando em pginas de dados que no ten/am nada para limpar. Foi esse
cara que matou as diretivas max_fsm_pages e max_fsm_relations.
Um pouco de prtica
Aamos reali0ar algumas atividades para persistir essas informa%'es nas pginas de dados da sua
99
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
cabe%a. Aamos importar uma base de dados com pequeno volume, mas 5 capa0 de nos mostrar
muita coisa. Aamos tambm adicionar umas fun%'es capa0es de mostrar o espa%o livre dispon(vel.
Aamos instalar mais uma ferramenta do diret+rio contrib da instala%o dos fontes do
PostgreSQL. F pg^freespacemap carrega um par de fun%'es que retornam informa%'es e?tra(das
dos arquivos _fsm.
Sob o contrib, n+s entramos no diret+rio pg^freespacemap. Para compilar essa biblioteca e
inserir no diret+rio de bibliotecas do nosso PostgreSQL instalado, digite*
debian-pgsql:~# cd postgresql-8.4.2/contrib/pg_freespacemap
debian-pgsql:~/postgresql-8.4.2/contrib/pg_freespacemap# ll
total 16
-rw-r--r-- 1 258 258 469 Set 30 2008 Makefile
-rw-r--r-- 1 258 258 1107 Jun 11 2009 pg_freespacemap.c
-rw-r--r-- 1 258 258 894 Jun 10 2009 pg_freespacemap.sql.in
-rw-r--r-- 1 258 258 292 Jun 10 2009
uninstall_pg_freespacemap.sql
debian-pgsql:~/postgresql-8.4.2/contrib/pg_freespacemap# make
sed 's,MODULE_PATHNAME,$libdir/pg_freespacemap,g'
pg_freespacemap.sql.in >pg_freespacemap.sql
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-
after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fpic -
I. -I../../src/include -D_GNU_SOURCE -c -o pg_freespacemap.o
pg_freespacemap.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-
after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fpic -
shared pg_freespacemap.o -L../../src/port -Wl,-
rpath,'/usr/local/pgsql/lib' -o pg_freespacemap.so
Fp+s a compila%o, dois arquivos criados nos interessam* pg_freespacemap.so e
pg_freespacemap.sql. 9 primeiro a biblioteca que precisamos e o segundo um script para
e?ecutarmos em nossa base para criar as fun%'es que veremos em seguida.
Fntes de continuarmos, vamos criar nossa nova base de dados. 9 site PgFoundr7 fa0 parte da
comunidade de sites que tra0em bons pro5etos ao redor do PostgreSQL. > um pro5eto l c/amado
dbsamples. )le simplesmente um con5unto de scripts para cria%o de novas bases de dados.
Aamos bai?ar uma base c/amada dellstore que um modelo de uma lo5a virtual. Para bai?ar o
script, e?ecute o comando abai?o 1se estiver em ambiente grfico, ou se gosta do nosso amigo
L7n?, navegue at o doDnload do dellstore no pro5eto /ttp*WWpgfoundr7.orgWpro5ectsWdbsamples2.
debian-pgsql:~# wget
http://pgfoundry.org/frs/download.php/543/dellstore2-
normal-1.0.tar.gz
--2010-02-12 10:15:10--
100
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
http://pgfoundry.org/frs/download.php/543/dellstore2-
normal-1.0.tar.gz
Resolvendo pgfoundry.org... 200.46.204.130
A conectar pgfoundry.org|200.46.204.130|:80... conectado!
HTTP requisio enviada, aguardando resposta... 200 OK
Tamanho: 2271997 (2,2M) [application/binary]
A gravar em: 'dellstore2-normal-1.0.tar.gz'
100%[======================================>] 2.271.997 115K/s
em 13s
2010-02-12 10:15:24 (170 KB/s) - 'dellstore2-normal-1.0.tar.gz'
gravado [2271997/2271997]
Fgora descompacte o arquivo para importar a base.
debian-pgsql:~# tar xvf dellstore2-normal-1.0.tar.gz
Logado como postgres, crie sua nova base de dados atravs da ferramenta createdb dispon(vel no
diret+rio bin do banco instalado 15 adicionado ao PATH na se%o de instala%o2. 4rie o suporte
linguagem PLWpgSQL na base criada, mesmo que a gente no ven/a a precisar. I apenas para no
/aver nen/uma mensagem de erro na e?ecu%o do script 1se preferir apague a cria%o da fun%o PLW
pgSQL dentro do arquivo .sql, no ser necessria na nossa din[mica2. "epois e?ecute o psql para
e?ecutar o script.
3ota* Aeremos no cap(tulo K. !ac6ups que podem salvar seu emprego, mais
detal/es sobre a prtica de gera%o de dump scripts.

debian-pgsql:~/dellstore2-normal-1.0# su - postgres
postgres@debian-pgsql:~$ createdb dellstore
postgres@debian-pgsql:~$ createlang plpgsql dellstore
postgres@debian-pgsql:~$ psql dellstore < /root/dellstore2-
normal-1.0/dellstore2-normal-1.0.sql
Aamos aproveitar o momento para criar tambm as duas fun%'es pg^freespacemap na base de dados
recm criada.
$ psql dellstore <
/root/postgresql-8.4.2/contrib/pg_freespacemap/pg_freespacemap.sql
Fs duas fun%'es criadas possuem as seguintes assinaturas. 3a verdade uma fun%o com duas
sobrecargas, ou se5a, o nome da fun%o o mesmo, ele vai saber qual c/amar de acordo com os
par[metros que voc# passar.
pg_freespace(rel regclass IN, blkno OUT bigint, avail OUT int2)
9 par[metro de entrada rel o nome da tabela que queremos abrir seu arquivo de dados para
coletar pginas dispon(veis. 9s par[metros blkno e avail so campos de sa(da. 9 primeiro
101
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
retorna o n&mero identificador da pgina no arquivo, o segundo 5ustamente o valor do espa%o
dispon(vel.
pg_freespace(rel regclass IN, blkno bigint IN) returns int2
3a segunda verso, o blkno virou par[metro de entrada. Fssim, o resultado ser apenas o
montante dispon(vel naquela pgina.
4ontando com as fun%'es pg^freespacemap e algumas outras 5 dispon(veis por padro, vamos
tratar de col/er algumas informa%'es f(sicas sobre uma base de dados.
Primeiro vamos saber o taman/o do banco.
dellstore=# select pg_database_size('dellstore');
pg_database_size
------------------
21750052
(1 row)
dellstore=# select
pg_size_pretty(pg_database_size(current_database()));
pg_size_pretty
----------------
21 MB
(1 row)
Fcima, current^database12 retorna o nome da base conectada. Fcima, seria o mesmo que
colocarmos 'dellstore'. F fun%o pg^database^si0e12 nos informou o taman/o total do banco.
Gecuperamos o resultado arredondado pela fun%o pg^si0e^prett712, que recebe um n&mero e sai
dividindo por 8T@< at ac/ar a ordem de grande0a apro?imada que mel/or informa. Se voc# dividir
na mo ver que vai dar @T,M<. Se quiser o valor e?ato, no use pg^si0e^prett712. Aamos conferir se
isto mesmo que est arma0enado no disco.
dellstore=# select oid from pg_database where datname='dellstore';
oid
-------
16603
(1 row)
dellstore=# \q
postgres@debian-pgsql:~$ du -h /usr/local/pgsql/data/base/16603/
21M /usr/local/pgsql/data/base/16603/
Precisamos saber o 9N" da base para podermos consultar seu taman/o no disco. 9 comando du
1dis: usa.e2 nos informou esse taman/o. :ambm arredondou devido op%o -h.
Aamos consultar o catlogo para col/er os dados f(sicos das tabelas da nossa base. Lembre sempre
que catlogo precisa estar atuali0ado, atravs do comando F3FLYO), para voc# no ter
102
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
informa%'es desencontradas.
dellstore=# SELECT c.relfilenode, c.relname, c.reltuples,
c.relpages,
pg_size_pretty(pg_total_relation_size(c.relname::varchar)) total
FROM pg_class c inner join pg_namespace n on n.oid =
c.relnamespace WHERE c.relkind = 'r' and nspname = 'public';
relfilenode | relname | reltuples | relpages | total
-------------+------------+-----------+----------+---------
16610 | categories | 16 | 1 | 24 kB
16626 | inventory | 10000 | 50 | 616 kB
16640 | products | 10000 | 101 | 1408 kB
16644 | reorder | 0 | 0 | 0 bytes
16629 | orderlines | 60350 | 355 | 4200 kB
16614 | cust_hist | 60350 | 296 | 3472 kB
16619 | customers | 20000 | 476 | 4752 kB
16634 | orders | 12000 | 100 | 1288 kB
(8 rows)
Selecionamos o relfilenode para sabermos o nome do arquivo da tabela em disco 1como 5 foi
dito, no primeiro momento eles sero iguais ao 9N" da tabela2, relname 1nome2, reltupes
1n&mero de registros2, relpages 1n&mero de pginas de dados no arquivo da tabela2, e o taman/o
total da tabela no disco atravs da fun%o pg^total^relation^si0e12.
3ota* F fun%o pg^relation^si0e12 quem tra0 o taman/o da tabela,
pg^total^relation^si0e12 mede o taman/o da tabela, seus (ndices e tabelas
:9FS: agregados.
F consulta foi baseada no Z9N3 entre as tabelas pg^class 1onde esto todos os campos que lemos2 e
a tabela pg^namespace que tra0 os esquemas do nosso banco. :odo ob5eto em um banco
registrado em pg^class com o 9N" do esquema a que ele pertence. 3+s aqui s+ queremos ob5etos
cu5o nome do esquema 1nspname2 se5a public, cu5o tipo 1relkind2 se5a 'r' de relation
1tabela2, 't' seria tabela :9FS: e 'i' (ndice.
Aamos trabal/ar agora em cima da tabela customers, que apresentou o maior n&mero de pginas,
consequentemente um maior taman/o em disco. Ae5amos qual o espa%o livre por dentro das pginas
de dados desta tabela*
dellstore=# select * from pg_freespace('customers');
blkno | avail
-------+-------
0 | 64
1 | 64
2 | 64
3 | 64
103
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
... | ...
250 | 128
251 | 0
252 | 128
253 | 160
... | ...
472 | 160
473 | 160
474 | 128
475 | 0
4ada pgina de dados recebeu um n&mero identificador blkno, iniciando do 0ero. 3a grande
maioria delas /ouve algum espa%o livre que no foi preenc/ido. $as voc# viu que a &ltima pgina
est 0erada- !om, talve0 at ela estela completamente preenc/ida, mas o que voc# pode ver
enquanto o mapa FS$ no atuali0ado com dados desta &ltima pgina.
Para mostrar mostrar o que de fato ocorre, vou recuperar esse comando em um arquivo, adicionar
um novo cliente 1)ustomer2 na tabela e reali0ar a consulta novamente para poder comparar os
resultados.
Primeiro passo* Salvando o resultado da consulta em arquivo.
9 nosso amigo psql vai nos a5udar. I poss(vel c/amar o psql apenas para e?ecutar um comando,
sem a necessidade de entrar nele. Ae5a*
$ psql -c "select * from pg_freespace('customers')" dellstore >
customers_freespace1.txt
Fproveitamos e direcionamos a sa(da para o arquivo customers^freespace8.t?t.
Fgora vou inserir um novo registro 1aqui, vou mostrar por dentro do psql, mas seria poss(vel seguir
o formato usado acima2*
dellstore=# INSERT INTO customers (firstname, lastname, address1,
city, country, region, creditcardtype, creditcard,
creditcardexpiration, username, password) values
('Jose', 'Berardo', 'Rua Tal', 'Recife', 'Brasil', 1, 1, '1234',
'022010', 'berardo' || currval('customers_customerid_seq'), '123');
INSERT 0 1
:ivemos a resposta de que o registro foi inserido. Aamos repetir a consulta s pginas va0ias de
customers.
$ psql -c "select * from pg_freespace('customers')" dellstore >
customers_freespace2.txt
Nmportei o resultado em uma planil/a para facilitar a busca por modifica%'es e pude constatar que
nada /avia acontecido. 4omo pode- Seria poss(vel o dado ainda estar apenas em logs de transa%o
CFL- Sim, seria. )nto tratemos de reali0ar o c/ec6point.
livro=# CHECKPOINT ;
104
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
CHECKPOINT
Gepita a gera%o da prova dos L ve5a que ... o que- 3ada mudou- 4omo assim-
Se voc# repetir o comando l de antes que recupera o taman/o de cada tabela, vai poder ver que
nada mudou tambm por l. 9 banco 5 tin/a V b7tes, adicionei mais alguns, me certifiquei de que
eles de fato esto onde deveriam estar 1c/ec6point2 mas o comando que di0 o taman/o da tabela e a
consulta aos espa%os livres nas pginas de dados retornaram as mesmas informa%'es de antes.
!om, preciso l/e di0er que realmente o PostgreSQL possui poderes paranormais. "e fato, esta
informa%o foi gravada no limbo, numa dimenso muito distante ...
)squece esse papo a(. Aamos c/amar $ister $.
9 problema foi que o mapa ainda no foi atuali0ado. Lembra como atuali0Jlo. L vai*
dellstore=# VACUUM VERBOSE ANALYZE customers ;
INFO: vacuuming "public.customers"
INFO: index "customers_pkey" now contains 20001 row versions in 46
pages
DETAIL: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.03 sec.
INFO: index "ix_cust_username" now contains 20001 row versions in
68 pages
DETAIL: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.01s/0.00u sec elapsed 0.03 sec.
INFO: "customers": found 0 removable, 1326 nonremovable row
versions in 31 out of 476 pages
DETAIL: 0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
0 pages are entirely empty.
CPU 0.02s/0.00u sec elapsed 0.12 sec.
INFO: vacuuming "pg_toast.pg_toast_16619"
INFO: index "pg_toast_16619_index" now contains 0 row versions in
1 pages
DETAIL: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: "pg_toast_16619": found 0 removable, 0 nonremovable row
versions in 0 out of 0 pages
DETAIL: 0 dead row versions cannot be removed yet.
105
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
There were 0 unused item pointers.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: analyzing "public.customers"
INFO: "customers": scanned 476 of 476 pages, containing 20001 live
rows and 0 dead rows; 20001 rows in sample, 20001 estimated total
rows
VACUUM
9 AF4BB$, clarob 9 F3FLYO) foi s+ para atuali0ar o catlogo caso /a5a ocorra uma nova
pgina de dados. 4omo no /ouve 1saber(amos na consulta aos espa%os livres se ela tivesse sido
criada2, o F3FLYO) nem foi necessrio. Aoc# poderia sobreviver aqui sem ele.
9 A)G!9S) foi legal apenas para aumentar o taman/o do livro e tornJlo o cal%o ideal para o p
da sua mesa. ) tambm para voc# poder conferir o que foi destacado em negrito. 3o final, em
itlico, destaquei o resultado do F3FLYO).
Ae5a que ele informa que /ouve a inser%o de um novo registro 1a tabela custumers original do
dellstore tra0 @T mil clientes cadastrados2. 3o /ouve ")L):)s ou BP"F:)s e / <MK
pginas no arquivo de dados da tabela e <K na do (ndice da c/ave primria customerid.
:ire a prova dos nove e ve5a que /aver mais de HXb dispon(veis na &ltima pgina, mesmo ap+s
esta inser%o. L onde o resultado /avia sido 0ero, agora / uma informa%o atuali0ada.
Nnsira mais um registro e ve5a que nada vai mudar com rela%o ao resultado atual, mas agora voc# 5
sabe que apenas uma desatuali0a%o do mapa FS$. Seria ineficiente atuali0ar em qualquer
modifica%o do conte&do das pginas, mel/or que ele registre em um buffer de mem+ria
compartil/ada a &ltima pgina que trabal/ou e saia preenc/endo ela.
3ota* )ste comportamento devido c/amada interna fun%o
Gelationet!ufferFor:uple12, por !ruce $om5ian. )la pode ser vista nos
fontes em /src/backend/access/heap/hio.c.
Se voc# inserir um volume suficiente para acabar os HXb restantes na &ltima pgina de dados,
perceber que o resultado da consulta fun%o pg^freespace1dcustomersd2 ser atuali0ado
automaticamente.
:entei seguir essa lin/a de racioc(nio, mas no atentei para o fato de que o AF4BB$ reali0ado
apagou o buffer que informava a pgina. Por isso, no N3S)G: posterior, o servidor procurou por
outra pgina e encontrou em uma posi%o anterior.
Sa( inserindo registros como um louco da seguinte maneira*
dellstore=# INSERT INTO customers (firstname, lastname, address1,
city, country, region, creditcardtype, creditcard,
creditcardexpiration, username, password) values
('Jose', 'Berardo', 'Rua Tal', 'Recife', 'Brasil', 1, 1, '1234',
'022010', 'berardo' || currval('customers_customerid_seq'), '123');
INSERT 0 1
F fun%o currval() retornou o valor atual da sequ#ncia customers_customerid_seq,
usada na c/ave primria customerid. Precisei fa0er isso devido apenas a uma restri%o de
106
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
unicidade que / no campo username.
Pude constatar em uma nova consulta aos espa%os livres que pginas pelo meio do arquivo foram
preenc/idas com meus novos registros. 9 que prova que o mapa FS$ tambm atuali0ado quando
uma pgina 5 no tem espa%o suficiente. Prova tambm que o servidor, no podendo mais trabal/ar
com a pgina atual 15 no / espa%o suficiente nela2, sai em busca de outra. 9l/a que interessante
ficou min/a tabela*
dellstore=# select customerid, username from customers;
L pelo meio, ocorreram curiosidades como estas 1meus novos registros se misturaram com os 5
inseridos no momento da importa%o do dump2*
11238 | user11238
20035 | berardo20035
11239 | user11239
Fgora, imagine isso em um servidor com registros de taman/os variados, com atuali0a%'es e
dele%'es. Percebeu como importante o mapeamento de pginas va0ias-
Gesumo da +pera. 3ossa prtica serviu para fi?ar mel/or o comportamento do servidor no disco e
perceber a ast&cia do servidor que precisa se preocupar com o desempen/o a todo instante. )spero
ter conseguido.
$uito do que foi dito aqui pode ter parecido que cavamos mais do que o necessrio. 3o entanto, os
dados arma0enados por um S!" relacional, no bai?o n(vel, no so tabelas, so arquivos.
Frquivos so lineares, seriais, no podem ser lidos sob a +tica bidimensional de uma tabela. F
proposta foi mostrar como o servidor do PostgreSQL lida com isso enquanto n+s meros mortais
apenas continuamos c/amando os dados de registros em tabelas.
Que tal dissecar as pginas de dados-
Z que a idia cavar, v busca seu microsc+pio eletranico que precisamos analisar a estrutura do
tomo do PostgreSQL, as pginas de dados. Fqui, eu no teria como ir alm do manual oficial, se
for esta sua inten%o, recomendo a leitura de sua se%o =H.= "atabase Page La7out, dispon(vel no
endere%o* /ttp*WWDDD.postgresql.orgWdocsW;.<WinteractiveWstorageJpageJla7out./tml.
Outros diretrios
Aamos tratar aqui dos demais diret+rios que comp'em o database cluster gerado pelo initdb.
J "iret+rio global*
"iret+rio que contm arquivos de dados de tabelas presentes em todos os bancos de dados como*
pg^pltemplate, pg^tablespace, pg^s/depend, pg^aut/id, pg^aut/^members, pg_dt!se,
pg^s/description, e seus (ndices. :odas elas pertencentes ao esquema pg^catalog. Flm de alguns
arquivos :9FS:, au?iliares dessas tabelas, pertencentes ao esquema pg^toast, e os correspondentes
arquivos for:s _fsm para todos esses ob5etos e _vm para as tabelas.
> ainda tr#s arquivos especiais nesse diret+rio* pg_database , pg_auth , pg_control .
9 pg^database um simples documento de te?to contendo as bases de dados 5 criadas, no nosso
caso at o momento*
"template1" 1 1663 648
107
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
"template0" 11563 1663 648
"postgres" 11564 1663 648
"livro" 16402 1663 648
"dellstore" 16603 1663 648
9 arquivo pg^control tra0 alguns par[metros de configura%o gerados pelo initb e outras
informa%'es din[micas. Para verificar seu conte&do, e?ecute o comando pg_controldata*
$ pg_controldata
pg_control version number: 843
Catalog version number: 200904091
Database system identifier: 5436792753863483252
Database cluster state: in production
pg_control last modified: Sb 13 Fev 2010 23:01:17 BRT
Latest checkpoint location: 0/40CB5FC
Prior checkpoint location: 0/40CB5B8
Latest checkpoint's REDO location: 0/40CB5FC
Latest checkpoint's TimeLineID: 1
Latest checkpoint's NextXID: 0/1445
Latest checkpoint's NextOID: 24910
Latest checkpoint's NextMultiXactId: 1
Latest checkpoint's NextMultiOffset: 0
Time of latest checkpoint: Sb 13 Fev 2010 23:01:17 BRT
Minimum recovery ending location: 0/0
Maximum data alignment: 4
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 64
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 2000
Date/time type storage: 64-bit integers
Float4 argument passing: by value
Float8 argument passing: by reference
F maioria das informa%'es acima &til para o processo bgDriter que tem a responsabilidade de ler
os segmentos CFL e reali0ar o c/ec6point que 5 citamos aqui. Aoltaremos ao assunto no cap(tulo
<. :ransa%'es e Crite F/ead Logging.
108
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
3ota* Ft o PostgreSQL ;.H, /avia um arquivo c/amado pgstat.stat,
onde o processo stats )olle)tor arma0enava temporariamente a coleta para
monitoria das atividades do servidor. )m ambientes com muitas bases de
dados e muitas tabelas, esse arquivo tendia a crescer, e o e?cesso de entradaW
sa(da de dados nesse arquivo poderia comprometer o desempen/o. 3o
PostgreSQL ;.<, o arquivo no morreu, mas / um novo par[metro para o
postgresql.conf c/amado stats_temp_directory onde poss(vel
definir um novo local para ele. Fssim, poderemos definir um diret+rio em
outra controladora de disco, ou mel/or ainda, por se tratar de um arquivo
temporrio, poderemos montar um sistema de arquivos em mem+ria e evitar
completamente o acesso ao disco. Aeremos esta tcnica no cap(tulo ;.
:uning.
J "iret+rios pg_clog , pg_multixact, pg_subtrans, pg_xlog. 9 primeiro onde so
registrados os status de efetiva%'es de todas as transa%'es, o segundo onde so registrados os
status de transa%'es que precisem de loc6 de ob5etos, o terceiro onde se registram os status de
subtransa%'es 5 o terceiro onde so gravados os logs de transa%'es. So esses logs que uma ve0
gravados liberam o 49$$N: da transa%o. Fmbos os diret+rios sero e?plorados no cap(tulo <.
:ransa%'es e Crite F/ead Logging e o pg_xlog trataremos ainda na se%'es sobre Point in :ime
Gecover7 e Carm Standb7 no cap(tulo K. !ac6ups.
J "iret+rio pg_stats_tmp. Local para onde o arquivo pgstat-stat foi movido por padro.
4omo 5 foi dito, agora poss(vel modificar a locali0a%o desse arquivo no postgresql.conf.
J "iret+rio pg_tblspc. "iret+rio contendo lin6s simb+licos para todos os tablespaces criados no
cluster. :rataremos de tablespaces ainda neste cap(tulo.
J "iret+rio pg_twophase. "iret+rio reservado a informa%'es sobre transa%'es preparadas
1prepared transactions2 em rotinas con/ecidas como tDoJp/ase commit.
Arquivos de configurao do cluster
9s arquivos de configura%o do cluster so to importantes que mereceram cap(tulos ou se%'es a
parte. 4onfira*
postgres@debian-pgsql:/usr/local/pgsql/data$ ll | grep ^-
-rw------- 1 postgres postgres 3652 Fev 10 22:32 pg_hba.conf
-rw------- 1 postgres postgres 1631 Fev 10 22:32 pg_ident.conf
-rw------- 1 postgres postgres 4 Fev 10 22:32 PG_VERSION
-rw------- 1 postgres postgres 16819 Fev 10 22:32 postgresql.conf
-rw------- 1 postgres postgres 30 Fev 13 14:23 postmaster.opts
-rw------- 1 postgres postgres 47 Fev 13 14:23 postmaster.pid
9 principal arquivo de todo o cluster , como voc# 5 deve imaginar, o arquivo
postgresql.conf. 9 pr+?imo cap(tulo inteiramente dedicado a ele e, durante todo o material,
ele sempre ser citado por tra0er as principais configura%'es do servidor.
9s arquivos pg_hba.conf e pg_ident.conf so carregados em mem+ria no start do servidor
e utili0ados sempre que uma nova cone?o for estabelecida.
109
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
9 arquivo PG_VERSION tra0 apenas o n&mero da verso do cluster. 9 arquivo
postmaster.opts tambm simples te?to, mas atuali0ado a cada rein(cio do servidor com as
op%'es utili0adas para iniciJlo. Por fim, postmaster.pid criado para indicar que o servi%o
est ativo, ele tra0 5ustamente o identificador do processo no sistema operacional.
1.2.2 Encoding e localizao
:abelas de encoding, tambm con/ecidas como c/arsets 1con5untos de caracteres2, so o mecanismo
pelo qual os sistemas computacionais recon/ecem uma sequ#ncia de bits como sendo um caractere.
Provavelmente, voc# 5 ouviu falar na tabela FS4NN. F Fmerican Standard 4ode for Nnformation
Nnterc/ange 1FS4NN2 foi uma tabela originria nos idos do telgrafo, posteriormente registrada no
instituto americano F3SN, que consistia em um con5unto de M bits onde cada combina%o deles
representava um &nico caractere.
Fssim, um n&mero da combina%o seria a letra F 1no caso , K=2, outro a letra ! 1KK2 e assim por
diante.
Foram catalogados primeiramente H@ caracteres 1do T ao H82, considerados como caracteres de
comando para dispositivos como monitores e impressoras. Por e?emplo, o n&mero 8T 1o binrio
TTT8T8T2 foi reservado ao comando line feed 1LF2 para quebra de lin/a, ou se5a, ao imprimir
determinado te?to, se a impressora se deparasse com este n&mero, ela iria partir para escrever o
conte&do subsequente em uma pr+?ima lin/a. F maior parte desse caracteres est obsoleta /o5e.
Flguns so curiosos como o caractere M, o !ell 4/aracter. )le informava que o dispositivo deveria
soar um beep ao interpretJlo. !ell significa sino, mas tambm o nome da empresa me da tabela
FS4NN.
9s demais caracteres foram catalogados nos n&meros superiores. Fgora note que, se a tabela era
montada em apenas M bits, s+ /avia 8@; combina%'es poss(veis para os caracteres, dessas, H@ 5 no
poderiam ser utili0adas. "esta maneira, nossos acentos e demais caracteres latinos ficaram de fora.
Fs tabelas de caracteres NS9J;;=LJ8 1con/ecida tambm como Latin8 ou Cestern )uropean2 e
CindoDsJ8@=@ so montadas sobre ; bits respeitando 1como a maioria das tabelas de encoding2 os
valores dos primeiros M bits de acordo com a tabela FS4NN. )las so comumente usadas no oeste
europeu e Fmrica Latina. Possuem alguns caracteres divergentes, mas em geral so
intercambiveis. 4om ; bits, poss(vel /aver @=K combina%'es, o que 5 permite contemplar nossos
caracteres acentuados.
3o fim dos anos ;T, esfor%os da Vero? e da Fpple criaram a tabela Bnicode. )la tem a inten%o de
representar todos os caracteres do mundo 1perceba que @=K suficiente pra gente, mas e para um
4/in#s-2. Para isto, inicialmente se baseou em 8K bits. 9 que d =K=HK combina%'es poss(veis.
: ac/ando muito, saiba que a verso atual 1=.T2 da tabela possui mais de 8TT mil caracteres
catalogados e montada em H@ bits, o que d mais de < bil/'es de caracteres poss(veis. !om,
enquanto n+s no formos invadidos por alien(genas, este taman/o deve dar de sobra por muito
tempo.
Fcontece que a tabela Bnicode inc/a qualquer base de dados. 9ra, se eu posso arma0enar uma letra
F em apenas um b7te, usando uma tabela como a Latin8, por que eu /averia de trocar por uma
tabela que precisa de < b7tes como a Bnicode. )u vou fatalmente multiplicar o espa%o arma0enado
por <.
Pensando nisso, o Bnicode 4onsortium definiu alguns padr'es de adapta%o da tabela. So os
110
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
modelos B:F 1Bnicode :ransfer Format2. 9 modelo B:FJH@ representa a tabela Bnicode em sua
ess#ncia, ou se5a, H@ bits para cada caractere. Z o modelo B:FJ8K e o mais popular deles B:FJ;
so tabelas multib7te.
9 B:FJ; funciona reservando os 8@; primeiros n&meros 1M primeiros bits2 para os mesmos
caracteres da tabela FS4NN. 9 oitavo bit s+ utili0ado em con5unto com pelo menos mais um b7te
para 5untos formarem o caractere dese5ado. "ependendo do caractere, poss(vel o padro B:FJ;
c/egar a precisar de todos os H@ bits 1< b7tes2, mas nossos acentos sempre ocupam apenas @ b7tes.
Se um dia voc# receber um email ou for ler algum te?to que no lugar dos acentos aparecerem outras
coisas, preste aten%o se no so no um mas dois caracteres estran/os para cada caractere
acentuado que surgem tela. 3este caso, saiba que o que ocorreu foi que algum gerou o te?to em
B:FJ; e voc# o est lendo atravs de alguma ferramenta que use tabelas de ; bits como a Latin8.
Perceba como o B:FJ; consegue aliar a capacidade de representar todos os caracteres catalogados
na Bnicode com a fle?ibilidade certa para no inc/ar seu banco com b7tes desnecessrios. I por
isso que muitos sistemas operacionais trabal/am com B:FJ; como tabela padro.
Z o padro B:FJ8K semel/ante, mas 5 ocupa pelo menos 8K bits.
)ncoding realmente um problema bastante comum na administra%o de bancos de dados. 3o
raro situa%'es onde / dois aplicativos, possivelmente escritos em linguagens de programa%o
diferentes, acessando uma mesma base, mas trabal/ando por padro com c/arsets distintos. 3a
maioria dos casos, a recomenda%o mesmo trabal/ar com B:FJ; e tentar a5ustar um dos dois
aplicativos para que a recon/e%a.
3ota* 9 P>P, por e?emplo, uma linguagem que sempre optou pelo uso da
tabela Latin8, no entanto, est definido que em sua pr+?ima verso 1P>P
K.T2, toda a linguagem ser portada para Bnicode, o que certamente vai
trabal/ar com B:FJ; na /ora de manipular arquivos e streams, assim com
se fa0 em Zava. )nquanto o P>P K.T no vem, / muito se encontram
dispon(veis comandos de converso de Strings de e para Bnicode e no de
/o5e que ele suporta as bibliotecas 4 mbstrin. e i)onv para manipula%'es de
strings multib7te 1como recupera%o do taman/o e?ato do te?to2 e
transforma%o de tabela, respectivamente.
Quanto c/amada locali0a%o 1locali0ation ou mais con/ecida como l8Tn em aluso s 8T letras
que e?istem entre o L e o 3 na palavra2, o con5unto de formata%'es de valores que variam de
acordo com a regio geogrfica. Fs categorias mais con/ecidas de regionali0a%'es so os n&meros
1L4^3B$)GN42 e principalmente a mscara de datas e /oras 1L4^:N$)2.
3o !rasil, e?pressamos datas como @<WT@W@TTK, na Fleman/a, a mscara normalmente
@<.T@.@TTK, nos )stados Bnidos, em geral ser T@W@<W@TTK. 9 mesmo vale para formata%'es de
n&meros, 5 que usamos a v(rgula onde os americanos usam ponto e viceJversa.
3ota* 9 mesmo fi0eram com o termo internacionali0a%o, ou se5a,
internationali0ation, comumente con/ecida como i8;n.
Nnternacionali0a%o o esfor%o dos programas em recon/ecer o idioma e as
caracter(sticas regionais 1l8Tn2 do usurio para apresentar as informa%'es do
5eito que esto nativamente acostumados. Portanto a l8Tn est intimamente
relacionada i8;n e os c/arsets tem tudo a ver com isso uma ve0 que as
tabelas devem ser capa0es de representar os caracteres usados no idioma dos
usurios.
111
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Problemas com o Debian / Ubuntu
"istribui%'es que seguem a lin/a do "ebian 1 o caso do Bbuntu2 unem encoding ao locale e no
poss(vel criar um banco com qualquer um dos dois diferente do padro. Ae5a a tentativa de criar
uma nova base com um encoding diferente do padro*
postgres=# CREATE DATABASE latina encoding='ISO-8859-1';
ERROR: encoding LATIN1 does not match locale pt_BR.UTF-8
DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.
STATEMENT: CREATE DATABASE latina encoding='ISO-8859-1';
ERROR: encoding LATIN1 does not match locale pt_BR.UTF-8
DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.
9 e?emplo acima tentou fa0er algo bem comum entre desenvolvedores brasileiros, criar uma nova
base de dados pronta para arma0enar te?tos utili0ando a tabela Latin8. 3o entanto, no "ebian e seus
derivados, o encoding padro o B:FJ;.
3ota* > um esfor%o coletivo para promover o padro B:FJ; ubiquidade.
Ndiomas e costumes diferentes ao redor do mundo so barreiras /ist+ricas
plena comunica%o. 9 padro de encoding acabou se tornando um elemento
p+sJNnternet que s+ veio complicar ainda mais. Se no / como todos
falarem o mesmo idioma e as diferen%as regionais serem embasadas na
rique0a cultural de cada na%o, pelo menos n+s nerds que no dever(amos
ter criado mais um elemento capa0 de piorar essa babel.
Fgora confira a tentativa de criar uma base com um locale diferente do padro*
postgres=# CREATE DATABASE latina lc_collate='pt_BR';
ERROR: invalid locale name pt_BR
STATEMENT: CREATE DATABASE latina lc_collate='pt_BR';
ERROR: invalid locale name pt_BR
9 primeiro problema 1no conseguimos trocar o encoding2 acusou um erro de locale. 9 que tem a
ver o buraco da ot(lia com as cal%as- I e?atamente isso que fa0 o "ebian e sua prole, une locale
com encoding. Fssim, o locale padro est preso ao encoding B:FJ;.
Z no segundo problema, logo acima, tentamos criar uma base com um locale no dispon(vel no
sistema operacional. Precisamos /abilitJlo. 9 fato que o locale padro at 5 o pt^!G caso voc#
ten/a optado por ele no ato de instala%o, mas ele se c/ama pt^!G.B:FJ;. 3o e?iste aqui um
locale c/amado pt^!G.
Para listar o locale padro do sistema e?ecute o comando locale.
$ locale
LANG=pt_BR.UTF-8
LANGUAGE=pt_BR:pt:en
LC_CTYPE="pt_BR.UTF-8"
LC_NUMERIC="pt_BR.UTF-8"
LC_TIME="pt_BR.UTF-8"
112
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY="pt_BR.UTF-8"
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER="pt_BR.UTF-8"
LC_NAME="pt_BR.UTF-8"
LC_ADDRESS="pt_BR.UTF-8"
LC_TELEPHONE="pt_BR.UTF-8"
LC_MEASUREMENT="pt_BR.UTF-8"
LC_IDENTIFICATION="pt_BR.UTF-8"
LC_ALL=
Fssim, voc# ainda con/ece as diversas caracter(sticas regionais onde as configura%'es regionais
fa0em diferen%a. )las vo alm das categorias dispon(veis no PostgreSQL.
Contornando o problema no Debian
Para adicionar o suporte a outro encoding, precisamos configurar um novo locale. Para isso, e?ecute
o comando 1como root2*
# dpkg-reconfigure locales
Ser apresentada uma tela como esta*
69 )scol/a de novas locales
3ela, voc# dever escol/er qual1is2 locale1s2 voc# pretende /abilitar. F lista a( algo realmente bem
abrangente e no nos caberia tratar aqui o caso de uma locale ausente na lista. 3a pr+?ima tela, voc#
113
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
vai configurar a locale padro de todo o sistema. $esmo tendo instalado a locale pt^!G que
trabal/a com o encoding Latin8, vamos manter a do B:FJ; como padro.
70 9p%o da locale padro
Fs locales listadas no comando anterior esto presentes no arquivo /etc/locale.gen. Se
preferir, v at o arquivo retirar o comentrio da locale que dese5a /abilitar e e?ecute o comando
locale-gen para configurar a locale.
Ser necessrio reiniciar o sistema, por isso a necessidade de falar disso aqui nos primeiros passos.
Sistemas em produ%o, sobretudo com contrato de alta disponibilidade no podem ser reiniciados
por qualquer coisa.
Contornando o problema no Ubuntu
Aoc# no vai acreditarb 3o Bbuntu este processo um pouco mais complicado. Fntes de rodar o
comando, voc# precisar editar o arquivo /var/lib/locales/supported.d/local e
adicionar na mo a mesma locale tratada antes. Seu arquivo dever ser como este*
pt_BR ISO-8859-1
pt_BR.UTF-8 UTF-8
en_US.UTF-8 UTF-8
Fqui, estamos /abilitando tambm o locale en_US.UTF-8, o padro americano para os fil/os do
"ebian.
Fgora sim e?ecute o mesmo comando.
$ sudo dpkg-reconfigure locales
Generating locales...
114
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
en_US.UTF-8... up-to-date
pt_BR.ISO-8859-1... done
pt_BR.UTF-8... up-to-date
pt_PT.UTF-8... up-to-date
Generation complete.
Se apareceram outros locales em sua lista, por causa de outros dois poss(veis arquivos no mesmo
diret+rio do nosso local. So eles pt e en. )les podem tra0er novos locales, para desabilitJlos
comente suas lin/as adicionando cerquil/as 1#2 no in(cio de cada lin/a.
Se quiser trocar o locale padro do sistema, mesmo que isto no se5a decisivo para o funcionamento
do nosso banco, edite o arquivo /etc/default/locale que dever conter as seguintes lin/as*
LANG="pt_BR.UTF-8"
LANGUAGE="pt_BR:pt:en"
)m LANG, escreva o nome do locale do 5eito que instalou. LANGUAGE recebe uma lista separada
por dois pontos de nomes de idiomas, em geral o prefi?o do nome do locale.
3o Bbuntu, tambm necessrio reiniciar o sistema para que as altera%'es entrem em vigor.
Escolha de locales no initdb e no CREATE DATABASE
4omo dito bem no in(cio desta se%o, o comando initdb admite par[metros para defini%o do
encoding e do locale padro do cluster.
$ initdb --encoding=iso-8859-1 --locale=pt_BR novolocale
9 comando acima cria um novo cluster sob o diret+rio novolocale.
Bma ve0 iniciado este novo servi%o, podemos conectJlo, criar uma nova base da maneira de
sempre e visuali0ar o resultado.
postgres=# CREATE DATABASE livro;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access ...
-----------+----------+----------+-----------+-------+-----------
livro | postgres | LATIN1 | pt_BR | pt_BR |
postgres | postgres | LATIN1 | pt_BR | pt_BR |
template0 | postgres | LATIN1 | pt_BR | pt_BR | ...
template1 | postgres | LATIN1 | pt_BR | pt_BR | ...
:
(4 rows)
$esmo com o sistema por padro trabal/ando com B:FJ;, criamos uma inst[ncia onde as coisas
so por padro LF:N38. Que sacrilgiob
115
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Poder(amos querer alguma configura%o mais e?+tica definindo locales diferentes para cada uma
das seguites op%'es*
IV. Tabela Opes especficas de categorias de locales
Opo Descrio
LC_COLLATE
9rdena%o de strings de acordo com o alfabeto da regio
LC_CTYPE
9 que classificar como letra de acordo com o alfabeto da regio e quem
mai&sculo ou min&sculo de quem
LC_MESSAGES
Ndioma das mensagens do sistema
LC_MONETARY
Formata%o de moedas
LC_NUMERIC
Formata%o de n&meros. Ffeta os caracteres delimitadores de decimais e
casas de mil/ar
LC_TIME
Formata%o padro de datas e /oras
4omo e?emplo, vamos recriar o novo cluster especificando que o alfabeto do sistema ser o do
ingl#s.
$ locale -a
C
POSIX
pt_BR
pt_BR.iso88591
pt_BR.utf8
$ initdb --encoding=iso-8859-1 --locale=pt_BR --lc-ctype=C
novolocale
The files belonging to this database system will be owned by user
"postgres".
This user must also own the server process.
The database cluster will be initialized with locales
COLLATE: pt_BR
CTYPE: C
MESSAGES: pt_BR
MONETARY: pt_BR
NUMERIC: pt_BR
TIME: pt_BR
The default text search configuration will be set to "english".
...
116
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
9 comando locale -a listou todos os locales dispon(veis em meu sistema operacional. 4omo
no /avia en, mas /avia C 1que padro americano2, optei por ela. 4omo nossa configura%o
definiu alguma categoria de regionali0a%o diferente das demais, a sa(da do initdb nos apresentou
um resumo das categorias. Fs demais lin/as seguem a e?ecu%o normal do comando.
Fo criar uma nova base de dados, a princ(pio no ser poss(vel bater de frente com as informa%'es
de locale 1lc^collate2 encoding e da subcategoria do locale ct7pe.
postgres=# CREATE DATABASE latina encoding='ISO-8859-1'
lc_collate='pt_BR';
ERROR: encoding LATIN1 does not match locale pt_BR.UTF-8
DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.
STATEMENT: CREATE DATABASE latina encoding='ISO-8859-1'
lc_collate='pt_BR';
postgres=# CREATE DATABASE latina encoding='ISO-8859-1'
lc_collate='pt_BR' lc_ctype='pt_BR';
ERROR: new encoding (LATIN1) is incompatible with the encoding of
the template database (UTF8)
HINT: Use the same encoding as in the template database, or use
template0 as template.
STATEMENT: CREATE DATABASE latina encoding='ISO-8859-1'
lc_collate='pt_BR' lc_ctype='pt_BR';
Fo e?ecutar os dois comandos acima, estamos assumindo que estamos em um cluster que seguiu o
padro de regionali0a%o e encoding. 9 erro da primeira instru%o foi gerado por e?ecutarmos um
comando que foge do padro no encoding e no lc_collate, no entanto o lc_ctype no foi
informado, o que o vai fa0er seguir a categoria L4^4:YP) padro do sistema operacional, que vai
trabal/ar com um encoding conflitante com o informado.
I poss(vel fugir do encoding padro, desde que /a5a algum locale registrado vinculado ao encoding
dese5ado ou sua distribui%o no vincule as duas coisas. Para isso necessrio e?ecutar o comando
com a op%o de template como templateT e no template8 como sempre sugere o bac6end.
postgres=# CREATE DATABASE latina encoding='ISO-8859-1'
lc_collate='pt_BR' lc_ctype='pt_BR' template template0;
CREATE DATABASE
3ota* :emplate8 a base de dados principal do cluster. Possui inclusive o
9N" 8. )la por padro usada como template para cria%o das novas bases
de dados. Fssim, o que e?istir previamente nela, ser copiado para a nova
base a cada 4G)F:) "F:F!FS). )?iste outra base template, c/amada
templateT que serve de bac6up da primeira. 9u se5a, voc# at pode criar
coisas na template8, mas no se recomenda me?er em nada no interior de
templateT.
117
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1.3 Opes de inicializao
I importante con/ecer alguns par[metros de iniciali0a%o que podem sobrepor o definido na
instala%o e presentes nos arquivos de controle como o postgresql.conf.
1.3.1 Inicializao via postgres
Z dissemos que o e?ecutvel postgres quem de fato inicia o aplicativo do servidor de bancos de
dados. Fgora / pouco, c/egamos a criar um outro cluster 1e?cutamos o initdb apontando para
outro diret+rio2, poss(vel iniciar mais de uma inst[ncia do servidor. )ntretanto, necessrio
atentar para dois detal/es. 9 primeiro que no poss(vel /aver duas inst[ncias em e?ecu%o que
apontem para o mesmo cluster. 9 segundo que cada inst[ncia dever rodar em uma porta
diferente, mas este segundo assunto vamos dei?ar para o pr+?imo cap(tulo.
F tabela abai?o mostra diversos par[metros que nos podem ser &teis em alguma situa%o. :entei ser
mais breve, colocando apenas as op%'es que considero mais usuais, para a lista completa, consulte o
guia de refer#ncia do comando na documenta%o oficial.
V. Tabela Opes para o postgres
Opo Descrio
9p%'es gerais e de comportamento
-D
"efine o camin/o para o cluster de onde se deve levantar a inst[ncia do
servidor. 3o sendo informado, vale o valor da varivel de ambiente
PGDATA.
-d 1 a 5
"efine o n(vel de debug. Quanto maior for o valor passado 1= o m?imo2,
mais informa%'es o servidor envia para mecanismo de registro de logs.
-F
"esabilita a e?ecu%o fs7nc no commit de uma transa%o. Fpesar de ser um
mtodo no recomendado em ambientes que no tolerem perdas de dados no
caso de queda do sistema, ligar esta op%o em uma inst[ncia, deve aumentar
o desempen/o da aplica%o
@
. Pode ser utili0ado em testes. Se /ouver
aumento considervel de desempen/o, deveJse estudar novamente as
consultas das transa%'es mais cr(ticas e podeJse at c/egar ao caso de
verificar a disponibilidade de uma troca para uma controladora de disco mais
eficiente.
9p%'es de cone?'es
-h nome
"efine o nome do /ost ou endere%o de NP pelo qual o servidor vai receber
cone?'es. Sobrep'e o par[metro do postgresql.conf listen_address que
ser visto no pr+?imo cap(tulo.
-i
:ambm tem a ver com o listen_address. Bsar este par[metro equivale
ao valor f 1todos2 nesta diretiva.
-p
"efine a porta onde o servidor dever esperar as cone?'es. $uito &til para
levantar uma segunda inst[ncia na mesma mquina. Sobrep'e a diretiva
2 Compartilho da opinio de Fbio Telles (http://www.midstorm.org/~telles), um dos mais destacados colaboradores
da comunidade PostgreSQL no Brasil onde ele diz: No troque segurana por desempenho. Em geral, ganhos de
desempenho no valem a pena se o custo for a diminuio da robustez do seu servidor.
118
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
port do postgresql.conf.
-N
Par[metro que sobrep'e a diretiva de configura%o do postgresql.conf
max_connections. )specifica qual o n&mero m?imo de cone?'es
simult[neas que o servidor aceitar.
-l
Par[metro que /abilita cone?'es seguras. 4onfira nas se%'es sobre instala%o
que necessrio que o servidor ten/a sido compilado com suporte camada
SSL 1Se)urity So):et Layer2 ou, como con/ecido atualmente :LS 14ransport
Layer Se)urity2.
-k diretrio
Aeremos no cap(tulo H. Futentica%'es e permiss'es que as cone?'es podem
partir do c/amado camin/o local, que no significa necessariamente 1embora
geralmente2 que so cone?'es requisitadas pela mquina local, mas que
utili0em (ni1 Domain So):ets em ve0 da rede :4PWNP. )ste par[metro
especifica o diret+rio onde esto os arquivos uni1 domain. )m geral, vale o /
tmp.
9p%'es de consumo de recursos
-B buffers
"efine o taman/o do buffer cac/e. gtil quando no queremos alterar o
shared_buffers do postgresql.conf e dese5amos fa0er algum teste de
consumo de mem+ria com um valor diferente do disposto l.
-S
Par[metro que sobrep'e a diretiva de configura%o do postgresql.conf
work_mem. Sua letra S em aluso ao nome antigo deste par[metro que era
sort^mem. "etermina o taman/o de mem+ria utili0ada em processos como a
organi0a%o de registros em consultas. "evido ao fato desta rea mem+ria
no estar limitada a essa opera%o, o nome do par[metro mudou.
Fo e?ecutar o comando postgres, o terminal ficar preso e?ecu%o. :eclar ctrl+c libera o
console, mas obviamente, derruba o servi%o levantado por este comando.
Fbai?o segue uma verso bastante difundida de iniciali0a%o de um servidor PostgreSQL atravs
desse comando 1perceba que o usurio desprivilegiado postgres E ou quem voc# usou no initdb E
que deve e?ecutar o comando2*
$ postgres -D /usr/local/pgsql/data > logfile 2>&1 &
9 comando postgres teve sua sa(da padro 1stdout2 direcionada para um arquivo c/amado
logfile e sua sa(da de erros 1stderr2 direcionada para o mesmo lugar que foi a sa(da padro
1&1 refer#ncia sa(da 8 E padro2. 9 & do fim para liberar o console.
3ota* Aers'es anteriores ;.T c/amavam esse comando de postmaster.
9 nome foi trocado para o nome atual mais sugestivo, mas poss(vel que
voc# encontre alguma refer#ncia a esse nome. "e qualquer forma, ainda
e?iste, embora depreciado, um lin6 simb+lico e?ecutvel para o postgres
c/amado postmaster no diret+rio bin do servidor.
119
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
1.3.2 Inicializao via pg_ctl
9 pg_ctl um comando de conveni#ncia para iniciar 1c/amando o e?ecutvel postgres2,
encerrar ou reiniciar o servi%o. 4onfira na tabela abai?o as a%'es poss(veis com esse comando*
VI. Tabela Aes do pg_ctl
"o Descrio
start
Nnicia o processo do servidor. "iferente do comando postgres, aqui o
comando inicia o servidor em bac6ground, no prendendo o console. :odas as
mensagens do servidor sero lan%adas na tela a menos que uma op%o -l se5a
utili0ada. )?.*
$ pg_ctl -D /usr/local/pgsql start E Nnicia o servidor no
cluster definido.
$ pg_ctl start E inicia o servidor no cluster apontado pela varivel
P"F:F.
$pg_ctl -l /var/log/pgsql/logfile E Nnicia o servidor no cluster
apontado pela varivel PGDATA e registra as sa(das no arquivo definido.
stop
)ncerra o servidor. > tr#s modos poss(veis de encerramento*
J Smart* $odo padro. Fguarda todas as transa%'es conclu(rem e todos os
clientes desconectarem para derrubar o servidor.
J Fast* "esfa0 1rollbac62 todas as transa%'es correntes e desconecta todos os
clientes para ento derrubar o servidor de modo seguro.
J Immediate* "erruba o servidor de modo abrupto. Semel/ante a um
desligamento da mquina por ra0'es como falta de energia. "ispara o processo
de re)overy de arquivos CFL ao rein(cio do servidor.
restart
I uma simplesconveni#ncia a um stop seguido por um start.
reload
)nvia o sinal SIGHUP ao servidor para que ele apenas recarregue suas
configura%'es, lendo os arquivos como o postgresql.conf e pg^/ba.conf e siga
poss(veis novos par[metros passados nesse momento.
status
Fpenas retorna se / um servidor rodando e em que cluster.
kill
Permite se passar o sinal dese5ado ao servidor. Falaremos mais sobre sinais
mais frente.
register
"ispon(vel apenas para o CindoDs. Permite registrar o servidor PostgreSQL
como servi%o do CindoDs.
unregister
9 e?ato oposto da a%o register. :ambm s+ dispon(vel no CindoDs.
F pr+?ima tabela tra0 as principais op%'es para as a%'es do pg_ctl. 4onfira*
VII.Tabela Opes para as aes do pg_ctl
Opo Descrio
-D diretrio
F famosa diretiva que define o local onde est o cluster a ser iniciado.
-l arquivo
9 camin/o para o arquivo onde os logs de mensagem devem ser direcionados
120
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
-m modo
Flag que permite a defini%o dos modos de encerramento 5 tratados na a%o
stop. I poss(vel passar apenas as iniciais dos modos* S 1smart2, F 1fast2, I
1immediate2.
-o opes
Permite a passagem de op%'es ao comando postgres ad5acente. 3ote que
algumas op%'es no esto dispon(veis no pg_ctl, quando voc# precisar de
alguma, basta repassar via op%o -o. Ae5a um e?emplo*
pg_ctl -o "-B 128 -S 100" restart
Fcima, reiniciamos o servidor passando as op%'es -B 1shared_buffers2 e
-S 1work_mem2.
-w
#ait. S+ libera o console ap+s a esperar pela opera%o do servidor. I o padro
para a a%o stop.
-W
=o #ait. 3o espera pelo servidor para liberar o console. I o padro para as
a%'es start e restart.
Fpenas para o CindoDs
-N nome
Bsado para definir o nome e o label do servi%o 1service name e displa7 name2
que ser levantado.
-P senha
Bsado para definir a sen/a do usurio que vai e?ecutar ou derrubar o servi%o.
-U usurio
Bsado para definir o nome do usurio que vai e?ecutar ou derrubar o servi%o.
Modos de encerramento
9s modos de encerramento passados pela op%o Jm merecem alguma prtica para visuali0armos o
que de fato ocorre. )les s+ diferem realmente se /ouver algum conectado ao servidor, por tanto,
para os pr+?imos e?emplos admita que estamos querendo derrubar o servidor, mas e?iste algum
conectado.
9 primeiro modo, smart, deve esperar o encerramento de todas as cone?'es para finalmente poder
encerrar o servidor, isso est limitado a KT segundos.
$ pg_ctl -m s stop
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
waiting for server to shut
down..............................................................
. failed
pg_ctl: server does not shut down
$
4omo o modo smart o padro no seria necessrio definir a op%o -m s no comando acima. 3a
prtica, voc# vai perceber os ponto sero escritos um por segundo. Se as cone?'es no encerrarem
nesse tempo, o s/utdoDn fal/a e o servidor continua ativo como se nada tivesse acontecido. S+
coloquei a &ltima lin/a com o sinal $ para mostrar que o console s+ ser liberado ao final da espera,
se5a ela com #?ito ou no.
121
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
$esmo ap+s a libera%o do console com a mensagem de que o servidor no foi encerrado, o
comando stop ainda est espreita. Fssim que a &ltima cone?o encerrar, o servidor cai enfim ser
derrubado. Para o usurio que est conectado permitido iniciar, confirmar 1commit2 ou reverter
1rollbac62 qualquer transa%o, no entanto estar preso quela cone?o, no podendo nem mesmo
trocar de base de dados por dentro do psql. 4onfira*
dellstore=# \c livro
FATAL: the database system is shutting down
Previous connection kept
Ae5a que ele no teve o direito de conectar a outra base. Nsso serve para for%Jlo a dei?ar de ser
Foselito, o menino que no sabe brincar, e encerrar logo que est fa0endo.
Fgora, vamos tentar derrubar o servidor, com a op%o no $ait 1-W2 para no termos o console
preso.
$ pg_ctl -W -m s stop
server shutting down
$
9 console foi liberado logo ap+s a instru%o server shutting down ser escrita na tela. Ae5a
que o servidor ainda no caiu*
$ ps ax | grep post
2354 pts/0 S 0:00 /usr/local/pgsql/bin/postgres
2356 ? Ss 0:00 postgres: writer process
2359 ? Ss 0:00 postgres: stats collector process
2363 ? Ss 0:00 postgres: postgres dellstore [local]
idle
Fgora disparamos a a%o sem prender o console. Fp+s KT segundos 1calma, tambm no precisa
cronometrar2, e?ecutamos a instru%o ps para listar os processos ativos na mquina e vimos que
no s+ temos os processos bsicos do PostgreSQL, como tambm / um 1o 2363 E postgres
dellstore [local] idle2 que o cara que est impedindo o servidor de encerar.
4ertamente, voc# ver outros processos nessa instru%o, mas isso se deve apenas ao fato de termos
filtrado 1comando grep2 a sa(da do ps a qualquer lin/a que ten/a escrito a palavra post.
3o modo de encerramento fast 1f2, o servidor caiu no mesmo momento, no esperando os
clientes )ommitarem 1ten/o certe0a que esse neologismo voc# 5 cometeu, todo "!F 5 )ommitou
alguma coisa *J2.
$ pg_ctl -m f stop
LOG: received fast shutdown request
LOG: aborting any active transactions
LOG: autovacuum launcher shutting down
FATAL: terminating connection due to administrator command
122
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
LOG: shutting down
waiting for server to shut down...LOG: database system is shut
down
done
server stopped
4aso um usurio este5a conectado, quando resolver operar, ter a seguinte mensagem*
dellstore=# select * from customers;
FATAL: terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!>
9l/a s+ o cursor no final como ficou estran/o.
Se o usurio estiver no meio de uma transa%o, esta ser abortada.
$ pg_ctl -m f stop
LOG: received fast shutdown request
LOG: aborting any active transactions
LOG: autovacuum launcher shutting down
FATAL: terminating connection due to administrator command
STATEMENT: CREATE table teste as select c.* from customers c cross
join orders o;
waiting for server to shut down....FATAL: the database system is
shutting down
LOG: shutting down
LOG: database system is shut down
done
server stopped
Fgora, o servidor foi encerrado no momento em que o usurio estava reali0ando uma opera%o. 9
log do servidor vai coletar quais opera%'es foram abortadas no momento do s/utdoDn. I
importante registrar isso para o caso de algum querer l/e matar depois. Pelo menos, voc# poder
ter uma boa pista do1s2 provvel1is2 criminoso1s2.
9 mtodo de encerramento immediate 1i2 desencora5ado, uma ve0 que acreditaJse que no
deva ser indicado tirar a mquina da tomada enquanto o sistema est no ar. Bm servidor encerrado
com immediate deve reler os logs CFL antes de reiniciar, confira*
$ pg_ctl -m i restart
LOG: received immediate shutdown request
123
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
waiting for server to shut down... done
server stopped
server starting
LOG: database system was interrupted; last known up at 2010-02-17
15:53:49 BRT
LOG: database system was not properly shut down; automatic
recovery in progress
LOG: record with zero length at 0/40E66E8
LOG: redo is not required
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
Z que um restart c/ama um stop, podemos passar o modo immediate e vimos que logo no
rein(cio, o servidor precisou reali0ar a recupera%o dos logs CFL.
Sinais para processos em execuo
Sinais de interrup%o so uma das formas de comunica%o entre processos de um sistema
operacional 1nem sero os &nicos que falaremos por aqui2. :odo processo em e?ecu%o no sistema
operacional admite receber alguns sinais de interrup%o. 4abe aos programadores das aplica%'es, a
defini%o de como deve responder a esses sinais. )m linguagens de mais alto n(vel, normalmente os
sinais 5 so prJdefinidos pela biblioteca que est sendo usada no momento.
Ae5amos alguns dos sinais mais utili0ados em ambiente Bni? alm da forma como PostgreSQL
recebe esses sinais.
VIII. Tabela Sinais Unix
#i$% Descrio
SIGHUP (1)
Sinal de recarga. Btili0ado pelos programas para recarregar seus arquivos
de configura%o. 9 PostgreSQL fa0 e?atamente isso quando recebe a a%o
reload do pg_ctl. 4onsiderando que o identificador do processo
18ID E pro)ess ID2 principal do PostgreSQL 1o postgres2 9s
comandos abai?o so id#nticos em ambiente Bni?*
$ pg_ctl reload
$ kill -1 2354
$ kill -HUP 2354
Bsar o pg_ctl reload mais saudvel por no precisarmos verificar
o n&mero do processo antes, nem corremos o risco de mandar um sinal
para o processo errado.
SIGINT (2)
Sinal de interrup%o. $uito usado em aplicativos que rodam via console.
I recebido pelo processo que est e?ecutando alguma opera%o quando o
usurio tecla CTRL+C. )m geral, os aplicativos passam para uma pr+?ima
instru%o ou encerram no recebimento desse sinal. 9 processo
postgres, que prende o console a ser e?ecutado, encerra ao receber
124
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
esse sinal. )nviar um SIGINT para o processo principal do servidor
equivalente ao modo de encerramento fast do pg^ctl. 9s comando
abai?o so equivalentes em ambiente Bni?*
$ pg_ctl -m f stop
$ kill -2 2354
$ kill -INT 2354
SIGQUIT (3)
Sinal de quit do teclado. 9 PostgreSQL interpreta esse sinal de maneira
equivalente ao modo de encerramento immediate. 9s comandos abai?o
so equivalentes em ambiente Bni?*
$ pg_ctl -m i stop
$ kill -3 2354
$ kill -QUIT 2354
SIGABRT (6)
Sinal abortar. 3o PostgreSQL, implementado como um SIGKILL.
SIGKILL (9)
Sinal de morre murrin/ab 3o importa o que o processo este5a fa0endo, ao
receber um sinal KILL, ele dever ser encerrado imediatamente. 9s
:ernels dos sistemas operacionais no permitem que o sistema burle esse
tipo de sinal.
SIGTERM (15)
Sinal de encerramento normal. )quivale ao modo de encerramento
smart. 9s comandos abai?o so equivalentes em ambiente Bni?*
$ pg_ctl stop
$ pg_ctl -m s stop
$ kill -15 2354
$ kill -TERM 2354
)m ambiente CindoDs, a a%o 6ill do pg^ctl vem suprir a aus#ncia do comando 6ill. 3o e?emplo
abai?o, encerramos o PostgreSQL de modo smart*
$ pg_ctl kill TERM 2354
)m ambiente Bni?, / ainda o e?ecutvel killall que envia um sinal para todos os processos de
certo nome. 3o "ebian, esse comando fa0 parte do pacote psmisc, que instala utilitrios como o
pr+prio killall e o pstree, que lista processo em desen/o /ierrquico.
Para instalar o pacote, e?ecute*
# apt-get install psmisc
Para e?ecutar o comando killall, voc# precisa ser o usurio que iniciou o processo ou o root.
Fbai?o, enviaremos o sinal de encerramento normal para todos os processos postgres.
$ killall -TERM postgres
1.4 Saindo do cluster com novos tablespaces
9 conceito de tablespace at algo bem intuitivo, no entanto sua implementa%o pode variar de
acordo com o S!". 9 espa%o de tabela e?atamente um local f(sico onde os dados devem ser
gravados no disco. Aoc# cria uma tablespace com uma simples instru%o SQL 4G)F:), onde
define o nome e o camin/o para o diret+rio onde devero ser arma0enados os dados. 4onfira sua
assinatura*
125
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION
'diretrio'
9nde diret+rio precisa ser o camin/o absoluto 1desde a rai02 a algum diret+rio prJe?istente. Para o
#?ito nessa instru%o, valem as mesmas regras aplicadas ao diret+rio do cluster. 9u se5a,
necessrio o diret+rio estar va0io e pertencer ao usurio que est conectado ao servidor, criando a
tablespace. S+ podem ser criadas por um superusurio do PostgreSQL, mas podem ser utili0adas
por outros usurios.
F estrutura interna de um diret+rio de tablespace semel/ante do cluster. Fo criar uma tabela,
seus arquivos de dados sero criados da mesma maneira. $o obra*
Aamos primeiro criar o diret+rio. )stamos logados como postgres e vamos criar um subdiret+rio no
/ome dele.
postgres@debian-pgsql:~$ mkdir tblspc
Aamos tentar criar o tablespace sem definir um camin/o absoluto*
postgres@debian-pgsql:~$ psql -c "CREATE TABLESPACE novo LOCATION
'tblspc'";
ERROR: tablespace location must be an absolute path
STATEMENT: CREATE TABLESPACE novo LOCATION 'tblspc'
ERROR: tablespace location must be an absolute path
Aiu- :emos que corrigir isso*
$ psql -c "CREATE TABLESPACE novo LOCATION
'/home/postgres/tblspc'";
CREATE TABLESPACE
Fgora funcionoub Aamos ento alterar o local f(sico onde est arma0enado o (ndice da c/ave
primria da tabela capitulo.
$ psql -c "ALTER INDEX capitulo_pkey SET TABLESPACE novo" livro;
ALTER INDEX
Aamos conferir o que foi feito fisicamente*
postgres@debian-pgsql:~$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
16603 dellstore pg_default
16721 latina pg_default
16402 livro pg_default
11564 postgres pg_default
11563 template0 pg_default
1 template1 pg_default
126
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
Fssim est nosso banco de dados at o momento. "estaque para a base livro, cu5o 9N" 8K<T@.
postgres@debian-pgsql:~$ l tblspc
total 16
drwx------ 3 postgres postgres 4096 Fev 17 20:33 .
drwxr-xr-x 3 postgres postgres 4096 Fev 17 20:24 ..
drwx------ 2 postgres postgres 4096 Fev 17 20:33 16402
-rw------- 1 postgres postgres 4 Fev 17 20:32 PG_VERSION
9l/a lb 9 diret+rio 8K<T@ foi criado e dentro dele / um arquivo 8KMHH.
postgres@debian-pgsql:~$ ll -h tblspc/16402/
total 16K
-rw------- 1 postgres postgres 16K Fev 17 20:33 16733
Fpenas confirmando qual ob5eto detm esse n&mero de arquivo*
livro=# select relfilenode from pg_class where
relname='capitulo_pkey';
relfilenode
-------------
16733
(1 row)
Aamos criar mais um tablespace para mostrar o comportamento do servidor quando modificamos o
tablespace de toda uma base de dados*
3ota* Fpenas na verso ;.<, o PostgreSQL permitiu a clusula S):
:F!L)SPF4) na instru%o FL:)G "F:F!FS).
postgres@debian-pgsql:~$ mkdir tblspc2
$ psql -c "CREATE TABLESPACE novo2 LOCATION
'/home/postgres/tblspc2'";
CREATE TABLESPACE
$ psql -c "ALTER DATABASE livro SET TABLESPACE novo2";
ALTER DATABASE
Aamos listar, atravs do aplicativo oid@name onde esto fisicamente todas as bases de dados*
postgres@debian-pgsql:~$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
16603 dellstore pg_default
16721 latina pg_default
16402 livro novo2
127
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
11564 postgres pg_default
11563 template0 pg_default
1 template1 pg_default
Por fim, podemos conferir que todos os arquivos de dados da base livro foram transferidos para o
novo diret+rio, menos o arquivo do (ndice que estava em outro tablespace. Fssim, podemos concluir
que so transferidos todos os ob5etos que este5am no tablespace padro da base de dados.
postgres@debian-pgsql:~$ ll -h tblspc2/16402/
total 5,5M
-rw------- 1 postgres postgres 8,0K Fev 17 21:01 112
-rw------- 1 postgres postgres 8,0K Fev 17 21:01 113
-rw------- 1 postgres postgres 56K Fev 17 21:01 11447
-rw------- 1 postgres postgres 24K Fev 17 21:01 11447_fsm
-rw------- 1 postgres postgres 8,0K Fev 17 21:01 11447_vm
...
postgres@debian-pgsql:~$ ll -h tblspc/16402/
total 16K
-rw------- 1 postgres postgres 16K Fev 17 20:33 16733
Infraestrutura e catlogo
3o diret+rio do cluster, 5 dissemos que / um subdiret+rio c/amado pg_tblspc que
5ustamente onde so arma0enadas informa%'es sobre os espa%os de nomes utili0ados por todo
cluster. 9 que encontramos por l so apenas lin6s simb+licos que apontam para os diret+rios onde
foram criados os tablespaces. 9 nome dos arquivos dos lin6s so 5ustamente os seus 9N"s.
$ ll /usr/local/pgsql/data/pg_tblspc/
total 0
lrwxrwxrwx 1 postgres postgres 21 Fev 17 20:32 16732 ->
/home/postgres/tblspc
lrwxrwxrwx 1 postgres postgres 22 Fev 17 21:00 16734 ->
/home/postgres/tblspc2
F tabela de catlogo pg_tablespace tra0 dados sobre todos os tablespaces criados*
postgres=# select oid, * from pg_tablespace;
oid | spcname | spcowner | spclocation | spcacl
-------+------------+----------+------------------------+--------
1663 | pg_default | 10 | |
1664 | pg_global | 10 | |
16732 | novo | 10 | /home/postgres/tblspc |
16734 | novo2 | 10 | /home/postgres/tblspc2 |
128
Administrao Profissional do PostgreSQL - 1 -Primeiros passos
(4 rows)
4onfira o campo oid para ver se no bate com os lin6s simb+licos do diret+rio pg_tblspc. 9
campo spcname apenas o nome, spcowner o identificador do usurio 1ve5amos onde est
esse identificador no pr+?imo comando, logo abai?o2. 9 campo spclocation o camin/o
absoluto para o diret+rio do tablespace e spcacl carrega um arra7 de permiss'es direcionadas a
cada tablespace.
postgres=# select usename, usesysid from pg_user;
usename | usesysid
----------+----------
postgres | 10
(1 row)
F consulta anterior nos mostrou outros dois tablespaces pg_default e pg_global. 9 primeiro
o tablespace da base template1, consequentemente tambm o da base templateT e o padro
de toda nova base. F consulta no mostrou, mas 5 sabemos que 5ustamente o diret+rio base do
cluster. 9 segundo onde ficam todos os ob5etos globais e vis(veis a todas as bases. I 5ustamente o
diret+rio global.
1.5 Resumo geral
!om, meu amigo 1ou min/a amiga2, eis que c/egamos ao final deste primeiro cap(tulo. F inten%o
aqui foi resumir o comportamento f(sico do processo do servidor. F tanica foi, no caso do
PostgreSQL, o que est por bai?o, ou o que est por trs do que n+s estamos acostumados a ver ao
trabal/ar com um S!".
Fi0emos o processo de instala%o detal/ado, em mais de um ambiente e focamos 1e vamos
continuar focando2 nossos e?emplos no "ebian Lenn7 =.T. 4on/ecemos a estrutura f(sica do
diret+rio de dados e discutimos um pouco sobre como o servidor opera com esses dados. 9 que ele
l# ou escreve, como e quando ele reali0a determinadas atividades.
$uito do que foi apresentado aqui ter seu espa%o mais detal/ado nos pr+?imos cap(tulos, vale a
pena conferir cada um e descobrir como bem desenvolvido o nosso PostgreSQL.
I certamente uma boa idia voc# ler o manual oficial do S!". )ntretanto, esse foi tambm um
trabal/o de pesquisa e testes emp(ricos que no esto dispostos l na documenta%o. :ive a /onra de
poder contar tambm com algumas breves mas bastante importantes e?plana%'es de um dos mais
ativos colaboradores do PostgreSQL, >ei66i Linna6angas, da )nterprise"!, criador do novo
modelo de mapeamento de espa%o livre 1FS$2.
129
Administrao Profissional do PostgreSQL - 2 -Opes de configurao
2 - Opes de configurao
Aeremos neste cap(tulo, que o PostgreSQL admite muito mais op%'es de configura%o do que as
passadas no ato de c/amada aos e?ecutveis initdb, postgres ou pg^ctl. Aamos focar este cap(tulo
no postgresql.conf, principal arquivo de configura%o de todo o cluster.
)m geral, esse arquivo pode ser encontrado no diret+rio do cluster, mas poss(vel estar em outro
lugar. Quando voc# quiser iniciar uma inst[ncia do servidor lendo um arquivo postgresql.conf de
outro diret+rio, ser necessrio passar um par[metro ao comando postgres que dei?amos para falar
apenas aqui. Ae5a*
$ postgres -c config_file=/etc/postgresql/8.4/main/postgresql.conf
)ste e?emplo foi tirado do processo padro do PostgreSQL, instalado via pacotes no Bbuntu 1omiti
apenas a op%o -D que 5 discutimos antes2.
130

Você também pode gostar