Вы находитесь на странице: 1из 130

AdministraoProfissionaldoPostgreSQLIntroduo

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 SGBD. So poucos os livros em portugus sobre o assunto. Mesmo em ingls, devido evoluo do banco em suas ltimas verses, no muito difcil topar com algum material defasado. Em se tratando de administrao 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 memria disso, tanto daquilo e eu sempre me perguntei: Sim, mas por qu?. Por outro lado, a vasta documentao oficial salvou minha pele algumas vezes (sou professor de PostgreSQL e no me envergonho de recorrer a ela mesmo durante algumas aulas). No entanto, o que poderia ser bom, imagino que possa ter provocado um efeito colateral. Muita gente pode ter pensado como eu: Como escrever um material sobre PostgreSQL que organize os assuntos de um jeito que penso ser mais didtico, mas que no fique com cara de cpia descarada da documentao oficial?. Esta ento minha misso. Preciso escrever algo sobre administrao do PostgreSQL que seja mais breve que sua documentao oficial (at a, fcil... bronca seria se tivesse que ser maior), que possa recorrer a ela em momentos oportunos, mas que no faa voc achar que gastou dinheiro toa comprando algo que no acrescentou nada s sagradas escrituras de Berkeley1.

Ementaeorganizao
O contedo foi cuidadosamente arranjado para focar em tarefas administrativas do PostgreSQL e do ambiente em questes que influenciem em como o SGBD dever funcionar (ou no, como diria Caetano). Trataremos aqui da verso 8.4, apesar dos caras j estarem com o 8.5 no forno com algumas idias interessantes como o suporte ao j bem esperado Hot Standby (explicar isso agora? ...). Todos os testes foram realizados na verso 8.4.2 em sistema Debian netinst virtualizado com Virtual Box aqui em um velho note de guerra, com hospedeiro rodando Ubuntu Hard Heron que s atualizo quando sair outro LTS. Em alguns momento, posso apresentar alguns resultados executados em outras mquinas. Quem sou eu para dizer qualquer coisa, mas em minha humilde opinio, o PostgreSQL ainda um sistema extremamente vinculado famlia Unix, portanto, quando me referir ao Windows, vai ser s para no dizer que no falei das flores. Captulo 1 Primeiros passos. No primeiro momento, vamos tratar do processo de instalao em mais de uma plataforma, utilizando mais de um mtodo, alm de conhecer a disposio fsica do servidor instalado. Apesar do nome Primeiros passos, no se trata aqui de um captulo de nivelamento. Vamos assumir que o leitor j possui mais de 15 minutos de experincia com PostgreSQL e tem noes de instrues SQL e Sistemas Gerenciadores de Bancos de Dados Relacionais (SGBDR ou RDBMS). Captulo 2 Opes de configurao. Neste captulo, colocaremos uma lupa sobre o postgresql.conf, principal arquivo de configurao do banco e veremos como este est organizado. Veremos ainda alguns recursos de configurao definidos pelos clientes.
1 CidadesededaUniversidadedaCalifrnia,berodoPostgreSQL

AdministraoProfissionaldoPostgreSQLIntroduo Captulo 3 Autenticaes e permisses. Aps um embasamento nas opes de configurao, importante saber como conectar e como o PostgreSQL faz para dizer quem pode fazer o qu e onde. Este captulo aborda do grosso modo aos ajustes finos sobre conexes, papis e permisses do PostgreSQL. Captulo 4 Transaes e Write Ahead Logging. Certamente um dos captulos mais legais. O WAL a alma negcio no PostgreSQL. ele quem garante a durabilidade de uma transao e conhec-lo bem pode lhe trazer boas idias de desempenho, integridade e disponibilidade. Captulo 5 Rotinas administrativas. Se estamos em um livro sobre administrao do PostgreSQL, este captulo o principal responsvel. Vacuum, analyze, logging e monitoria so tarefas administrativas que precisam estar bastante claras na mente do DBA PostgreSQL. Captulo 6 Backups Eles podem salvar seu emprego. Se voc sentiu falta dos backups como tarefas administrativas fundamentais, ns tambm. Tanto que um captulo inteiro foi reservado s para eles. Veremos o mecanismo dump texto e binrio, alm do famoso Point-in-Time Recovery para backups incrementais e timelines. Ser visto aqui o que poderia estar apenas no captulo 9 Alta Disponibilidade, que a tcnica de Warm Standby baseada no log shipping de um servidor master para um slave que assume a ponta caso detecte que algo de ruim aconteceu ao master (failover). Aqui ser fundamental que voc entenda bem o captulo 4 Transaes e Write Ahead Logging. Captulo 7 Algo sobre infraestrutura. Neste captulo eu me aventuro a falar sobre algo que no bem minha praia. Sou desenvolvedor, mas tive o cuidado de apresent-o previamente a diversos amigos Sysadmins e eles no riram da minha cara. Espero sinceramente que no tenha sido por pura amizade. Para ser um bom DBA PostgreSQL, voc precisar conhecer bem este assunto. Captulo 8 Tunning Ensinando o elefante a voar. Aqui voc conhecer algumas ferramentas para medio de desempenho, dicas para evitar gargalos e diversas opes de configurao para transformar seu PostgreSQL num Dumbo envenenado. (Perdo leitor. Tenho certeza de que se no fossem 3h da manh e eu no estivesse morto de sono, esta frase infame no teria surgido). Captulo 9 Alta disponibilidade. Em muitos sistemas, disponibilidade algo ainda mais crtico do que desempenho. Vejamos algumas tecnologias que podero auxili-lo em situaes onde parar ou perder dados sejam simplesmente inadmissveis.

Paraquemestouescrevendo
Se voc est procurando um material introdutrio sobre PostgreSQL, modelagem de dados e linguagem SQL, pode voltar seo Best-sellers: Livros mais vendidos de todos tempos da livraria e recolocar este livro na estante. Aproveite e pea para o vendedor utilizar algo melhor como encalo para a estante. :-) Material assim, voc encontra uns muito bons l naquela prateleira da seo Bancos de Dados, na rea de informtica. Me preocupei em falar para quem j sabe disso mas precisa administrar um servidor PostgreSQL. Escrevo tambm para desenvolvedores curiosos na rea como eu. impressionante como ns somos capazes de, ao menor deslize, estragar tudo e congelar o banco. Se meu sonho se realizasse e todo desenvolvedor que trabalhe com o PostgreSQL se especializasse nos assuntos que este livro aborda, acredito que eu ganharia o nobel da paz por trs anos seguidos (no quarto eu negaria para dar chance a algum Obama desprestigiado). 2

AdministraoProfissionaldoPostgreSQLIntroduo E por que no dizer que escrevo para coveiros, ascensoristas, deputados e quem mais puder encontrar um tempo livre para ler um livrinho light e bem humorado. Escrevo at mesmo para torcedores do Nutico ou do Santa Cruz. Coitados, eles precisam de algo que lhes traga mais alegria.

AdministraoProfissionaldoPostgreSQLIntroduo

Sumrio
Introduo.............................................................................................................................................1 EMENTA E ORGANIZAO........................................................................................................................1 PARA QUEM ESTOU ESCREVENDO..............................................................................................................2 1Primeirospassos...............................................................................................................................8 1.1PROCESSO DE INSTALAO..................................................................................................................8 1.1.1Instalao no Debian Lenny..................................................................................................8 EscolhaedownloaddoDebianLenny...................................................................................8 Processodeinstalaoemmodogrfico................................................................................9 Efetuandoodownloaddosfontes.........................................................................................48 Preparandooambiente.........................................................................................................52 InstalandooPostgreSQLapartirdocdigofonte...............................................................54 Psinstalao.......................................................................................................................55 Inicializao..........................................................................................................................60 Customizaes,facilitaeseautomatizaes.....................................................................60 Instalaoviaaptget............................................................................................................64 1.1.2Instalao do EnterpriseDB no Windows...........................................................................64 1.1.3Instalao no Ubuntu via Synaptic.....................................................................................80 1.2INITDB INCIO DO DATABASE CLUSTER..............................................................................................85 1.2.1Arquivos e diretrios do cluster..........................................................................................87 Diretriobase.......................................................................................................................87 Comooarmazenadorfunciona............................................................................................94 Mapeamentodeespaolivreempginasdedados..............................................................97 Umpoucodeprtica.............................................................................................................99 Outrosdiretrios.................................................................................................................107 Arquivosdeconfiguraodocluster..................................................................................109 1.2.2Encoding e localizao......................................................................................................110 ProblemascomoDebian/Ubuntu.....................................................................................112 ContornandooproblemanoDebian...................................................................................113 ContornandooproblemanoUbuntu...................................................................................114 EscolhadelocalesnoinitdbenoCREATEDATABASE..................................................115 1.3OPES DE INICIALIZAO .............................................................................................................118 1.3.1Inicializao via postgres..................................................................................................118 1.3.2Inicializao via pg_ctl.....................................................................................................120 Modosdeencerramento......................................................................................................121 Sinaisparaprocessosemexecuo....................................................................................124 1.4SAINDO DO CLUSTER COM NOVOS TABLESPACES..................................................................................125 Infraestruturaecatlogo.....................................................................................................128 1.5RESUMO GERAL............................................................................................................................129 2Opesdeconfigurao...............................................................................................................130 2.1QUANDO E COMO ALTERAR OPES DE CONFIGURAO.......................................................................130 2.2COMO EST ORGANIZADO O POSTGRESQL.CONF..................................................................................130 2.2.1Localizao de arquivos....................................................................................................130 2.2.2Conexes e autenticaes..................................................................................................132 2.2.3Consumo de recursos.........................................................................................................135 4

AdministraoProfissionaldoPostgreSQLIntroduo 2.2.4Logs de transao WAL.....................................................................................................141 2.2.5Tuning de planejamento de consultas...............................................................................145 2.2.6Logs do sistema.................................................................................................................152 2.2.7Coletor de estatsticas.......................................................................................................160 2.2.8Autovacuum.......................................................................................................................161 2.2.9Padres para os clientes...................................................................................................164 Maissobreesquemasesearch_path....................................................................................171 ComofuncionaatabelaBase64.........................................................................................173 Representaotemporal......................................................................................................175 2.2.10Gesto de lock.................................................................................................................177 2.2.11Compatibilidade..............................................................................................................178 2.3CONCLUSO.................................................................................................................................182 3Autenticaesepermisses..........................................................................................................183 3.1CONTROLANDO ACESSOS................................................................................................................183 3.1.1Interfaces e conexes no postgresql.conf..........................................................................183 3.1.2Autenticaes no pg_hba.conf...........................................................................................185 Autenticaolocal..............................................................................................................190 Identidadedeusurios........................................................................................................192 Mapasdeidentificao.......................................................................................................194 3.2O TCPDUMP VAI DEDURAR A CONVERSA DAS CONEXES HOST...............................................................194 3.3CONEXES SSL/TLS...................................................................................................................194 3.3.1Certificados digitais..........................................................................................................194 GeraodecertificadosatravsdoOpenSSL.....................................................................194 GeraodecertificadosatravsdoJavaKeyTool...............................................................194 3.3.2Realizando conexes.........................................................................................................194 3.4USURIOS, GRUPOS E PAPIS (ROLES)...............................................................................................194 3.5POLTICA DE PERMISSES (GRANT E REVOKE).....................................................................................194 3.6VAMOS FALAR SOBRE SEGURANA?..................................................................................................194 4TransaeseWriteAheadLogging..............................................................................................195 4.1VISO GERAL SOBRE TRANSAES...................................................................................................195 4.1.1Nveis de isolamento..........................................................................................................195 4.2MVCC MULTIVERSION CONCURRENT SYSTEM.............................................................................195 4.3COMO FUNCIONA O WAL NO SISTEMA DE ARQUIVOS..........................................................................195 4.4CHECKPOINTS E O PROCESSO BGWRITER............................................................................................195 4.5LOCKS........................................................................................................................................195 5Rotinasadministrativas.................................................................................................................196 5.1LIMPEZA DE REGISTROS APAGADOS COM VACUUM...............................................................................196 5.1.1Configuraes de autovacuum..........................................................................................196 5.1.2Deteco de espao livre...................................................................................................196 5.1.3Reincio de XID.................................................................................................................196 5.2COLETA DE ESTATSTICAS................................................................................................................196 5.2.1Tabelas de catlogo...........................................................................................................196 5.2.2Configuraes do coletor automtico...............................................................................196 5.3LOGGING SQL E REPORTES DE ERROS..............................................................................................196 5.4MONITORIA..................................................................................................................................197 5.4.1Conhecendo os processos..................................................................................................197 5.4.2Monitorando processos com pg_top..................................................................................197 5.4.3Monitorando uso de memria com vmstat e sar...............................................................197 5

AdministraoProfissionaldoPostgreSQLIntroduo 5.4.4Monitorando uso de disco.................................................................................................197 5.4.5Monitorando logs do sistema com PgFouine....................................................................197 5.4.6Monitoramentos com Cedrus............................................................................................197 5.4.7Mais monitoramentos com Zabbix....................................................................................197 6BackupsElespodemsalvarseuemprego..................................................................................198 6.1BACKUPS DUMP/RESTORE...............................................................................................................198 6.1.1Gerando dumps com pg_dump e pg_dumpall...................................................................198 6.1.2Gerando dumps no PgAdmin III.......................................................................................198 6.1.3Recuperando dumps em texto............................................................................................198 6.1.4Recuperando dumps binrios com pg_restore..................................................................198 6.2BACKUPS INCREMENTAIS COM POINT-IN-TIME RECOVERY (PITR)........................................................198 6.2.1Coleta contnua de logs de transaes..............................................................................198 6.2.2Backup fsico a quente..................................................................................................198 6.2.3Simulao de crash e recuperao do backup..................................................................198 6.2.4Timelines............................................................................................................................198 6.3WARM-STANDBY..........................................................................................................................198 6.3.1Log shipping com rsync e pg_standby..............................................................................198 6.3.2Failover.............................................................................................................................198 6.3.3Hot Failover com o WalMgr do SkyTools..........................................................................198 7Algosobreinfraestrutura..............................................................................................................199 7.1GESTO DE DISCOS........................................................................................................................199 7.1.1RAID..................................................................................................................................199 7.2GESTO DE SISTEMA OPERACIONAL..................................................................................................199 7.2.1Processos...........................................................................................................................199 7.2.2Segmentos de memria compartilhada.............................................................................199 7.2.3Semforos..........................................................................................................................199 8TuningEnsinandooelefanteavoar..........................................................................................200 8.1BENCHMARKS TPC......................................................................................................................201 8.2FERRAMENTAS DE BENCHMARK........................................................................................................203 8.2.1Testes TPC-B com o pgbench............................................................................................203 8.2.2Testes TPC-C com DBT-2..................................................................................................203 8.2.3Testes de carga com Jmeter...............................................................................................203 8.3DICAS BSICAS.............................................................................................................................203 8.4EXPLAIN ENTENDA O QUE O QUERY PLANNER EST FAZENDO............................................................204 8.4.1Custo e tempo de operaes..............................................................................................204 8.4.2Catlogo de operaes......................................................................................................204 8.4.3Explain no PgAdmin III.....................................................................................................204 8.5CONSULTAS DE GRANDE VOLUME.....................................................................................................204 8.5.1GEQO................................................................................................................................204 8.5.2Particionamento................................................................................................................204 8.6RECONFIGURANDO O SERVIDOR EM BUSCA DE DESEMPENHO..................................................................204 8.6.1Ferramenta pgtune............................................................................................................204 8.6.2Configuraes de consumo de recursos............................................................................204 8.6.3Outras configuraes........................................................................................................204 8.7RECURSOS UNIX SYSTEM V...........................................................................................................205 9AltaDisponibilidade....................................................................................................................206 9.1PROJETOS DE REPLICAES.............................................................................................................206 9.1.1Replicaes de baixo nvel com DRBD.............................................................................206 6

AdministraoProfissionaldoPostgreSQLIntroduo 9.1.2Replicaes master/multislaves com Slony I.....................................................................206 9.1.3Replicaes multimaster e load balance com pgpool II....................................................206 9.2FAILOVERS...................................................................................................................................206 9.2.1Linux Hearbeat..................................................................................................................206

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1 Primeirospassos
Veremos aqui quase como comear do comeo. Precisamos ver o processo de instalao, mas vamos atentar um pouco mais aos detalhes, s vezes negligenciados por questes didticas em livros mais bsicos.

1.1 Processodeinstalao
Sero apresentados aqui vrios mtodos de instalao, a maioria em ambiente Linux, o que pode ser til tambm em outros sabores Unix. Para que no ocorra de eu utilizar uma distribuio que supra certas dependncias que outras no ou eu mesmo j haver instalado junto com algum outro aplicativo, resolvi mostrar o processo de instalao em mais de uma distribuio, na tentativa de ser mais amplo e democrtico. Tentei dispor em uma crescente de facilidade, onde iniciamos com a instalao em ambiente Debian. Aqui veremos a instalao do prprio sistema operacional. No que seja complicado, mas por ser um explicao completa de tudo que ser necessrio para se ter um ambiente preparado para o PostgreSQL. Depois, veremos a instalao no Windows XP (no testei, mas acredito que sirva para o Vista ou o Seven), atravs do prtico instalador mantido pela EnterpriseDB, instalador tambm disponvel para o MacOS. Por fim, veremos a instalao de pacotes .deb no Ubuntu, para quem quer tudo muito bem perfumado, atravs do gerenciador grfico de pacotes Synaptic.

1.1.1 InstalaonoDebianLenny
Sistemas de bancos de dados so famosos por serem vidos consumidores de recursos computacionais. Com o PostgreSQL no poderia ser diferente. Em ambientes corporativos, comum dispor de uma mquina (ou uma infraestrutura bem mais robusta) com a funo especfica de prover o banco de dados, nelas o ideal que no haja gasto de recursos com operaes que poderiam ter sido evitadas. Com o Debian, possvel instalar um ambiente operacional mnimo, onde tudo pode ser mais eficientemente aproveitado pelo banco.
EscolhaedownloaddoDebianLenny

Para efetuar o download do Debian Lenny 5.0, v ao endereo www.debian.org e clique no menu Obtendo o Debian. L vamos escolher a verso netinst, que nos trar uma imagem ISO pequena e todo resto devendo ser instalado pela prpria Internet. Para isso, clique no link Baixe um arquivo de imagem pequeno, grave-o em um CD/DVD/disco USB/disquete, e instale usando a Internet. Agora, voc poder baixar uma verso pequena (CDs Pequenos) ou minscula (CDs muito pequenos, disquetes, USB sticks, etc), alm de poder efetuar uma instalao inteiramente pela rede. Vamos optar pela primeira verso. O link CDs Pequenos traz uma ISO de apenas 150 Mb que nem tanto nem to pouco.

AdministraoProfissionaldoPostgreSQL1Primeirospassos
Processodeinstalaoemmodogrfico

Apesar de estarmos interessados em um ambiente mnimo, sem gastos de recursos com suprfluos como o ambiente grfico, o processo de instalao no precisa ser tortuoso. Veremos como instalar em ambiente grfico de modo bem simples e intuitivo. Ao gravar sua imagem em um CD ou pendrive, rebootar a mquina a partir da mdia gravada, voc dever se deparar com a seguinte tela: 1 Tela inicial de boot do Debian Lenny

Pode optar pelo Graphical install sem problemas. Feito isso, a prxima tela trar a primeira escolha, o idioma a ser utilizado durante o processo de instalao e utilizao posterior no ambiente instalado. 2 Tela inicial: Escolha do idioma

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Apesar de termos escolhido Portugus do Brasil, a prxima tela nos perguntar qual o pas origem do idioma. Vamos optar pelo Brasil novamente. 3 Tela de escolha do pas do idioma informado

10

AdministraoProfissionaldoPostgreSQL1Primeirospassos

A prxima escolha o layout do teclado. Vamos respeitar o sugerido. 4 Tela de escolha do layout do teclado

11

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Aps a escolha, o instalador ir efetuar algumas verificaes sobre os dispositivos. 5 Tela de deteco e montagem de dispositivos

12

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Alguns componentes adicionais devero ser carregados 6 Tela de carregamento de componentes adicionais

13

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Neste momento, o instalador tentar se conectar a algum servidor DHCP a fim de obter um IP vlido na rede. recomendvel haja este servidor em sua rede e que seja possvel a mquina em questo acessar a Internet. 7 Tela de configurao do cliente do servio DHCP

14

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Quando o instalador parar de mostrar barras de progresso, voc ser questionado a informar o nome que pretende batizar seu novo sistema. 8 Tela de configurao de nome da mquina na rede

15

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Na prxima tela, no desmerea a configurao do fuso-horrio. Isso muito importante. Normalmente, o relgio da BIOS dever estar corretamente configurado para o horrio GMT (fuso zero) com a escolha pelo nosso fuso-horrio de -3 horas. 9 Tela de escolha de cidade a fim de registrar o fuso-horrio

16

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Mais algumas deteces sero feitas para que voc possa entrar com mais alguma informao. Neste caso 10 Deteco de novos hardwares

17

AdministraoProfissionaldoPostgreSQL1Primeirospassos

O prximo momento ser sobre a configurao das parties do sistema. 11 Tela de carregamento do aplicativo de particionamento

18

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Aqui, o critrio seu. Vamos criar as parties manualmente. 12 Tela inicial de definio de parties

19

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Para facilitar a escrita deste material, instalei o Debian sobre o Virtual Box, reservando apenas 10Gb para todo o sistema, mesmo assim optei por criar uma partio swap e uma ext3 reservada raiz do sistema de arquivos. No vou entrar no mrito de quais mais parties deveriam ser criadas, isso sempre vai depender dos recursos que voc tiver disponveis. No entanto, vou voltar a falar sobre sistemas de arquivos e particionamento em outros momentos. 13 Tela de escolha do HD a ser particionado

20

AdministraoProfissionaldoPostgreSQL1Primeirospassos

14 Opo por criar nova tabela de parties no HD escolhido

21

AdministraoProfissionaldoPostgreSQL1Primeirospassos

15 Opo por criar nova partio

22

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Na prxima tela, vamos definir o tamanho da partio swap. Swap a operao de escrita em discos no momento em que houver um esgotamento da memria RAM. No Windows, o swap dinmico e ocorre por padro na mesma partio onde o sistema for instalado, j no Linux, ela reservada e otimizada em uma partio que voc deve definir. O valor exato que voc deve reservar swap tambm no determinado. Muita gente fala sobre a mgica expresso matemtica de 2 vezes a memria RAM, uma vez que voc deve ter uma proporo ainda bem maior de espao em disco dividido pela memria disponvel. medida que sua quantidade de memria RAM cresce a necessidade de swap diminui. O fato que o swap necessrio, mas o bom mesmo que voc nunca precise dela, sob pena de ver seu elefante sentar calada. 16 Definindo o tamanho da partio swap

23

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Se a partio for primria, dever ter um nmero entre 1 e 4, se for lgica acima disso. No que haja diferena de integridade ou desempenho entre os dois tipos, mas em geral costumo optar por parties primrias. 17 Definindo a partio como primria

24

AdministraoProfissionaldoPostgreSQL1Primeirospassos

18 Escolha da posio da partio no incio ou no fim do HD

25

AdministraoProfissionaldoPostgreSQL1Primeirospassos

19 Escolha da partio como swap

26

AdministraoProfissionaldoPostgreSQL1Primeirospassos

20 Finalizando a escolha

27

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Agora vamos criar a partio principal que aqui apenas tomaremos o restante do disco. No entanto, seria possvel e bem comum que reservssemos parties para o sistema operacional, para os diretrios home dos usurios, para registros de log do sistema e para mais uma infinidade de coisas. O prprio PostgreSQL, dependendo da finalidade pode ser melhor arranjado em mais de uma partio, melhor ainda se estiver em mais de um disco, mas vamos deixar este assunto pra depois que voc resolver parar de ler na livraria e passar logo no caixa. 21 Particionando o restando do disco

28

AdministraoProfissionaldoPostgreSQL1Primeirospassos

No vou repetir aqui as telas que voc vai encontrar agora. Ao final, escolha o sistema de arquivo e ponto de montagem raiz. Nota: Sobre ponto de montagem. Provavelmente voc j sabe disso melhor do que eu, mas no custa dizer que no Linux no tem essa de unidade C:, unidade D: e tal. Sempre deve haver uma partio que ser utilizada como unidade principal (a famosa C:). Ela dita partio raiz e deve ser escrita no ponto de montagem / (barra). As demais parties (a exceo da swap) devem ser montadas em subdiretrios da raiz. Assim: /boot, /var, /home so sugestes recorrentes em manuais de instalao de Linux uma vez que separam em parties diferentes subdiretrios com funes reconhecidamente diferentes, tornando-as capazes de evoluir de modo independente, por exemplo os diretrios dos usurios devem estar abaixo de /home. Se esta partio crescer e ficar cheia, em vez de sair por a exterminando os usurios mais chatos, voc pode simplesmente montar uma partio de um HD maior no mesmo lugar da anterior sem ningum se abalar. O Debian Lenny ainda no traz o ext4 na instalao padro, vamos discutir um pouco sobre sistemas de arquivos em um momento mais oportuno. 22 Escolha do sistema de arquivos da partio raiz 29

AdministraoProfissionaldoPostgreSQL1Primeirospassos

23 Finalizando o particionamento

30

AdministraoProfissionaldoPostgreSQL1Primeirospassos

24 Escrevendo as mudanas no disco

31

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Aps escrever a nova tabela de partio, seu disco ser formatado. 25 Formatando nova tabela de parties

32

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Agora s ir tomar um caf. 26 Instalando sistema

33

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Sistema bsico instalado, a prxima tela ir lhe sugerir e lhe perguntar o nome de um usurio adicional para que voc possa evitar entrar como root. 27 Tela de configurao de novo usurio

34

AdministraoProfissionaldoPostgreSQL1Primeirospassos

28 Escolha a senha deste usurio

35

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Optamos pela verso netinst do Debian, portanto o final ser instalado pela rede. Devemos escolher o pas de onde buscar os demais pacotes a serem instalados. 29 Escolha do pas origem dos pacotes a serem instalados

36

AdministraoProfissionaldoPostgreSQL1Primeirospassos

30 No Brasil, estes so os repositrios servidores

37

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Caso voc se conecte rede atravs de um servidor proxy, configure-o aqui. 31 Configurao do servidor proxy

38

AdministraoProfissionaldoPostgreSQL1Primeirospassos

A prxima tela ir apenas exibir uma barra de progresso de acordo com a leitura e configurao do novo repositrio. 32 Configurando o apt

39

AdministraoProfissionaldoPostgreSQL1Primeirospassos

33 Alguns softwares j sero instalados neste momento

40

AdministraoProfissionaldoPostgreSQL1Primeirospassos

bom sempre contribuir. Na prxima tela, voc dever concordar ou descordar do seu sistema participar da pesquisa de popularidade de pacotes. Neguei por aqui, mas recomendo que voc aceite. 34 Participao na estatstica de uso de pacotes

41

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Esta tela fundamental. Aqui vamos optar pelo sistema bsico, sem interface grfica ou quaisquer outros servios que possam concorrer com nosso banco. 35 Escolha pela instalao apenas do sistema bsico

42

AdministraoProfissionaldoPostgreSQL1Primeirospassos

36 O resto dos pacotes ser instalado agora

43

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Aps instalado o sistema, voc ser questionado se deseja instalar o gestor de boot grub no incio da partio reservada raiz ou no registro pricipal do disco MBR (master boot record). 37 Instalando o grub na MBR

44

AdministraoProfissionaldoPostgreSQL1Primeirospassos

38 Andamento do trmino da instalao

45

AdministraoProfissionaldoPostgreSQL1Primeirospassos

39 That's all folks!

46

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Aps reiniciar, escolha a primeira opo de boot. 40 Tela de boot

47

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Efetuandoodownloaddosfontes

Para voc no perder o hbito de navegar na Internet, vamos instalar um navegador de modo texto para podermos ir ao site do PostgreSQL baix-lo de l. Confira na imagem abaixo: 41 Instalando o pacote lynx

Note que precisamos executar este comando como usurio root. O indicador # esquerda do cursor indica que somos o root, do contrrio, haveria um $. Nota: A partir deste momento, para citar qualquer comando no console, apenas informaremos o indicador # quando este precisar ser realizado pelo 48

AdministraoProfissionaldoPostgreSQL1Primeirospassos usurio root, ou o $ quando ele no for necessrio. Nota: Poderamos instalar o prprio PostgreSQL via apt-get, ele est disponvel nos mesmos repositrios. No o fizemos primeiramente por ser o Debian uma distribuio fortemente focada na estabilidade, o que a torna um pouco mais lenta na disponibilizao de pacotes de softwares. At o momento, a verso do PostgreSQL disponvel nos repositrios Debian a 8.3. Outro motivo foi justamente por querermos ver o que acontece de fato em um processo de instalao. O comando #aptgetinstall postgresql vai pedir sua confirmao para efetuar o download de dependncias e s vai parar depois que o banco tiver sido baixado, configurado e inicializado, tarefas que pretendemos digerir mastigando um pouco mais. Aps baixar o navegador, digite: $ lynx www. postgresql.org Voc vai se deparar com toda a beleza da pgina principal do postgresql.org em modo textual. 42 Tela do lynx na pgina www.postgresql.org/download

Navegue atravs das setas, at a opo source code acender de amarelo. Enter para clicar na opo: 43 Link para o download do PostgreSQL

49

AdministraoProfissionaldoPostgreSQL1Primeirospassos

V at a opco de verso. Neste momento, a verso 8.5 ainda se encontra em estgio alpha, optamos pela 8.4.2. 44 Opo de verso do PostgreSQL

A prxima tela traz a escolha do mirror de onde vamos baixar o SGBD, escolha qualquer um e confirme o salvamento do arquivo no final. 50

AdministraoProfissionaldoPostgreSQL1Primeirospassos 45 Escolha do site espelho

46 Tela de salvamento do arquivo

51

AdministraoProfissionaldoPostgreSQL1Primeirospassos
Preparandooambiente

Ainda no estamos completamente preparados para receber o PostgreSQL. No temos sequer um descompactador para abrirmos o bz2. Execute o comando abaixo para instal-lo: #aptgetinstallbzip2 Com o bzip2 instalado podemos descompactar o fonto do PostgreSQL baixado anteriormente atravs do comando abaixo. $tarxvfpostgresql8.4.2.tar.bz2 Entre no diretrio gerado e liste seu contedo: $cdpostgresql8.4.2 $lsl Voc vai obter uma sada como esta:
total1744 -rw-r--r-- 1 drwxrwxrwx 2 -rwxr-xr-x 1 -rw-r--r-- 1 drwxrwxrwx 41 -rw-r--r-- 1 drwxrwxrwx 5 -rw-r--r-- 1 -rw-r--r-- 1 -rw-r--r-- 1 -rw-r--r-- 1 -rw-r--r-- 1 drwxrwxrwx 14 258 258 258 258 258 258 258 258 258 258 258 258 258 258 445 Abr 23 2004 aclocal.m4 258 4096 Fev 1 15:03 config 258 801991 Dez 9 23:56 configure 258 61120 Dez 9 23:56 configure.in 258 4096 Fev 1 15:03 contrib 258 1192 Jan 1 2009 COPYRIGHT 258 4096 Fev 1 15:21 doc 258 4331 Jan 14 2009 GNUmakefile.in 258 779345 Dez 10 00:08 HISTORY 258 78387 Dez 10 00:08 INSTALL 258 1423 Jan 20 2007 Makefile 258 1287 Mai 6 2008 README 258 4096 Fev 1 15:18 src

Para seguir adiante, basta digitar o comando abaixo, mas no faa agora no, vamos conversar primeiro: $./configure O comando acima est listado no arquivo INSTALL deste diretrio, voc at poderia seguir seus passos, mas vale uma pausa aqui. Precisamos instalar os pacotes requeridos pelo PostgreSQL. Para fazer tudo de uma s vez, execute o comando (no esquea de que onde houver # o comando deve ser realizado como root): #aptgetinstallgccmakelibreadline5devzlib1gdevflexbison O processo de instalao feito atravs da verstil ferramenta make (ou GNU Make para os mais puristas). Softwares que a utilizam constroem um roteiro ditando cada passo que deve ser feito no ato de instalao, como criar diretrios, checar existncia de dependncias, tomar decises de acordo com alguma configurao na mquina e, claro, modificar o roteiro de acordo com informaes do usurio. Este roteiro se chama GNUMakefile. Para cri-lo necessrio executar o arquivo configure presente na listagem acima. Este arquivo um punhado de shell scripts que podem receber parmetros em tempo de chamada (faremos isso daqui a pouco) e vo escrever o nosso GNUMakefile de acordo com eles ou com o padro de suas configuraes. Logo no incio das checagens do configure, ser gerado um erro se no tivermos na mquina 52

AdministraoProfissionaldoPostgreSQL1Primeirospassos nenhum compilador C (isso mesmo, nosso elefante tambm feito em C). Da a necessidade do primeiro pacote do comando anterior: gcc. Esse nosso bla-bla-bl sobre o make. Aps a execuo do configure, ele quem vai rodar o GNUMakefile gerado. Os demais pacotes so recomendados estarem instalados. Sem a libreadline5dev e a zlib1gdev, a princpio nosso configure no vai passar, mas seria possvel desabilit-las. J flex e bison no impedem a instalao, mas tambm so teis. Vejamos: Libreadline5 uma biblioteca utilizada pelo console de linha de comando psql para guardar o histrico de comandos realizados e poder navegar por ele com o uso das setas. um recurso extremamente til, sobretudo no nosso caso j que contamos apenas com o modo texto para administrar o servidor. Caso voc tenha tendncias masoquistas v em frente e use a opo withoutreadline na chamada ao configure. J Zlib utilizada pelos aplicativos de gerao e importao de backups (dumps) pg_dump e pg_restore. Sem ela, no ser possvel exportar e importar dumps compactados. Vou falar s por falar: se no quiser a zlib, use withoutzlib. Pronto, falei. Mas se voc disser que fui eu que falei isso, eu nego. Flex e Bison so ferramentas Lex e Yacc respectivamente que podem ser usadas separadamente. Com elas, possvel criar novos interpretadores de programao (parsers). No so fundamentais para o uso do PostgreSQL (a no ser que voc esteja instalando uma verso ainda em desenvolvimento), mas outras ferramentas como o Slony-I podem se valer delas. Calma, ainda no execute o configure. Pra qu tanta pressa? Vejamos algumas opes de configurao: I. TabelaAlgumasopesparaoconfigure Opo (--opo=valor_default) prefix=/usr/local/pgsql execprefix Pra que serve? Certamente a configurao mais utilizada. Com ela voc pode escolher o local base de instalao do servidor. Diretrio onde sero colocados arquivos dependentes da plataforma. Em geral no informada valendo o mesmo caminho de prefix. Se voc quiser, pode colocar todos os executveis do PostgreSQL em um diretrio especfico. Local onde sero dispostas bibliotecas necessrias para o servidor rodar corretamente

bindir=EXECPREFIX/bin libdir=EXECPREFIX/lib

includedir=PREFIX/include Onde sero salvos arquivos header C e C++ withblocksize=8 Define o tamanho (em Kb) da menor unidade de armazenamento. O PostgreSQL nunca vai ao disco escrever menos do que isso. Em geral, o padro 8Kb atende s necessidades. with*, Existem diversas opes with. S para citar 53

AdministraoProfissionaldoPostgreSQL1Primeirospassos withoutreadlinee withoutzlib algumas: withperl e withpython para instalar respectivamente as linguagens Perl e Python para programar as funes do banco. withopenssl para habilitar conexes cifradas (SSL). withkrb5, withpam, withldap para habilitar outros mtodos de autenticao de conexes. As opes without j foram citadas. Esses parmetros configuram o mecanismo WAL que nos aprofundaremos no captulo 4. A opo segsize expressa em Mb, pode ir de 2 a 64Mb e tem como padro 16Mb. A opo blocksize semelhante opo withblocksize.

withwalsegsize=16, withwalblocksize=8

Existem diversas outras opes, para conhec-las consulte a documentao oficial no endereo: www.postgresql.org/docs/8.4/interactive/install-procedure.html.
InstalandooPostgreSQLapartirdocdigofonte

Agora que acabou nosso bla-bla-bl, execute o ./configure. Ah, j havia executado? Tranquilo. Listando o diretrio novamente voc vai ver o GNUMakefile gerado:
debian-pgsql:~postgresql-8.4.2# ls total 2020 -rw-r--r-- 1 258 258 445 Abr drwxrwxrwx 2 258 258 4096 Fev -rw-r--r-- 1 root root 227713 Fev -rwxr-xr-x 1 root root 39990 Fev -rwxr-xr-x 1 258 258 801991 Dez -rw-r--r-- 1 258 258 61120 Dez drwxrwxrwx 41 258 258 4096 Fev -rw-r--r-- 1 258 258 1192 Jan drwxrwxrwx 5 258 258 4096 Fev -rw-r--r-- 1 root root 4331 Fev -rw-r--r-- 1 258 258 4331 Jan -rw-r--r-- 1 258 258 779345 Dez -rw-r--r-- 1 258 258 78387 Dez -rw-r--r-- 1 258 258 1423 Jan -rw-r--r-- 1 258 258 1287 Mai drwxrwxrwx 14 258 258 4096 Fev -l 23 1 1 1 9 9 1 1 1 1 14 10 10 20 6 1 2004 15:03 15:18 15:18 23:56 23:56 15:03 2009 15:21 15:18 2009 00:08 00:08 2007 2008 15:18 aclocal.m4 config config.log config.status configure configure.in contrib COPYRIGHT doc GNUmakefile GNUmakefile.in HISTORY INSTALL Makefile README src

O make baseado em alvos que voc passar no ato da chamada. Execute a instruo: $make Ela equivale a dizer makeall. Isto ir compilar o servidor para instalao posterior. Execute agora: $makeinstall Note que colocamos aqui o sinal $ para representar a no obrigatoriedade de realizar o comando 54

AdministraoProfissionaldoPostgreSQL1Primeirospassos como root. No entanto, se voc executou o ./configure sem opes de mudana de diretrio (ex.: prefix), o padro ser instalar no diretrio /usr/local/pgsql que certamente no existe e dever ser criado no makeinstall. Acontece que o diretrio /usr/local pertence ao root e s ele tem permisses de escrita neste diretrio. Em bom portugus, cara plida: Roda esta bagaa como root mesmo.
Psinstalao

Olha a, o passo anterior foi fcil demais. S que ele apenas instalou o servidor no prefix. Checa l que o contedo dele: #lsl/usr/local/pgsql total16 drwxrsrx2rootstaff4096Fev414:26bin drwxrsrx6rootstaff4096Fev414:26include drwxrsrx3rootstaff4096Fev414:26lib drwxrsrx7rootstaff4096Fev414:26share importante agora criar um usurio para administr-lo. A nica recomendao que este usurio conhecido como o cara no nosso servidor deve ser um usurio digamos xelelento no sistema operacional, ou seja, esquea o root, vamos criar outro. Normalmente ele se chama postgres e est sozinho no grupo postgres ( meio autista o rapaz). Digite o comando abaixo para criar o usurio: #adduserpostgres No somos obrigados a chamar o usurio de postgres. Em minhas aulas, costumo at pedir para que os alunos criem um usurio com o nome deles, primeiro porque o postgres j est criado e j h uma outra instalao do PostgreSQL nas mquinas para as turmas de outras disciplinas. Mas tambm gosto de deixar claro que o superusurio do PostgreSQL normalmente, mas no obrigatoriamente, o postgres. Este comando vai lhe solicitar algumas coisas listadas em destaque nas mensagens abaixo: Adicionandoousurio`postgres'... Adicionandonovogrupo`postgres'(1001)... Adicionandonovousurio`postgres'(1001)aogrupo`postgres'... Criandodiretriopessoal`/home/postgres'... Copiandoarquivosde`/etc/skel'... DigiteanovasenhaUNIX: RedigiteanovasenhaUNIX: passwd:senhaatualizadacomsucesso. Modificandoasinformaesdeusurioparapostgres InformeonovovaloroupressioneENTERparaaceitaropadro

55

AdministraoProfissionaldoPostgreSQL1Primeirospassos NomeCompleto[]:postgres NmerodaSala[]: FonedeTrabalho[]: FoneDomstico[]: Outro[]: Istheinformationcorrect?[Y/n]y Acredito que a sada seja bastante intuitiva pra no precisar explicar. Apenas note que no criei o grupo, o adduser criou pra mim. Adduser na realidade um script em perl pra facilitar as coisas. Ele chama por baixo dos panos os comandos do sistema useradd (concordo, isso confunde mesmo) para criar o usurio e groupadd para criar o grupo dele. Caso voc esteja querendo fazer algum script que crie automaticamente um usurio (sem interao humana), use useradd e veja como ele recebe parmetros que definem grupo, diretrio home, shell padro, etc atravs do comando manuseradd. No entanto, se voc quer apenas criar um usurio, adduser me parece uma escolha mais saudvel. Criado nosso usurio, vamos iniciar o database cluster atravs do comando initdb. Nota: O termo cluster usado tambm no PostgreSQL no a ver com um conjunto de mquinas de provem um servio como se fossem uma s, mas sim em meno ao conjunto de arquivos utilizados para prover uma instncia do banco. Ou seja, quando o servio estiver ativo, database cluster significa quais arquivos iro armazenar os dados de todas as bases, incluindo data files e logs de transaes (WAL). A menos que voc crie novas tablespaces, todo o contedo fsico das bases de uma instncia ativa do PostgreSQL estar salva no interior do diretrio database cluster pr-configurado pelo initdb. Os passos so os seguintes: 1. #mkdir/usr/local/pgsql/data 2. #chownpostgres:postgres/usr/local/pgsql/data 3. #supostgres 4. $cd/usr/local/pgsql 5. $bin/initdbDdata Pra o bonde que eu quero descer. Ningum aqui rob pra s repetir comando sem saber o que est realmente fazendo (tenho alguns amigos robs que so assim). No passo 1, ns, ento como usurio root (olha a #, t cego? Desculpe, me exaltei!), criamos um subdiretrio chamado data no local onde instalamos o PostgreSQL. Lembra do ./configure prefix? Se no, volta um pouco a fita. No passo 2, com o comando chown (change owner), o caridoso root, disse que esse diretrio data 56

AdministraoProfissionaldoPostgreSQL1Primeirospassos em questo no pertence a ele e sim ao usurio postgres, do grupo postgres. Se voc criou um usurio com outro nome, mantenha a coerncia aqui e use ele. O initdb explode o monitor se voc tentar rod-lo em um diretrio pertencente ao root, cuidado. Mentira, ele vai fazer isso aqui : $bin/initdbDdata Thefilesbelongingtothisdatabasesystemwillbeownedbyuser "postgres". Thisusermustalsoowntheserverprocess. Thedatabaseclusterwillbeinitializedwithlocalept_BR.UTF8. ThedefaultdatabaseencodinghasaccordinglybeensettoUTF8. Thedefaulttextsearchconfigurationwillbesetto"portuguese". fixingpermissionsonexistingdirectorydata...initdb:couldnot changepermissionsofdirectory"data":Operaonopermitida Olha l a ltima linha. O initdb muda as permisses do diretrio para s o nosso novo usurio poder mexer com ele, os demais no conseguiro fazer nada (dando o famoso chmod700data). Se no conseguir, ele aborta a operao. No passo 3, nos tornamos o usurio postgres. J no 4, fomos at o diretrio data criado na instalao. No 5, executamos o initdb para que ele monte a infraestrutura necessria dentro do diretrio data. O resultado ser apresentado na tela como o disposto abaixo. Vale ressaltar que ainda vamos discutir o initdb com mais detalhes, o foco no esse por enquanto. Thefilesbelongingtothisdatabasesystemwillbeownedbyuser "postgres". Thisusermustalsoowntheserverprocess. Thedatabaseclusterwillbeinitializedwithlocalept_BR.UTF8. ThedefaultdatabaseencodinghasaccordinglybeensettoUTF8. Thedefaulttextsearchconfigurationwillbesetto"portuguese". fixingpermissionsonexistingdirectorydata...ok creatingsubdirectories...ok selectingdefaultmax_connections...100 selectingdefaultshared_buffers...28MB creatingconfigurationfiles...ok creatingtemplate1databaseindata/base/1...ok

57

AdministraoProfissionaldoPostgreSQL1Primeirospassos initializingpg_authid...ok initializingdependencies...ok creatingsystemviews...ok loadingsystemobjects'descriptions...ok creatingconversions...ok creatingdictionaries...ok settingprivilegesonbuiltinobjects...ok creatinginformationschema...ok vacuumingdatabasetemplate1...ok copyingtemplate1totemplate0...ok copyingtemplate1topostgres...ok Success.Youcannowstartthedatabaseserverusing: bin/postgresDdata or bin/pg_ctlDdatallogfilestart WARNING:enabling"trust"authenticationforlocalconnections Youcanchangethisbyeditingpg_hba.conforusingtheAoption nexttimeyouruninitdb. Telecurso 2000, vamos traduzir esse ingris a: Osarquivospertencentesaestesistemaebancodedadossero propriedadedousuriopostgres. Esteusuriodevetambmserodonodoprocessodoservidor. Odatabasecluster(claro que no vou traduzir isso) serinicializadocomo localept_BR.UTF8. AcodificaopadrodeacordofoisetadaparaUTF8. Aconfiguraodepesquisadetextoserdefinidacomoportugus. Ajustandopermissesnodiretriodata...ok (olha a a fonte da discrdia, a culpa de no ter rodado antes dessa linha) criandosubdiretrios...ok selecionandoopadromax_connections...100 selecionandoopadroshared_buffers...28MB 58

AdministraoProfissionaldoPostgreSQL1Primeirospassos criandoarquivosdeconfigurao...ok(vamos falar muito deles ainda) criandoabasetemplate1emdata/base/1...ok(tambm falaremos mais sobre isso) iniciandopg_authid...ok iniciandodependncias criandosystemviews...ok carregandodescriesdeobjetosdesistema...ok criandoconverses...ok definindoprivilgiosnosobjetosnativos...ok criandoinformationschema...ok(um esquema que abordaremos tambm) vacuumingdatabasetemplate1...ok(vacuum tambm ser explorado aqui) copiandotemplate1paratemplate0...ok copiandotemplate1parapostgres...ok Sucesso.Vocjpodeiniciaroservidorusando: bin/postgresDdata ou bin/pg_ctlDdatallogfilestart Olha s, j foi criada a base de dados template1 e duas outras foram criadas a partir delas: template0 e postgres. Vale ressaltar que mesmo que o usurio owner do banco no seja o postgres, ser criada uma base de dados postgres, mas no ser criada uma base de dados para o outro usurio. Da a indicao de se usar o postgres mesmo. Olha s o contedo do diretrio data agora: postgres@debianpgsql:/usr/local/pgsql$lsldata total68 drwx5postgrespostgres4096Fev509:11base drwx2postgrespostgres4096Fev509:11global drwx2postgrespostgres4096Fev509:11pg_clog rw1postgrespostgres3652Fev509:11pg_hba.conf rw1postgrespostgres1631Fev509:11pg_ident.conf drwx4postgrespostgres4096Fev509:11pg_multixact drwx2postgrespostgres4096Fev509:11pg_stat_tmp drwx2postgrespostgres4096Fev509:11pg_subtrans drwx2postgrespostgres4096Fev509:11pg_tblspc drwx2postgrespostgres4096Fev509:11pg_twophase 59

AdministraoProfissionaldoPostgreSQL1Primeirospassos rw1postgrespostgres4Fev509:11PG_VERSION drwx3postgrespostgres4096Fev509:11pg_xlog rw1postgrespostgres16819Fev509:11postgresql.conf A gente ainda vai conversar muito sobre esse pessoal a.
Inicializao

Iniciar o servidor simples tambm. H um comando vizinho do initdb, no diretrio bin, chamado postgres para esta tarefa. Antigamente este arquivo se chamada postmaster. Eles resolveram trocar para postgres para ser mais intuitivo, mas por razes histricas eu acredito, ainda existe um link simblico l chamado postmaster. Em resumo, postgres e postmaster so Batman e Bruce Wayne. Voc pode iniciar o servidor com o seguinte comando: postgres@debianpgsql:/usr/local/pgsql$bin/postgresDdata O que vem antes do comando em negrito s pra lhe mostrar o diretrio onde estamos para realizar este comando. O problema que desta forma, todos os logs gerados nas operaes do banco sero jogados na tela e voc ter o console travado enquanto o servio do banco estiver ativo. Seria melhor fazer ento (estando no mesmo diretrio, s omiti aqui pra no encarecer seu livro): $bin/postgresDdata>data/logfile2>&1& Agora, todas as mensagens da sada padro (stdout) sero desviadas para o arquivo chamado logfile, criado dentro de data. J a sada de erro (stderr), devido ao trecho 2>&1, ser tambm desviada para a sada 1 que a stdout, o vai acabar parando no mesmo arquivo. J o & do final para liberar o console. Alm do postgres e seu alter-ego postmaster, existe um script bem legal chamado pg_ctl. Para iniciar com ele obtendo o mesmo resultado do comando anterior, use: $bin/pg_ctlllogfileDdatastart Ele mais legal por ser mais limpo e possuir comandos como start, stop e restart.
Customizaes,facilitaeseautomatizaes

Vamos simplificar a vida do nosso usurio postgres. Para isso, edite o arquivo .bashrc no diretrio home do usurio postgres. Vamos aos passos: #aptgetinstallvim #supostgres $vi.bashrc A primeira instruo instalou o pacote de melhorias (VI Improvement) pro editor Vi. Voc pode optar por no executar esse comando e ou usar o Vi cru (voc tomou seu remdio hoje?) ou usar algum editor de texto sua escolha como o pico ou seu sucessor nano.

60

AdministraoProfissionaldoPostgreSQL1Primeirospassos Na segunda instruo voc se transformou no postgres (e o sinal de menos foi para voc ser direcionado ao diretrio home do postgres). J na terceira, voc est abrindo para edio o arquivo .bashrc presente neste diretrio. Este arquivo sempre lido ao logon do usurio. Se voc no est familiarizado com o Vi, tecle a letra i para entrar no modo de insero. No vou entrar no mrito de ensinar o Vi, at porque tambm me considero um usurio bsico dele, mas saiba que um editor que aceita comando, mas quando est no modo insero, vai aceitar digitaes para dentro do texto. Existem alguns comando alias que esto comentados (iniciam com a #). Costumo retirar o comentrio para contar com comandos como ll, que j realiza umlsl. Depois, v at o final do arquivo e insira as seguintes linhas: exportPGDATA=/usr/local/pgsql/data exportPATH=$PATH:/usr/local/pgsql/bin A primeira linha cria uma varivel de ambiente til para os aplicativos do PostgreSQL. Isto inclui o initdb, o postgres e o pg_ctl para que eles no precisem digitar a opo -D e informar o database cluster. A segunda linha altera a varivel de ambiente PATH. Ela traz os caminhos para arquivos para os diretrios onde o interpretador de comandos vai varrer em busca de qualquer comando digitado. Assim, no ser necessrio informar o caminho para os comandos postgres, pg_ctl ou quaisquer outros do diretrio bin de nossa instalao. Depois, tecle ESC e digite :wq (w para salvar write e q para sair quit). Este arquivo s ser lido no prximo logon do usurio. Ento d o comando exit e entre com o su postgres novamente. Agora saia. Vamos voltar a ser o root. Vamos dizer ao sistema que queremos iniciar o PostgreSQL no boot da mquina. O diretrio contrib da instalao (aquele diretrio que voc listou no ano passado logo aps o comando tar) traz uma srie de coisas interessantes (que vamos inclusive citar outras mais). Nele h um subdiretrio startscripts com scripts que vo servir para iniciar o banco em arquiteturas diferentes. O script que queremos o do arquivo linux. Vamos aos comandos: debianpgsql:~postgresql8.4.2#cpcontrib/startscripts/linux /etc/init.d/postgresql debianpgsql:~postgresql8.4.2#updaterc.dpostgresqlstart982. stop20016. A primeira linha copia o script dentro do contrib/startscripts para o diretrio /etc/init.d/ que reservado na maioria das distribuies linux para scripts de start, stop, restart dos servios. Isso vai ser necessrio para o segundo comando. Note que inseri e destaquei em negrito o label anterior ao cursor para voc prestar ateno onde deve estar para executar o comando uma vez que utilizei um caminho relativo. Em resumo, esteja no diretrio de instalao ou reflita o caminho at o diretrio. J seria possvel efetuar o start do servidor chamando o comando /etc/init.d/postgresql start. Veja o contedo desse arquivo, ele vai chamar o pg_ctl pra repassar o start pra ele. O segundo comando um pouco mais obscuro e requer uma explicao prvia. 61

AdministraoProfissionaldoPostgreSQL1Primeirospassos Em ambientes Unix, existe o conceito de runlevels (nveis de execuo). Estes so categorizaes de operaes do sistema. Em outras palavras, quais processos devo levantar (ou derrubar) no momento que um determinado runlevel for chamado. No Debian, os runlevels so: 0 Nvel de desligamento (halt) 1 Nvel single user / modo mnimo 2 a 5 Nveis de inicializao do sistema (o padro o 2) 6 Nvel de religamento (reboot) Se voc inventar de executar o comando init 0, vai mandar o sistema desligar, uma vez que todos os scripts configurados para disparar no runlevel 0 chamam sua opo stop. O comando updatercpostgresql vai dizer que queremos atualizar as chamadas automticas ao script postgresql (aquele que ns criamos no comando cp anterior). Dissemos que queremos que o sistema operacional chame o script passando o parmetro start, com prioridade 98 no runlevel 2 (o que chamado por padro quando ligamos a mquina). Dissemos que queremos chamar com o parmetro stop com prioridade 20 nos runlevels 0, 1 e 6. Prioridade? O que isso? simplesmente a ordem de chamada ao script. A senha da fila do caixa de um banco. Quando inventamos este nmero cabalstico 98 (sugerido pelo prprio script postgresql que criamos no /etc/init.d), apenas demos uma ordem muito alta, o que vai colocar o nosso servio PostgreSQL no final da fila de inicializaes. Isso bom, afinal o banco s deve iniciar depois de alguns servios fundamentais do sistema j terem iniciado. No stop, fizemos o contrrio, o nmero 20 j mais baixo, o que deve colocar o PostgreSQL para ser desligado logo no incio de desligamentos de servios no shutdown da mquina. Olha s a listagem do diretrio /etc/rc0.d, que traz links para os scripts chamados neste runlevel. A linha do PostgreSQL foi destacada em negrito. O K remete a kill (chamamos com a opco stop) e o nmero 20 colocou ele no comeo da lista. #ll/etc/rc0.d total4 lrwxrwxrwx1rootroot13Fev114:47K11atd>../init.d/atd lrwxrwxrwx1rootroot15Fev114:47K20exim4>../init.d/exim4 lrwxrwxrwx1rootroot20Fev114:47K20nfscommon>../init.d/ nfscommon lrwxrwxrwx1rootroot23Fev114:47K20openbsdinetd> ../init.d/openbsdinetd lrwxrwxrwx1rootroot20Fev515:51K20postgresql>../init.d/ postgresql lrwxrwxrwx1rootroot20Fev114:29K25hwclock.sh>../init.d/ hwclock.sh lrwxrwxrwx1rootroot26Fev114:29K63mountoverflowtmp> ../init.d/mountoverflowtmp 62

AdministraoProfissionaldoPostgreSQL1Primeirospassos lrwxrwxrwx1rootroot17Fev114:29K90rsyslog> ../init.d/rsyslog rwrr1rootroot353Dez232007README lrwxrwxrwx1rootroot18Fev114:29S20sendsigs> ../init.d/sendsigs lrwxrwxrwx1rootroot17Fev114:29S30urandom> ../init.d/urandom lrwxrwxrwx1rootroot22Fev114:29S31umountnfs.sh> ../init.d/umountnfs.sh lrwxrwxrwx1rootroot17Fev114:47S32portmap> ../init.d/portmap lrwxrwxrwx1rootroot20Fev114:29S35networking>../init.d/ networking lrwxrwxrwx1rootroot18Fev114:30S36ifupdown> ../init.d/ifupdown lrwxrwxrwx1rootroot18Fev114:29S40umountfs> ../init.d/umountfs lrwxrwxrwx1rootroot20Fev114:29S60umountroot>../init.d/ umountroot lrwxrwxrwx1rootroot14Fev114:29S90halt>../init.d/halt Agora a listagem do /etc/rc2.d. Agora o PostgreSQL aparece com um S (start) e o nmero 98 o jogou pro fim da fila. #ll/etc/rc0.d total4 rwrr1rootroot556Ago122008README lrwxrwxrwx1rootroot17Fev114:29S10rsyslog> ../init.d/rsyslog lrwxrwxrwx1rootroot15Fev114:31S12acpid>../init.d/acpid lrwxrwxrwx1rootroot15Fev114:47S20exim4>../init.d/exim4 lrwxrwxrwx1rootroot20Fev114:47S20nfscommon>../init.d/ nfscommon lrwxrwxrwx1rootroot23Fev114:47S20openbsdinetd> ../init.d/openbsdinetd lrwxrwxrwx1rootroot13Fev114:47S89atd>../init.d/atd lrwxrwxrwx1rootroot14Fev114:29S89cron>../init.d/cron lrwxrwxrwx1rootroot20Fev515:51S98postgresql>../init.d/ postgresql lrwxrwxrwx1rootroot18Fev114:29S99rc.local> 63

AdministraoProfissionaldoPostgreSQL1Primeirospassos ../init.d/rc.local lrwxrwxrwx1rootroot19Fev114:29S99rmnologin> ../init.d/rmnologin lrwxrwxrwx1rootroot23Fev114:29S99stopbootlogd> ../init.d/stopbootlogd


Instalaoviaaptget

Todo esse trabalho que tivemos (t, foi fcil, mas tivemos que executar algumas tarefas na unha) poderia ter sido dispensado se tivssemos instalado o postgresql atravs do apt-get. Do jeito que fizemos para instalar algumas bibliotecas necessrias. Execute o comando: #aptgetinstallpostgresqlpostgresqlcontrib Esse postgresql um metapacote que vai fazer o apt lhe perguntar se voc aprova a instalao dos pacotes libpq5, openssl, openssl-blacklist, postgresql, postgresql-8.3, postgresql-client-8.3, postgresql-client-common, postgresql-common, ssl-cert. O pacote postgresql-contrib vai instalar o pacote postgresql-contrib-8.3. Note que no Debian, no momento em que escrevo este material (denunciado pelas datas dos comandos ls utilizados) a verso do PostgreSQL no repositrio a 8.3. Este o nico comando necessrio para que ele baixe dos repositrios todos os pacotes citados, instale o servidor, crie o usurio postgres (se no existir previamente), execute o initdb. Detalhe: se j houver um PostgreSQL rodando na porta padro (5432), ele vai detectar e definir a configurao para outra porta 5433 ou uma prxima disponvel. Ele vai ainda iniciar o sistema, colocar os executveis no PATH, criar o script de inicializao e coloc-lo para iniciar e encerrar junto com o sistema. Ou seja, fazer absolutamente tudo que fizemos na mo. Ah, agora perdeu a graa! =) Achei importante falar do processo na mo anteriormente para que voc saiba o que realmente est acontecendo. Verifique no final deste processo os diretrios onde ele vai jogar nossos arquivos.

1.1.2 InstalaodoEnterpriseDBnoWindows
Desde os anos 80, nos idos do Post-Ingres (nosso conhecido postgres) do professor da Universidade da Califrnia Michael Stonebraker, muitas empresas apoiaram o projeto do hoje conhecido sob o slogan o mais avanado banco de dados open source do mundo. Nota: The world's most advanced open source database. Confira um link at mesmo cmico sobre iniciativas de atualizar este slogan no endereo: http:// momjian.us/main/blogs/pgblog/2010.html#January_29_2010. S pra citar algumas, a CommandPrompt, a EnterpriseDB e a SRA j lanaram verses comerciais do PostgreSQL, que possui licena BSD e permite este tipo de coisa. Fundada em 2004, a EnterpriseDB contratou diversos nomes de peso do universo em redor do PostgreSQL Global Development Group (PGDG), como Bruce Monjiam, Dave Page, Heikki Linnakangas, Korry Douglas, entre outros. Recebe tambm investimentos pesados de empresas de como a IBM, NTT, Red Hat, Sony, entre outras que vem no PostgreSQL uma alternativa vivel a 64

AdministraoProfissionaldoPostgreSQL1Primeirospassos produtos comerciais, sobretudo o Oracle (alis, o maior alvo dos produtos corporativos da EnterpriseDB) e na prpria EnterpriseDB como uma instituio de marca capaz 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. Nota: meu amigo, o mundo open source sim um mundo corporativo regido por empresas com interesses comerciais, por mais que s vezes selvagens, infelizmente legtimos. A prpria Sun h muito que investe bastante no PGDG, dispondo de um grupo liderado por Josh Berkus. Em 2008, ela adquiriu a MySQL AB, ento mantenedora do MySQL, o que assustou a comunidade PostgreSQL e em 2009 foi adquirida pela Oracle. O que levou at o prprio Monty Widenius, criador do MySQL, a mover uma campanha mundial ao estilo: Oh, e agora, quem poder nos defender? para que a Oracle no comprasse o MySQL temendo sua descontinuidade (http://helpmysql.org/pt/theissue/customerspaythebill). Posso estar defasado quando voc ler este material, mas at agora a Oracle nada mudou no MySQL a olho nu. Uma das contribuies mais notrias da EnterpriseDB comunidade o instalador do PostgreSQL para Windows, mantido por Dave Page. Para baix-lo, v seo download do site oficial do PostgreSQL (1) e clique no link do pacote binrio para Windows (2). 47 Onde encontrar o PostgreSQL para Windows

65

AdministraoProfissionaldoPostgreSQL1Primeirospassos

L, voc vai se deparar com o link (3) do One click installer. One click chega a ser propaganda enganosa, mas ele ser bem fcil de instalar tambm. 48 Link para o one click installer

66

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Voc ser levado pgina da EnterpriseDB para baix-lo de l. H verses para outras plataformas, mas estamos aqui em busca da verso Windows (4). 49 Link do one click installer para Windows na EnterpriseDB

67

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Efetuado o download, execute o arquivo para iniciar a instalao. 50 Incio da instalao no Windows

68

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Sabe aquelas instalaes NNF? (Traduo infame: Next-Next-Finish). quase isso. Na prxima tela confira o local onde ele pretende instalar nosso PostgreSQL. 51 Escolha do diretrio de instalao

69

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Ele reserva uma tela tambm para que voc possa escolher o diretrio do database cluster. Lembra dele? 52 Escolha do diretrio do database cluster

70

AdministraoProfissionaldoPostgreSQL1Primeirospassos

A prxima tela j a da escolha da senha do usurio postgres. Aqui, diferente do primeiro instalador para Windows que saiu na verso 8.0 do PostgreSQL, e ainda est disponvel at a verso 8.3, voc no escolhe o usurio, eles ser necessariamente o postgres. Se ele no existir, o instalador dever cri-lo, se existir, voc fornecer a senha dele. A nica recomendao que ele no seja Administrador. Nota: Um detalhe curioso que o instalador antigo recomendava que voc criasse senhas distintas para o usurio do Windows que detm o processo postgres e para o superusurio do banco. No entanto, aqui eles desistiram dessa idia, nem ao menos possvel fazer isso. 53 Escolha da senha do usurio postgres

71

AdministraoProfissionaldoPostgreSQL1Primeirospassos

A prxima tela inteira apenas para que voc escolha a porta onde ele vai rodar. Essa tela me deixou com pena da folha de papel gasta com sua impresso. 54 Escolha da porta

72

AdministraoProfissionaldoPostgreSQL1Primeirospassos

A prxima tela a das configuraes avanadas. Nem tanto. Escolha a regionalizao (locale) que preferir (falaremos mais sobre este assunto) e diga que voc concorda que a linguagem pl/pgsql seja instalada no template1, o que acabar replicando esta instalao para as demais bases criadas, uma vez que a template1 a template padro adotada nos CREATEs DATABASEs. 55 Tela de opes avanadas

73

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Opa. Agora est tudo pronto para instalar. 56 Pronto para instalar

74

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Note que assim como nos pacotes .deb no Linux, aqui a instalao vai rodar o initdb e iniciar o servidor. 57 Tela de incio da instalao

75

AdministraoProfissionaldoPostgreSQL1Primeirospassos

58 Tela de incio do servio

76

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Chegamos ao final. Agora, se voc pretender instalar softwares adicionais, clique em Finish com o checkbox marcado. Ele ir chamar o Stack Builder, que tambm estar disponvel no menu para chamadas posteriores. 59 Tela de finalizao da instalao

77

AdministraoProfissionaldoPostgreSQL1Primeirospassos

60 Tela inicial do Stack Builder Escolha o servidor ativo

78

AdministraoProfissionaldoPostgreSQL1Primeirospassos

61 Tela de opes de softwares adicionais do Stack Builder

79

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1.1.3 InstalaonoUbuntuviaSynaptic
Ainda mais fcil que a instalao no Windows, o gerenciador de pacotes Synaptic uma ferramenta grfica com funcionalidade semelhante ao apt-get. Nele, voc pode pesquisar algum software que ele vai buscar nos mesmos repositrios do apt-get. Nota: O Synaptic no exclusividade do Ubuntu nem to pouco o apt-get do Debian. possvel ter um ambiente desktop bastante interessante sem muito esforo no Debian, como tambm existe verso Server do Ubuntu. No entanto, o que pretendi aqui foi mostrar as duas distribuies onde elas so mais comuns. mais fcil achar drivers para ambiente visual no Ubuntu e voc viu como interessante realizar a instalao mnima do Debian para no congestionar seu sistema (e por que no dizer potencializar os riscos de segurana) com a instalao de pacotes que no sero utilizados pelo PostgreSQL. Nota: Os repositrios do Ubuntu so diferentes do Debian, mas so localizados a partir das configuraes do mesmo arquivo: /etc/apt/sources.list. Edite-o vontade se pretender adicionar ou remover novos repositrios de instalao. Para abrir o Synaptic, v ao menu: Sistema > Administrao > Gerenciador de Pacotes Synaptic. 62 Onde est o Synaptic

Voc j deve saber que no Ubuntu ns no logamos como root. Precisamos criar uma conta de usurio durante a instalao. Este usurio ser um sudoer, ou seja, um usurio que tem condies de se fazer passar por root se chamar um dos comandos sudo ou gksu (um sudo visual). O link para 80

AdministraoProfissionaldoPostgreSQL1Primeirospassos o Synaptic na verdade um comando gksusynaptic (se voc executar isso no terminal ter o mesmo resultado). 63 Tela inicial do Synaptic

Na tela inicial, digite Ctrl+F para abrir um pequeno dilogo para pesquisar. Entre com a palavra postgresql, voc ver a enorme quantidade de aplicativos ligados ao PostgreSQL. 64 Dilogo de pesquisa pelo postgresql

Com o boto direito, marque para instalar o meta pacote postgresql. Ele ir lhe informar que vai instalar os pacotes dispostos na imagem abaixo: 65 Tela de mudanas adicionais 81

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Instale tambm os pacotes postgresql-contrib (contribuies da comunidade) e pgadmin3 (cliente visual bem interessante instalado automaticamente no instalador do EnterpriseDB no Windows). 66 Pacotes a serem instalados

82

AdministraoProfissionaldoPostgreSQL1Primeirospassos

Trabalhoso como no mtodo apt-get. Ele vai efetuar o download de tudo que for necessrio, realizar o initdb e levantar nosso servidor. Voc poder levantar e ir ao banheiro se desejar (por favor, deixe o livro sobre a mesa). 67 Dilogo de efetuando o download

83

AdministraoProfissionaldoPostgreSQL1Primeirospassos

68 Tela final. O servidor est sendo iniciado. Olha s onde ficaro os arquivos

84

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1.2 InitdbInciododatabasecluster
O processo de criao do database cluster inicial merece um pouco mais de detalhamento. Alm do diretrio onde sero armazenados os arquivos de todos os databases criados, h outros parmetros que podemos passar neste momento. Confira os mais importantes deles na tabela abaixo: II. TabelaOpesdeparmetrosmaisutilizadosparaoinitdb Opo Ametodo auth=metodo Descrio Mtodo que o servidor ir utilizar para autenticar as conexes dos usurios da mquina local. O valor padro trust, que significa que o servidor vai confiar que usurio quem diz ser, sem nem perguntar qual a senha dele. Veremos mais este assunto no Captulo 3 Autenticaes e Permisses. 85

AdministraoProfissionaldoPostgreSQL1Primeirospassos Ddiretrio pgdata=diretrio Opo que j conhecemos (se voc pulou a seo de instalao no Debian, talvez tenha pulado o que no devia). Define o diretrio onde dever ser criada a infraestrutura necessria para armazenar os arquivos de todas as bases de dados. Esta informao obrigatria, no entanto este parmetro pode ser omitido se houver uma varivel de ambiente PGDATA. O initdb ir retornar uma falha caso o usurio em questo no seja dono do diretrio passado. O usurio que iniciar o servidor tambm dever ser o mesmo que detiver o diretrio e consequentemente executar o initdb. Eencoding encoding=encoding locale=locale, lc_collate=locale, lc_ctype=locale, lc_messages=locale, lc_monetary=locale, lc_numeric=locale, lc_time=locale Xdiretrio xlogdir=diretrio Especifica a tabela utilizada para representar os caracteres em campos desta natureza. Falaremos sobre este assunto em um tpico especfico mais adiante. Define a regionalizao padro das bases de dados criadas no cluster. As verses lc_* so idnticas opco locale, mas servem para uma subcategoria especfica de regionalizao. Apenas locale afeta todas as categorias. Este assunto tambm ser analisado no mesmo tpico que a opo encoding. Especifica o diretrio onde sero salvos os logs de transao. utilizado em algumas configuraes que buscam desempenho onde estes logs so gravados em um diretrio montado em uma controladora de disco exclusiva para isso. A opco padro o subdiretrio pg_xlog abaixo de pgdata. Trataremos deste assunto no Captulo 4 Write Ahead Log e no Captulo 8 Tuning. Nome do superusurio do banco. O padro o usurio do sistema que executar o initdb, no entanto possvel passar um usurio com um nome diferente dentro do servidor. O recomendado no utilizar esta opo, mas uma prtica utilizar o usurio postgres caso no seja este o nome do usurio no sistema operacional. Opo que simplesmente vai solicitar a senha do superusurio do banco. Sem esta opo o superusurio criado sem senha e voc no tem condies de conectar usando algum mtodo que precise de senha como password ou md5 at que defina uma entrando por algum outro mtodo de autenticao como trust ou ident. Falaremos sobre isto novamente no Captulo 3. Autenticaes e permisses.

Uusurio, username=usurio

W pwprompt

86

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1.2.1 Arquivosediretriosdocluster
Vamos tratar dos arquivos e diretrios gerados pelo init. Vamos dar uma olhada novamente no contedo do diretrio data. Iniciemos pelos diretrios: postgres@debianpgsql:/usr/local/pgsql/data$ll|grep^d drwx6postgrespostgres4096Fev515:56base drwx2postgrespostgres4096Fev911:50global drwx2postgrespostgres4096Fev509:11pg_clog drwx4postgrespostgres4096Fev509:11pg_multixact drwx2postgrespostgres4096Fev912:49pg_stat_tmp drwx2postgrespostgres4096Fev509:11pg_subtrans drwx2postgrespostgres4096Fev509:11pg_tblspc drwx2postgrespostgres4096Fev509:11pg_twophase drwx3postgrespostgres4096Fev509:11pg_xlog
Diretriobase

O diretrio base onde ficam os arquivos de dados de todos os objetos de cada database. Ele organizado em um subdiretrio para cada database, confira uma listagem inicial: llbase total20 drwx2postgrespostgres4096Fev1008:441 drwx2postgrespostgres4096Fev1008:4211563 drwx2postgrespostgres4096Fev1008:4411564 O diretrio 1 fcil. reservado aos arquivos da base template1. J os outros so reservados s bases template0 e postgres. Mas como saber qual deles? Vamos l, primeiramente vamos entrar no psql para buscar nas tabelas de catlogo. Considerando que voc j tenha configurado o caminho para o diretrio bin do PostgreSQL instalado (se instalou sem ser a partir de cdigos fonte, o instalador j fez isso por voc). Nota: Estou considerando que voc j tem um mnimo de familiaridade com instrues SQL e j teve contato com psql. Mesmo que este ltimo seja algum desconhecido, a prtica ao longo deste livro vai deix-lo mais familiarizado com a ferramenta. $psql psql(8.4.2) Type"help"forhelp. postgres=#selectdatname,oidfrompg_database; datname|oid 87

AdministraoProfissionaldoPostgreSQL1Primeirospassos + template1|1 template0|11563 postgres|11564 (3rows) A tabela de catlogo pg_database traz as informaes sobre as bases de dados j criadas. Veremos tabelas de catlogo no captulo 5 Rotinas Administrativas. O campo datname onde o nome de cada base armazenado. O oid (object identifier) um identificador de todo objeto no PostgreSQL. Nota: O PostgreSQL um SGBD que implementa diversas caractersticas do modelo objeto-relacional. Dentre elas o identificador de objetos. No PostgreSQL, cada tabela, sequncia, registro, database, etc, possui um identificador seguindo a premissa da OO que diz que todo objeto possui uma referncia. Apesar de alguns esforos nos padronizaes SQL ANSI mais recentes, o modelo objeto-relacional no um padro claramente definido. Inclusive foi visto por muitos como algo que trouxe mais complexidade aos SGBDs relacionais. Eles diferem bastante em o qu e como implementam. Uma boa leitura sobre o assunto o livro de um dos precursores do PostgreSQL, o professor Michael Stonebraker, Object-Relational DBMSs: The Next Great Wave, Morgan Kaufmann Pub. um pouco antigo, de 1996, mas uma leitura bem interessante. Um material bem interessante, apesar de tambm no to recente (2003), disponvel na site da ULBRA-RS sobre como o PostgreSQL implementa o modelo objeto-relacional o TCC de Denise Boness Cunha entitulado: Estudo comparativo sobre caractersticas de bancos de dados objeto relacionais, onde ela discute como o PostgreSQL e o Oracle tratam este modelo. H uma ferramenta, disponvel apenas no contrib, chamada oid2name. Vamos instal-la para no precisar realizar consultas diretamente nas tabelas do catlogo. debianpgsql:~/postgresql8.4.2/contrib/oid2name#make gccO2WallWmissingprototypesWpointerarithWdeclaration afterstatementWendiflabelsfnostrictaliasingfwrapv I../../src/interfaces/libpqI.I../../src/includeD_GNU_SOURCE cooid2name.ooid2name.c gccO2WallWmissingprototypesWpointerarithWdeclaration afterstatementWendiflabelsfnostrictaliasingfwrapv oid2name.oL../../src/portlpgportL../../src/interfaces/libpq lpqL../../src/portWl,asneededWl,rpath,'/usr/local/pgsql/ lib'lpgportlzlreadlinelcryptldllmooid2name debianpgsql:~/postgresql8.4.2/contrib/oid2name#cpoid2name/usr/ local/pgsql/bin/ 88

AdministraoProfissionaldoPostgreSQL1Primeirospassos Estamos no diretrio oid2name do contrib, execute o comando make para compilar a ferramenta. Depois copie para o diretrio bin do servidor instalado. Ao logar como postgres, simplesmente execute o comando abaixo: postgres@debianpgsql:~$oid2name Alldatabases: OidDatabaseNameTablespace 11564postgrespg_default 11563template0pg_default 1template1pg_default Nota: O executvel oid2name funciona de modo semelhante s demais ferramentas do diretrio bin que precisem conectar ao servidor (e.g. psql, createdb, etc). Consulte oid2namehelp para mais opes de comando. O nome do diretrio de cada base de dados justamente o OID dele que voc pde conferir na consulta acima ou atravs da oid2name. Vamos criar uma nova base e verificar o diretrio criado. postgres=#CREATEDATABASElivro; CREATEDATABASE postgres=#\q postgres@debianpgsql:/usr/local/pgsql/data$llbase/ total16 drwx2postgrespostgres4096Fev1008:441 drwx2postgrespostgres4096Fev1008:4211563 drwx2postgrespostgres4096Fev1008:4411564 drwx2postgrespostgres4096Fev1008:5016384 Um novo diretrio (16384) criado automaticamente. Dentro de cada um desses diretrios, existem diversos arquivos. Se voc um dia pensou que a base template1 era vazia, d s uma olhada no contedo de seu diretrio. postgres@debianpgsql:/usr/local/pgsql/data$lsbase/1 112114742602_vm2615_fsm266327023600_fsm 1131147626032615_vm266427033600_vm 11447114772603_fsm2616266527043601 11447_fsm114792603_vm2616_fsm266627533601_fsm 11447_vm1148126042616_vm26672753_fsm3601_vm 1144912472605261726682753_vm3602 114511247_fsm2605_fsm2617_fsm266927543602_fsm 114521247_vm2605_vm2617_vm267027553602_vm 89

AdministraoProfissionaldoPostgreSQL1Primeirospassos 11452_fsm124926062618267327563603 11452_vm1249_fsm2606_fsm2618_fsm267427573603_fsm 114541249_vm2606_vm2618_vm267528303603_vm 11456125526072619267828313604 114571255_fsm2607_fsm2619_fsm267928323605 11457_fsm1255_vm2607_vm2619_vm268028333606 11457_vm125926082620268128343607 114591259_fsm2608_fsm2620_fsm268228353608 114611259_vm2608_vm2620_vm268328363609 11462141726092650268428373712 11462_fsm14182609_fsm2651268528383764 11462_vm1742609_vm265226862838_fsm3764_fsm 114641752610265326872838_vm3764_vm 1146623282610_fsm2654268828393766 1146726002610_vm2655268928403767 11467_fsm2600_fsm2611265626902840_fsm548 11467_vm2600_vm2612265726912840_vm549 1146926012612_fsm265826922841PG_VERSION 114712601_fsm2612_vm265926933501 114722601_vm2613266026963502 11472_fsm26022614266126993503 11472_vm2602_fsm2615266227013600 Todos esses arquivos foram gerados a partir dos objetos existentes na base de dados. Por mais que a template1 normalmente no tenha nenhuma tabela criada no esquema padro (public), ela j traz 5 esquemas, onde os outros possuem sim diversos objetos. $psqltemplate1 psql(8.4.2) Type"help"forhelp. template1=#\dn Listofschemas Name|Owner + information_schema|postgres pg_catalog|postgres

90

AdministraoProfissionaldoPostgreSQL1Primeirospassos pg_toast|postgres pg_toast_temp_1|postgres public|postgres (5rows) Os nmeros dos arquivos no interior dos diretrios de cada base de dados pode ser mas no necessariamente o OID dos objetos da base. H uma tabela no esquema pg_catalog chamada pg_class que registra cada tabela ou ndice criado. Vou criar uma tabela na base que gerei para mostrar a gerao do arquivo: template1=#\clivro psql(8.4.2) Youarenowconnectedtodatabase"livro". livro=#CREATETABLEcapitulo(idserialprimarykey, livro#nomevarchar(50)); NOTICE:CREATETABLEwillcreateimplicitsequence "capitulo_id_seq"forserialcolumn"capitulo.id" NOTICE:CREATETABLE/PRIMARYKEYwillcreateimplicitindex "capitulo_pkey"fortable"capitulo" CREATETABLE Vejamos agora uma consulta tabela pg_class para verificarmos onde nossa nova tabela ser armazenada. livro=#SELECTrelname,relfilenode,oid livro#frompg_classwhererelname='capitulo'; relname|relfilenode|oid ++ capitulo|16387|16387 livro=#\q postgres@debianpgsql:/usr/local/pgsql/data$llbase/16384/16387 16387 rw1postgrespostgres0Fev1009:0416387 O campo relname registra os nomes dos objetos e o oid um nmero que os identifica. A novidade fica por conta do campo relfilenode, que inicialmente o mesmo do oid, mas ele quem realmente identifica o arquivo gerado no disco. Vamos a uma prtica para mostrar porque eles podem diferir: livro=#INSERTINTOcapitulo(nome)values('Introduo'); INSERT01 At a, nada demais, apenas inserimos um registro na tabela. 91

AdministraoProfissionaldoPostgreSQL1Primeirospassos livro=#TRUNCATEcapituloRESTARTIDENTITY; TRUNCATETABLE livro=#INSERTINTOcapitulo(nome)values('Introduo'); INSERT01 Agora, truncamos a tabela e reinserimos o valor. Voc bem deve saber que o TRUNCATE funciona como um DELETE sem filtro, ou seja, apaga todos os registos, no entanto sua operao DDL e no DML, como o DELETE. Na prtica, o TRUNCATE realiza um DROP na tabela e um novo CREATE com as mesmas caractersticas. Nota: Uma novidade do PostgreSQL 8.4 a opo RESTART IDENTITY, que assim como ALTER SEQUENCE nome_sequencia RESTART, reinicia a sequncia. livro=#selectrelname,oid,relfilenode,reltuples, livro#relpages*8*1024assize livro#frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltuples|size ++++ capitulo|16387|16397|0|0 (1row) Verifique agora que o relfilenode est diferente do oid. Descendo mais ainda o nvel, veremos que o PostgreSQL copiou o arquivo da tabela para um novo e apagou o anterior. Para no perder o link para o arquivo, ele ajustou o relfilenode na tabela pg_class. Nota: Outros comandos alteram o refilenode. Alm do TRUNCATE, as instrues REINDEX e CLUSTER e alguns tipos de ALTER TABLE tambm o fazem. A ferramenta oid2name tambm retorna o relfilenode da tabela, para isso execute o comando: $oid2nametcapitulodlivro Fromdatabase"livro": FilenodeTableName 16397capitulo O que so essas colunas reltuples e relpages utilizadas anteriormente? Elas trazem, respectivamente, o nmero de tuplas (registros) e o nmero de unidades de escrita (pginas) utilizadas para armazenas essas informaes no disco. Nota: Lembra quando tratamos do parmetro para ./configure na instalao via fontes no Debian? L foi citado o parmetro with blocksize onde era possvel definir o tamanho dessas unidades de escrita. O valor padro 8Kb. Por isso, relpages * 8 * 1024 vai dar o nmero de unidades * 8Kb.

92

AdministraoProfissionaldoPostgreSQL1Primeirospassos Estranho, por que o valor delas est em zero? Eu no acabei de inserir um valor? Vamos tentar inserir outro pra ver se o PostgreSQL agora pega no tranco. livro=#INSERTINTOcapitulo(nome)values('Primeirospassos'); INSERT01 livro=#selectrelname,oid,relfilenode,reltuples, livro#relpages*8*1024assize livro#frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltuples|size ++++ capitulo|16387|16397|0|0 (1row) Deu na mesma. Ser que ele t com defeito? Felizmente no! Nosso dignssimo elefante no tem bugs (o pessoal que participa do seu desenvolvimento vai gostar de ler esta frase). Isso ocorre porque as tabelas de catlogo no so alteradas sempre, seria custoso fazer isso a cada transao de manipulao. Imagine isso em um banco OLTP afogado em conexes. Felizmente, temos o comando ANALYZE para atualizar esses valores. livro=#ANALYZEcapitulo; ANALYZE livro=#selectrelname,oid,relfilenode,reltuples, livro#relpages*8*1024assize livro#frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltuples|size ++++ capitulo|16387|16397|2|8192 (1row) Agora foi! Vamos listar o diretrio novamente para verificar o que foi feito no disco: $lslhbase/16384/16397 rw1postgrespostgres8,0KFev1012:1016397 O arquivo anterior (16387), o mesmo do oid, j no existe mais. Agora, temos um arquivo com outro nmero (16397), que bate justamente com relfilenode e seu tamanho exatamente o relpages * 8Kb (blocksize). Quando o valor de reltuples era 1, relpages foi 1 tambm. Quando inserimos mais um registro e reltuples foi atualizado para 2, relpages continuou valendo 1. Isto significa que o contedo dos dois registros coube em apenas uma pgina (8Kb). Nota: Uma forma de saber se seu banco possui registros grandes ou 93

AdministraoProfissionaldoPostgreSQL1Primeirospassos pequenos verificar a razo reltuples / relpages. Quanto maior for este valor mais tuplas cabem em uma pgina de 8Kb (ou o tamanho definido em blocksize), quanto menor o contrrio. Se a resposta for entre 0 e 1 significa que, em mdia, seus registros consomem mais do que 8Kb no disco, cada.
Comooarmazenadorfunciona

Quando o PostgreSQL vai ao disco para ler uma informao de uma tabela, ele l pelo menos uma pgina (blocksize 8Kb), podendo ler mais caso o contedo seja 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 Captulo 5. Rotinas administrativas, ao tratarmos de Vacuum. Sabendo que o disco possui um desempenho, por melhor que seja, bem inferior ao da memria principal, o PostgreSQL, a cada consulta, l essas pginas de dados e armazena em uma rea de memria denominada buffer cache. Cada pgina do disco compe uma pgina no buffer cache em memria. Este buffer compartilhado por todos os processos criados a partir das conexes ao servidor. Quando o servidor precisar ler uma nova pgina, tentar coloc-la no cache e o buffer j estiver completamente cheio, uma pgina menos utilizada ser apagada (page eviction), o que vai forar uma nova leitura de disco caso seu dado precisar ser relido por algum cliente conectado. O tamanho do buffer regido pelo parmetro shared_buffers do arquivo principal de configurao do cluster postgresql.conf. A princpio, antes da anlise mais aprofundada que faremos no Captulo 8 Tuning, aumentar o shared_buffers indica melhor desempenho em consultas. Cada transao precisa que os dados estejam no disco (mdia persistente) para que seja considerada finalizada. O PostgreSQL adota o processo de log antes da escrita (WAL), o que significa que as pginas de dados alteradas so salvas em arquivos sequenciados (normalmente, no diretrio pg_xlog), mas so mantidas tambm em memria. Quando h uma nova consulta que precise de tuplas contidas nas pginas que ainda esto apenas nesses arquivos WAL, o servidor apenas l as pginas da memria, nunca precisa consultar esses arquivos. Quando uma dessas pginas precisa ser descarregada elas so consideradas sujas (em uma traduo ao p da letra para o termo dirty) ou modificadas, para trazer um termo que melhor explique sua situao em bom portugus, uma vez que ou ela est com seu contedo alterado ou ainda nem ao menos existe nos arquivos de dados (no diretrio base). Esta expulso do paraso da memria (dirty page eviction) provoca uma escrita nos arquivos de dados. Assim, o servidor continua sem precisar ler os arquivos WAL. Mas ento por que cargas d'gua ele gera esses arquivos. Simplesmente por ser mais rpido do que sobrescrever as pginas envolvidas em uma transao, que pode mexer com um nmero razovel de pginas no contguas, o que provocaria um movimento bem maior da controladora do disco. H um processo no servidor denominado bgwriter (escritor em background) que procura ler o contedo desses arquivos WAL e registrar suas informaes nas pginas de dados. D-se a essa leitura o nome de checkpoint. Mudando um pouco de assunto, se um registro for grande demais para exceder o tamanho da pgina, o PostgreSQL adota duas abordagens, compactao e fragmentao. Essas abordagens so denominadas TOAST The Oversized-Atribute Storage Technique. Campos que no vo admitir valores grandes como um VARCHAR de tamanho limitado ou nmeros no podem ser TOASTados 94

AdministraoProfissionaldoPostgreSQL1Primeirospassos (perdo pelo neologismo, TOASTado at que soa legal =). Isso bom porque o TOAST adiciona um certo overhead em leituras e escritas que no deve recair em campos menores. Este overhead s vai compensar em campos maiores, para que eles no gerem muito deslocamento do ponteiro ao percorrer os valores menores. ndices tambm podem ser TOASTados. Apenas de, em geral, os campos que podem ser maiores de 8Kb no serem bons candidatos a ndice, se voc criar um sobre um campo desta natureza o arquivo gerado para o ndice tambm ter um comportamento semelhante ao que vamos explicar com as tabelas. Antes de prosseguir, vejamos o seguinte cenrio: livro=#\dcapitulo Table"public.capitulo" Column|Type|Modifiers ++ id|integer|default... nome|charactervarying(50)| descricao|text| Indexes: "capitulo_pkey"PRIMARYKEY,btree(id) Aqui, apenas refresquei sua memria com relao estrutura da tabela utilizada at agora nos exemplos. Note que nenhum campo pode chegar a 8192 bytes (8Kb). livro=#selectrelname,oid,relfilenode,reltoastrelid frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltoastrelid +++ capitulo|16387|16397|0 (1row) A consulta a pg_class trouxe um campo novo chama reltoastrelid, que vai informar o nome do arquivo que ser utilizado para armazenar os valores que excederem 8Kb. Vamos criar um campo com potencial de ser TOASTado. livro=#ALTERTABLEcapituloADDdescricaotext; ALTERTABLE livro=#selectrelname,oid,relfilenode,reltoastrelid frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltoastrelid +++ capitulo|16387|16397|16399 (1row) 95

AdministraoProfissionaldoPostgreSQL1Primeirospassos Ao adicionar o campo descricao do tipo text, no estamos restringindo seu tamanho, o que gerou um arquivo, por enquanto zerado, cujo nome baseado no OID da tabela TOAST associada nossa tabela capitulo. No possuir tamanho definido umas das regras bsicas para um campo ser TOASTvel (legal TOASTvel tambm!). Esta tabela TOAST um procedimento totalmente transparente ao usurio, estou mostrando aqui porque domingo, o Fantstico est muito chato e voc est de bobeira querendo arrumar alguma coisa pra matar o tempo. Ao inserir um registro em uma tabela TOASTada, como a nossa agora, os primeiros 32 bits do campo do TOAST so reservados ao nmero que informa o tamanho do TOAST j incluindo o prprio espao ocupado por esses 32 bits. Ou seja, se a gente registrar apenas uma letra (um nico byte) no campo texto, o nmero expresso nesses 32 bits ser 33. Dos 32 bits do tamanho do TOAST, 2 no compem o nmero, so bits de controle. Sobram 30 bits. Se fizermos uma conta de padaria (nos tempos do cruzeiro quando as padarias lidavam com valores mais altos), veremos que 230 1073741824. Esse trem a em bytes equivale a 1048576 Kb, ou 1024Mb, ou 1Gb. Logo, um campo no PostgreSQL dever ter no mximo 1Gb (menos 1byte, afinal, em tese, tambm poderamos ter o valor zero). Pra que servem esses dois bits de controle? Bom, se vierem zerados, significa que o contedo do campo inserido coube na pgina de dados, sem precisar correr para a tabela TOAST. Se um dos bits vier ligado, significa que o contedo foi comprimido e armazenado ainda na pgina de dados. Se o outro vier ligado, porque o contedo no coube na pgina de dados e precisou ir para a tabela TOAST. O que fica na pgina de dados ento o endereo onde encontrar os dados no arquivo da tabela TOAST. Se os dois bits forem 1, tanto a compactao quanto a TOASTada foram aplicados. Existem 4 tipos de armazenamento em colunas TOASTveis. Confira a tabela: III.TabelaMtodosdearmazenamentoemtabelasTOAST Mtodo EXTENDED Descrio Mtodo padro para campos TOAST. Permite comprimir o valor a ser armazenado. Se este ainda for maior do que a pgina (blocksize 8Kb), o valor vai ser jogado ao arquivo da tabela TOAST. Assim como EXTENDED, permite TOASTar o dado inserido, mas no permite compresso do valor. Possui um desempenho melhor do que a anterior, uma vez que no haver o overhead da compactao, no entanto ocupa mais espao em disco. Permite compresso, mas procura evitar TOASTar os dados. Mtodo que torna um campo TOASTvel, no TOASTvel. Ou seja, campos como o text utilizado nos nossos exemplos vo gerar o arquivo da tabela TOAST em sua criao, mas no vo utiliz-la, nem mesmo tero seus valores compactados na pgina da tabela principal.

EXTERNAL

MAIN PLAIN

Estes tipos de armazenamento podem ser modificados em instrues ALTER TABLE, como na dinmica a seguir: livro=#INSERTINTOcapitulo(nome,descricao)values 96

AdministraoProfissionaldoPostgreSQL1Primeirospassos livro#('Opesdeconfigurao',repeat('teste',9999999)); INSERT01 A funo repeat, obviamente repete. Neste caso, o valor do campo descrio ser 9999999 vezes a palavra teste, o que vai resultar em mais de 500Kb. Confira: livro=#selectrelname,oid,relfilenode,reltoastrelid livro#frompg_classwhererelname='capitulo'; relname|oid|relfilenode|reltoastrelid +++ capitulo|16387|16397|16399 (1row) livro=#\q postgres@debianpgsql:/usr/local/pgsql/data$llbase/16384/16399* rw1postgrespostgres576KFev1022:3816399 rw1postgrespostgres24KFev1022:3816399_fsm Agora vamos forar a barra e definir um outro mtodo de armazenamento, o PLAIN que o mais restritivo. livro=#ALTERTABLEcapituloALTERCOLUMNdescricaoSETSTORAGE PLAIN; ALTERTABLE livro=#INSERTINTOcapitulo(nome,descricao)values ('Autenticaesepermisses',repeat('teste',9999999)); ERROR:rowistoobig:size50000048,maximumsize8164 STATEMENT:INSERTINTOcapitulo(nome,descricao)values ('Autenticaesepermisses',repeat('teste',9999999)); ERROR:rowistoobig:size50000048,maximumsize8164 A instruo SET STORAGE definiu o novo mtodo de armazenamento, mas ele no vai deixar que haja armazenamento no arquivo TOAST, ficando limitado pgina de dados. Pior, a pgina ainda perdeu seus 32 bytes iniciais por ser um campo TOASTvel.Verifique isso na mensagem de erro que termina dizendo maximum size 8164. 8196 (8Kb) menos 32 bytes. Para fechar esta seo, se uma tabela, mesmo que no contenha dados TOASTados, atingir o limite de 1Gb, um outro arquivo ser gerado. Seu nome o mesmo relfilenode da tabela com o sufixo .1. (No nosso caso seria 16397.1), consequentemente, um arquivo .2 ser criado a partir do prximo 1Gb, e assim por diante.
Mapeamentodeespaolivreempginasdedados

Cada arquivo de armazenamento de tabela, ndice e tambm os arquivos TOAST possuem um arquivo _fsm associado para mapear o espao livre no interior de suas pginas de dados. Esta 97

AdministraoProfissionaldoPostgreSQL1Primeirospassos tcnica se chama mapeamento de espao livre (FSM Free Space Mapping). J vimos que possvel mais de um registro ocupar a mesma pgina de dados. Ao apagarmos um registro, este no limpo do disco neste exato momento, mas sim marcado para como indisponvel, minimizando o impacto da deleo completa sobre a transao que mandou que fosse apagado. Esta operao postergada e delegada a um outro processo chamado VACUUM (falaremos mais sobre ele no Captulo 5. Rotinas administrativas). Ao executar o VACUUM, voc vai limpar o registro j apagado, deixando a pgina de dados subutilizada. Pginas subutilizadas podem inchar nosso espao em disco. O raciocnio lgico, se a cada 8Kb (blocksize padro) s usarmos 4Kb, estamos dobrando o espao necessrio para armazenar nossos dados. At a verso 8.3 do PostgreSQL, havia uma instruo no postgresql.conf chamada max_fsm_pages que voc precisaria ajustar para informar ao processo VACUUM qual o limite mximo de pginas ele ir procurar para limpar dados obsoletos. No momento em que as pginas com registros mortos (marcados para serem limpos pelo VACUUM) superassem o valor deste parmetro, teramos um problema de armazenamento, j que o VACUUM no iria limpar algumas delas deixando o banco maior do que deveria, e problemas de desempenho, j que os dados ficariam mais fragmentados no disco, provocando maior movimento do ponteiro de leitura nas consultas. Um valor bem alto em max_fsm_pages viria bem a calhar (e era o que DBAs mais cansados e mal alimentados acabavam fazendo), mas tambm poderia comprometer o desempenho uma vez que cada pgina de dados usurparia 6 bytes de memria compartilhada para tarefas administrativas e comprometeria o prprio desempenho do VACUUM que poderia perder tempo tentando limpar muitas pginas que no teriam nada a ser limpo. Uma soluo indicada em alguns sistemas seria manter o valor de max_fsm_pages baixo e rodar um VACUUM FULL em momentos ociosos (domingos e feriados, por exemplo). A opo FULL faz o VACUUM tentar limpar todas as pginas. Mas quo baixo baixo o suficiente? Seu sistema tem um momento ocioso? Ah, t bom! Vamos parar de falar de VACUUM aqui se no a seo que fiz s pra ele no captulo 5 no ter a menor graa. No no, esta a ltima: Uma recomendao de tuning bem falada seria rodar o VACUUM VERBOSE no sistema em produo e verificar a sada. Ela diz quantas pginas foram limpas de fato. Assim voc teria uma noo (aproximada, afinal os usurios do seu sistema so seres humanos, desconfio eu) de quantas pginas cada VACUUM peridico de fato precisa. Felizmente, Heikki Linnakanga, desenvolvedor da EnterpriseDB, teve a idia, incorporada no PostgreSQL 8.4, de trabalhar com o mapeamento de espao livre em disco, jogando os parmetros max_fsm_pages e seu irmo mais bvio e menos falado max_fsm_relations no saco. Como funciona agora? Seguinte. O PostgreSQL reserva um nico byte por pgina (lembra que ela tem 8Kb, ou seja 8192 bytes) para informar a dimenso do espao livre. Como sua professora da primeira srie deve ter lhe ensinado, o maior nmero possvel em 1 byte (8 bits) 255. O que? Sua professora da primeira sria no lhe ensinou binrio? A minha tambm no, mas vou pedir que a do meu filho explique bem isso a ele. Afinal, isso ser extremamente importante na carreira de jogador de futebol dele. Isso mesmo, jogador de futebol, preciso desejar o melhor ao pra ele, programar coisa de nerd liso :-). 98

AdministraoProfissionaldoPostgreSQL1Primeirospassos Recuperado do momento: Non-sense s 3 da manh, vamos l. O valor desse bit ser o tamanho do espao livre dividido pelo tamanho da pgina, o que d um valor entre 0 e 1. Multiplicado por 256, vai dar algum valor entre 0 e 256. Arredondado pra baixo, como sempre haver dado na pgina, o maior nmero ser 255. Um byte bem bonito com todos os bits em 1. Nos arquivos _fsm so armazenadas em pginas, tambm do tamanho do blocksize (8Kb), colees de referncias s pginas do arquivo principal. Esta coleo estruturada em rvore binria de acordo com o o valor do byte que falamos anteriormente. O arquivo README disponvel no caminho src/backend/storage/freespace do diretrio de instalao explica como essa rvore opera exatamente. Na primeira vez que o servidor vai armazenar algum dado, ele consulta as pginas FSM em busca de pginas de dados com espao suficiente disponvel. S se no houver, ele abre uma nova pgina de dados e registra o seu. Se vai ficar fora de ordem? Fica. Mas segundo o padro SQL, os dados s devem vir organizados se voc utilizar ORDER BY. Sem voc usar esta clusula, SGBD nenhum tem a obrigao de lhe entregar os registros organizados por nenhum campo, nem mesmo por ordem de insero. A partir do segundo armazenamento, ele no mais consulta o mapa FSM daquela tabela, afinal isso poderia comprometer seu desempenho uma vez que o mapa poderia indicar outra pgina mais distante. Desta forma, haveria movimento excessivo para armazenar e tambm para que os dados, inseridos prximos, persistidos distantes, serem buscados em uma mesma consulta. O que o servidor faz tentar armazenar na mesma pgina de dados at no haver mais espao disponvel. Quando isto ocorrer, o prprio mapa FSM atualizado para constar o espao que sobrou naquela pgina. A prxima insero consultar o FSM para achar outra ou, se for o caso, criar uma prxima. Como veremos no captulo 4. Transaes e Write Ahead Logging, at o chamado checkpoint, nada do que foi dito aqui aconteceu. O processo chamado bgwriter quem executa esse checkpoint. Isso pode acontecer automaticamente ou atravs da chamada ao comando CHECKPOINT. Outros comandos tambm podem forar a realizao do checkpoint, no entanto se apenas isso que voc quer que acontea, esse o comando. O comando ANALYZE atualiza as tabelas de catlogo. fundamental para que o planejador de consultas tenha uma idia sempre real ou bastante prxima da dimenso das tabelas de onde buscar dados. A nossa conhecida tabela pg_class traz reltuples, relpages que vo informar esta dimenso. Ainda no mesmo captulo 5, veremos que o processo autovacuum, alm de limpar registros marcados para deleo, tambm atualiza os arquivos _fsm das tabelas, ndices e TOASTs. Os arquivos _vm s esto disponveis para os arquivos de dados de tabelas (nem os ndices nem os TOASTs possuem arquivos _vm auxiliares). Eles servem para registrar quais pginas de dados foram modificadas desde o ltimo VACUUM. Isso auxilia o processo de VACUUM para que ele no saia louco por a procurando em pginas de dados que no tenham nada para limpar. Foi esse cara que matou as diretivas max_fsm_pages e max_fsm_relations.
Umpoucodeprtica

Vamos realizar algumas atividades para persistir essas informaes nas pginas de dados da sua 99

AdministraoProfissionaldoPostgreSQL1Primeirospassos cabea. Vamos importar uma base de dados com pequeno volume, mas j capaz de nos mostrar muita coisa. Vamos tambm adicionar umas funes capazes de mostrar o espao livre disponvel. Vamos instalar mais uma ferramenta do diretrio contrib da instalao dos fontes do PostgreSQL. A pg_freespacemap carrega um par de funes que retornam informaes extradas dos arquivos _fsm. Sob o contrib, ns entramos no diretrio pg_freespacemap. Para compilar essa biblioteca e inserir no diretrio de bibliotecas do nosso PostgreSQL instalado, digite: debianpgsql:~#cdpostgresql8.4.2/contrib/pg_freespacemap debianpgsql:~/postgresql8.4.2/contrib/pg_freespacemap#ll total16 rwrr1258258469Set302008Makefile rwrr12582581107Jun112009pg_freespacemap.c rwrr1258258894Jun102009pg_freespacemap.sql.in rwrr1258258292Jun102009 uninstall_pg_freespacemap.sql debianpgsql:~/postgresql8.4.2/contrib/pg_freespacemap#make sed's,MODULE_PATHNAME,$libdir/pg_freespacemap,g' pg_freespacemap.sql.in>pg_freespacemap.sql gccO2WallWmissingprototypesWpointerarithWdeclaration afterstatementWendiflabelsfnostrictaliasingfwrapvfpic I.I../../src/includeD_GNU_SOURCEcopg_freespacemap.o pg_freespacemap.c gccO2WallWmissingprototypesWpointerarithWdeclaration afterstatementWendiflabelsfnostrictaliasingfwrapvfpic sharedpg_freespacemap.oL../../src/portWl, rpath,'/usr/local/pgsql/lib'opg_freespacemap.so Aps a compilao, dois arquivos criados nos interessam: pg_freespacemap.so e pg_freespacemap.sql. O primeiro a biblioteca que precisamos e o segundo um script para executarmos em nossa base para criar as funes que veremos em seguida. Antes de continuarmos, vamos criar nossa nova base de dados. O site PgFoundry faz parte da comunidade de sites que trazem bons projetos ao redor do PostgreSQL. H um projeto l chamado dbsamples. Ele simplesmente um conjunto de scripts para criao de novas bases de dados. Vamos baixar uma base chamada dellstore que um modelo de uma loja virtual. Para baixar o script, execute o comando abaixo (se estiver em ambiente grfico, ou se gosta do nosso amigo Lynx, navegue at o download do dellstore no projeto http://pgfoundry.org/projects/dbsamples). debianpgsql:~#wget http://pgfoundry.org/frs/download.php/543/dellstore2 normal1.0.tar.gz 2010021210:15:10 100

AdministraoProfissionaldoPostgreSQL1Primeirospassos http://pgfoundry.org/frs/download.php/543/dellstore2 normal1.0.tar.gz Resolvendopgfoundry.org...200.46.204.130 Aconectarpgfoundry.org|200.46.204.130|:80...conectado! HTTPrequisioenviada,aguardandoresposta...200OK Tamanho:2271997(2,2M)[application/binary] Agravarem:'dellstore2normal1.0.tar.gz' 100%[======================================>]2.271.997115K/s em13s 2010021210:15:24(170KB/s)'dellstore2normal1.0.tar.gz' gravado[2271997/2271997] Agora descompacte o arquivo para importar a base. debianpgsql:~#tarxvfdellstore2normal1.0.tar.gz Logado como postgres, crie sua nova base de dados atravs da ferramenta createdb disponvel no diretrio bin do banco instalado (j adicionado ao PATH na seo de instalao). Crie o suporte linguagem PL/pgSQL na base criada, mesmo que a gente no venha a precisar. apenas para no haver nenhuma mensagem de erro na execuo do script (se preferir apague a criao da funo PL/ pgSQL dentro do arquivo .sql, no ser necessria na nossa dinmica). Depois execute o psql para executar o script. Nota: Veremos no captulo 6. Backups que podem salvar seu emprego, mais detalhes sobre a prtica de gerao de dump scripts. debianpgsql:~/dellstore2normal1.0#supostgres postgres@debianpgsql:~$createdbdellstore postgres@debianpgsql:~$createlangplpgsqldellstore postgres@debianpgsql:~$psqldellstore</root/dellstore2 normal1.0/dellstore2normal1.0.sql Vamos aproveitar o momento para criar tambm as duas funes pg_freespacemap na base de dados recm criada. $psqldellstore< /root/postgresql8.4.2/contrib/pg_freespacemap/pg_freespacemap.sql As duas funes criadas possuem as seguintes assinaturas. Na verdade uma funo com duas sobrecargas, ou seja, o nome da funo o mesmo, ele vai saber qual chamar de acordo com os parmetros que voc passar. pg_freespace(relregclassIN,blknoOUTbigint,availOUTint2) O parmetro de entrada rel o nome da tabela que queremos abrir seu arquivo de dados para coletar pginas disponveis. Os parmetros blkno e avail so campos de sada. O primeiro 101

AdministraoProfissionaldoPostgreSQL1Primeirospassos retorna o nmero identificador da pgina no arquivo, o segundo justamente o valor do espao disponvel. pg_freespace(relregclassIN,blknobigintIN)returnsint2 Na segunda verso, o blkno virou parmetro de entrada. Assim, o resultado ser apenas o montante disponvel naquela pgina. Contando com as funes pg_freespacemap e algumas outras j disponveis por padro, vamos tratar de colher algumas informaes fsicas sobre uma base de dados. Primeiro vamos saber o tamanho do banco. dellstore=#selectpg_database_size('dellstore'); pg_database_size 21750052 (1row) dellstore=#select pg_size_pretty(pg_database_size(current_database())); pg_size_pretty 21MB (1row) Acima, current_database() retorna o nome da base conectada. Acima, seria o mesmo que colocarmos 'dellstore'. A funo pg_database_size() nos informou o tamanho total do banco. Recuperamos o resultado arredondado pela funo pg_size_pretty(), que recebe um nmero e sai dividindo por 1024 at achar a ordem de grandeza aproximada que melhor informa. Se voc dividir na mo ver que vai dar 20,74. Se quiser o valor exato, no use pg_size_pretty(). Vamos conferir se isto mesmo que est armazenado no disco. dellstore=#selectoidfrompg_databasewheredatname='dellstore'; oid 16603 (1row) dellstore=#\q postgres@debianpgsql:~$duh/usr/local/pgsql/data/base/16603/ 21M /usr/local/pgsql/data/base/16603/ Precisamos saber o OID da base para podermos consultar seu tamanho no disco. O comando du (disk usage) nos informou esse tamanho. Tambm arredondou devido opo h. Vamos consultar o catlogo para colher os dados fsicos das tabelas da nossa base. Lembre sempre que catlogo precisa estar atualizado, atravs do comando ANALYZE, para voc no ter 102

AdministraoProfissionaldoPostgreSQL1Primeirospassos informaes desencontradas. dellstore=#SELECTc.relfilenode,c.relname,c.reltuples, c.relpages, pg_size_pretty(pg_total_relation_size(c.relname::varchar))total FROMpg_classcinnerjoinpg_namespacenonn.oid= c.relnamespaceWHEREc.relkind='r'andnspname='public'; relfilenode|relname|reltuples|relpages|total ++++ 16610|categories|16|1|24kB 16626|inventory|10000|50|616kB 16640|products|10000|101|1408kB 16644|reorder|0|0|0bytes 16629|orderlines|60350|355|4200kB 16614|cust_hist|60350|296|3472kB 16619|customers|20000|476|4752kB 16634|orders|12000|100|1288kB (8rows) Selecionamos o relfilenode para sabermos o nome do arquivo da tabela em disco (como j foi dito, no primeiro momento eles sero iguais ao OID da tabela), relname (nome), reltupes (nmero de registros), relpages (nmero de pginas de dados no arquivo da tabela), e o tamanho total da tabela no disco atravs da funo pg_total_relation_size(). Nota: A funo pg_relation_size() quem traz o tamanho da tabela, pg_total_relation_size() mede o tamanho da tabela, seus ndices e tabelas TOAST agregados. A consulta foi baseada no JOIN entre as tabelas pg_class (onde esto todos os campos que lemos) e a tabela pg_namespace que traz os esquemas do nosso banco. Todo objeto em um banco registrado em pg_class com o OID do esquema a que ele pertence. Ns aqui s queremos objetos cujo nome do esquema (nspname) seja public, cujo tipo (relkind) seja 'r' de relation (tabela), 't' seria tabela TOAST e 'i' ndice. Vamos trabalhar agora em cima da tabela customers, que apresentou o maior nmero de pginas, consequentemente um maior tamanho em disco. Vejamos qual o espao livre por dentro das pginas de dados desta tabela: dellstore=#select*frompg_freespace('customers'); blkno|avail + 0|64 1|64 2|64 3|64 103

AdministraoProfissionaldoPostgreSQL1Primeirospassos ...|... 250|128 251|0 252|128 253|160 ...|... 472|160 473|160 474|128 475|0 Cada pgina de dados recebeu um nmero identificador blkno, iniciando do zero. Na grande maioria delas houve algum espao livre que no foi preenchido. Mas voc viu que a ltima pgina est zerada? Bom, talvez at ela estela completamente preenchida, mas o que voc pode ver enquanto o mapa FSM no atualizado com dados desta ltima pgina. Para mostrar mostrar o que de fato ocorre, vou recuperar esse comando em um arquivo, adicionar um novo cliente (customer) na tabela e realizar a consulta novamente para poder comparar os resultados. Primeiro passo: Salvando o resultado da consulta em arquivo. O nosso amigo psql vai nos ajudar. possvel chamar o psql apenas para executar um comando, sem a necessidade de entrar nele. Veja: $psqlc"select*frompg_freespace('customers')"dellstore> customers_freespace1.txt Aproveitamos e direcionamos a sada para o arquivo customers_freespace1.txt. Agora vou inserir um novo registro (aqui, vou mostrar por dentro do psql, mas seria possvel seguir o formato usado acima): dellstore=#INSERTINTOcustomers(firstname,lastname,address1, city,country,region,creditcardtype,creditcard, creditcardexpiration,username,password)values ('Jose','Berardo','RuaTal','Recife','Brasil',1,1,'1234', '022010','berardo'||currval('customers_customerid_seq'),'123'); INSERT01 Tivemos a resposta de que o registro foi inserido. Vamos repetir a consulta s pginas vazias de customers. $psqlc"select*frompg_freespace('customers')"dellstore> customers_freespace2.txt Importei o resultado em uma planilha para facilitar a busca por modificaes e pude constatar que nada havia acontecido. Como pode? Seria possvel o dado ainda estar apenas em logs de transao WAL? Sim, seria. Ento tratemos de realizar o checkpoint. livro=#CHECKPOINT; 104

AdministraoProfissionaldoPostgreSQL1Primeirospassos CHECKPOINT Repita a gerao da prova dos 9 veja que ... o que? Nada mudou? Como assim? Se voc repetir o comando l de antes que recupera o tamanho de cada tabela, vai poder ver que nada mudou tambm por l. O banco j tinha X bytes, adicionei mais alguns, me certifiquei de que eles de fato esto onde deveriam estar (checkpoint) mas o comando que diz o tamanho da tabela e a consulta aos espaos livres nas pginas de dados retornaram as mesmas informaes de antes. Bom, preciso lhe dizer que realmente o PostgreSQL possui poderes paranormais. De fato, esta informao foi gravada no limbo, numa dimenso muito distante ... Esquece esse papo a. Vamos chamar Mister M. O problema foi que o mapa ainda no foi atualizado. Lembra como atualiz-lo. L vai: dellstore=#VACUUMVERBOSEANALYZEcustomers; INFO:vacuuming"public.customers" INFO:index"customers_pkey"nowcontains20001rowversionsin46 pages DETAIL:0indexrowversionswereremoved. 0indexpageshavebeendeleted,0arecurrentlyreusable. CPU0.00s/0.00usecelapsed0.03sec. INFO:index"ix_cust_username"nowcontains20001rowversionsin 68pages DETAIL:0indexrowversionswereremoved. 0indexpageshavebeendeleted,0arecurrentlyreusable. CPU0.01s/0.00usecelapsed0.03sec. INFO:"customers":found0removable,1326nonremovablerow versionsin31outof476pages DETAIL:0deadrowversionscannotberemovedyet. Therewere0unuseditempointers. 0pagesareentirelyempty. CPU0.02s/0.00usecelapsed0.12sec. INFO:vacuuming"pg_toast.pg_toast_16619" INFO:index"pg_toast_16619_index"nowcontains0rowversionsin 1pages DETAIL:0indexrowversionswereremoved. 0indexpageshavebeendeleted,0arecurrentlyreusable. CPU0.00s/0.00usecelapsed0.00sec. INFO:"pg_toast_16619":found0removable,0nonremovablerow versionsin0outof0pages DETAIL:0deadrowversionscannotberemovedyet. 105

AdministraoProfissionaldoPostgreSQL1Primeirospassos Therewere0unuseditempointers. 0pagesareentirelyempty. CPU0.00s/0.00usecelapsed0.00sec. INFO:analyzing"public.customers" INFO:"customers":scanned476of476pages,containing20001live rowsand0deadrows;20001rowsinsample,20001estimatedtotal rows VACUUM O VACUUM, claro! O ANALYZE foi s para atualizar o catlogo caso haja ocorra uma nova pgina de dados. Como no houve (saberamos na consulta aos espaos livres se ela tivesse sido criada), o ANALYZE nem foi necessrio. Voc poderia sobreviver aqui sem ele. O VERBOSE foi legal apenas para aumentar o tamanho do livro e torn-lo o calo ideal para o p da sua mesa. E tambm para voc poder conferir o que foi destacado em negrito. No final, em itlico, destaquei o resultado do ANALYZE. Veja que ele informa que houve a insero de um novo registro (a tabela custumers original do dellstore traz 20 mil clientes cadastrados). No houve DELETEs ou UPDATEs e h 476 pginas no arquivo de dados da tabela e 46 na do ndice da chave primria customerid. Tire a prova dos nove e veja que haver mais de 3Kb disponveis na ltima pgina, mesmo aps esta insero. L onde o resultado havia sido zero, agora h uma informao atualizada. Insira mais um registro e veja que nada vai mudar com relao ao resultado atual, mas agora voc j sabe que apenas uma desatualizao do mapa FSM. Seria ineficiente atualizar em qualquer modificao do contedo das pginas, melhor que ele registre em um buffer de memria compartilhada a ltima pgina que trabalhou e saia preenchendo ela. Nota: Este comportamento devido chamada interna funo RelationGetBufferForTuple(), por Bruce Momjian. Ela pode ser vista nos fontes em /src/backend/access/heap/hio.c. Se voc inserir um volume suficiente para acabar os 3Kb restantes na ltima pgina de dados, perceber que o resultado da consulta funo pg_freespace('customers') ser atualizado automaticamente. Tentei seguir essa linha de raciocnio, mas no atentei para o fato de que o VACUUM realizado apagou o buffer que informava a pgina. Por isso, no INSERT posterior, o servidor procurou por outra pgina e encontrou em uma posio anterior. Sa inserindo registros como um louco da seguinte maneira: dellstore=#INSERTINTOcustomers(firstname,lastname,address1, city,country,region,creditcardtype,creditcard, creditcardexpiration,username,password)values ('Jose','Berardo','RuaTal','Recife','Brasil',1,1,'1234', '022010','berardo'||currval('customers_customerid_seq'),'123'); INSERT01 A funo currval() retornou o valor atual da sequncia customers_customerid_seq, usada na chave primria customerid. Precisei fazer isso devido apenas a uma restrio de 106

AdministraoProfissionaldoPostgreSQL1Primeirospassos unicidade que h no campo username. Pude constatar em uma nova consulta aos espaos livres que pginas pelo meio do arquivo foram preenchidas com meus novos registros. O que prova que o mapa FSM tambm atualizado quando uma pgina j no tem espao suficiente. Prova tambm que o servidor, no podendo mais trabalhar com a pgina atual (j no h espao suficiente nela), sai em busca de outra. Olha que interessante ficou minha tabela: dellstore=#selectcustomerid,usernamefromcustomers; L pelo meio, ocorreram curiosidades como estas (meus novos registros se misturaram com os j inseridos no momento da importao do dump): 11238|user11238 20035|berardo20035 11239|user11239 Agora, imagine isso em um servidor com registros de tamanhos variados, com atualizaes e delees. Percebeu como importante o mapeamento de pginas vazias? Resumo da pera. Nossa prtica serviu para fixar melhor o comportamento do servidor no disco e perceber a astcia do servidor que precisa se preocupar com o desempenho a todo instante. Espero ter conseguido. Muito do que foi dito aqui pode ter parecido que cavamos mais do que o necessrio. No entanto, os dados armazenados por um SGBD relacional, no baixo nvel, no so tabelas, so arquivos. Arquivos so lineares, seriais, no podem ser lidos sob a tica bidimensional de uma tabela. A proposta foi mostrar como o servidor do PostgreSQL lida com isso enquanto ns meros mortais apenas continuamos chamando os dados de registros em tabelas. Que tal dissecar as pginas de dados? J que a idia cavar, v busca seu microscpio eletrnico que precisamos analisar a estrutura do tomo do PostgreSQL, as pginas de dados. Aqui, eu no teria como ir alm do manual oficial, se for esta sua inteno, recomendo a leitura de sua seo 53.5 Database Page Layout, disponvel no endereo: http://www.postgresql.org/docs/8.4/interactive/storage-page-layout.html.
Outrosdiretrios

Vamos tratar aqui dos demais diretrios que compem o database cluster gerado pelo initdb. - Diretrio global: Diretrio que contm arquivos de dados de tabelas presentes em todos os bancos de dados como: pg_pltemplate, pg_tablespace, pg_shdepend, pg_authid, pg_auth_members, pg_database, pg_shdescription, e seus ndices. Todas elas pertencentes ao esquema pg_catalog. Alm de alguns arquivos TOAST, auxiliares dessas tabelas, pertencentes ao esquema pg_toast, e os correspondentes arquivos forks _fsm para todos esses objetos e _vm para as tabelas. H ainda trs arquivos especiais nesse diretrio: pg_database, pg_auth, pg_control. O pg_database um simples documento de texto contendo as bases de dados j criadas, no nosso caso at o momento: "template1"11663648 107

AdministraoProfissionaldoPostgreSQL1Primeirospassos "template0"115631663648 "postgres"115641663648 "livro"164021663648 "dellstore"166031663648 O arquivo pg_control traz alguns parmetros de configurao gerados pelo initb e outras informaes dinmicas. Para verificar seu contedo, execute o comando pg_controldata: $pg_controldata pg_controlversionnumber:843 Catalogversionnumber:200904091 Databasesystemidentifier:5436792753863483252 Databaseclusterstate:inproduction pg_controllastmodified:Sb13Fev201023:01:17BRT Latestcheckpointlocation:0/40CB5FC Priorcheckpointlocation:0/40CB5B8 Latestcheckpoint'sREDOlocation:0/40CB5FC Latestcheckpoint'sTimeLineID:1 Latestcheckpoint'sNextXID:0/1445 Latestcheckpoint'sNextOID:24910 Latestcheckpoint'sNextMultiXactId:1 Latestcheckpoint'sNextMultiOffset:0 Timeoflatestcheckpoint:Sb13Fev201023:01:17BRT Minimumrecoveryendinglocation:0/0 Maximumdataalignment:4 Databaseblocksize:8192 Blockspersegmentoflargerelation:131072 WALblocksize:8192 BytesperWALsegment:16777216 Maximumlengthofidentifiers:64 Maximumcolumnsinanindex:32 MaximumsizeofaTOASTchunk:2000 Date/timetypestorage:64bitintegers Float4argumentpassing:byvalue Float8argumentpassing:byreference A maioria das informaes acima til para o processo bgwriter que tem a responsabilidade de ler os segmentos WAL e realizar o checkpoint que j citamos aqui. Voltaremos ao assunto no captulo 4. Transaes e Write Ahead Logging. 108

AdministraoProfissionaldoPostgreSQL1Primeirospassos Nota: At o PostgreSQL 8.3, havia um arquivo chamado pgstat.stat, onde o processo stats collector armazenava temporariamente a coleta para monitoria das atividades do servidor. Em ambientes com muitas bases de dados e muitas tabelas, esse arquivo tendia a crescer, e o excesso de entrada/ sada de dados nesse arquivo poderia comprometer o desempenho. No PostgreSQL 8.4, o arquivo no morreu, mas h um novo parmetro para o postgresql.conf chamado stats_temp_directory onde possvel definir um novo local para ele. Assim, poderemos definir um diretrio em outra controladora de disco, ou melhor ainda, por se tratar de um arquivo temporrio, poderemos montar um sistema de arquivos em memria e evitar completamente o acesso ao disco. Veremos esta tcnica no captulo 8. Tuning. - Diretrios pg_clog , pg_multixact, pg_subtrans, pg_xlog. O primeiro onde so registrados os status de efetivaes de todas as transaes, o segundo onde so registrados os status de transaes que precisem de lock de objetos, o terceiro onde se registram os status de subtransaes j o terceiro onde so gravados os logs de transaes. So esses logs que uma vez gravados liberam o COMMIT da transao. Ambos os diretrios sero explorados no captulo 4. Transaes e Write Ahead Logging e o pg_xlog trataremos ainda na sees sobre Point in Time Recovery e Warm Standby no captulo 6. Backups. - Diretrio pg_stats_tmp. Local para onde o arquivo pgstatstat foi movido por padro. Como j foi dito, agora possvel modificar a localizao desse arquivo no postgresql.conf. - Diretrio pg_tblspc. Diretrio contendo links simblicos para todos os tablespaces criados no cluster. Trataremos de tablespaces ainda neste captulo. - Diretrio pg_twophase. Diretrio reservado a informaes sobre transaes preparadas (prepared transactions) em rotinas conhecidas como two-phase commit.
Arquivosdeconfiguraodocluster

Os arquivos de configurao do cluster so to importantes que mereceram captulos ou sees a parte. Confira: postgres@debianpgsql:/usr/local/pgsql/data$ll|grep^ rw1postgrespostgres3652Fev1022:32pg_hba.conf rw1postgrespostgres1631Fev1022:32pg_ident.conf rw1postgrespostgres4Fev1022:32PG_VERSION rw1postgrespostgres16819Fev1022:32postgresql.conf rw1postgrespostgres30Fev1314:23postmaster.opts rw1postgrespostgres47Fev1314:23postmaster.pid O principal arquivo de todo o cluster , como voc j deve imaginar, o arquivo postgresql.conf. O prximo captulo inteiramente dedicado a ele e, durante todo o material, ele sempre ser citado por trazer as principais configuraes do servidor. Os arquivos pg_hba.conf e pg_ident.conf so carregados em memria no start do servidor e utilizados sempre que uma nova conexo for estabelecida. 109

AdministraoProfissionaldoPostgreSQL1Primeirospassos O arquivo PG_VERSION traz apenas o nmero da verso do cluster. O arquivo postmaster.opts tambm simples texto, mas atualizado a cada reincio do servidor com as opes utilizadas para inici-lo. Por fim, postmaster.pid criado para indicar que o servio est ativo, ele traz justamente o identificador do processo no sistema operacional.

1.2.2 Encodingelocalizao
Tabelas de encoding, tambm conhecidas como charsets (conjuntos de caracteres), so o mecanismo pelo qual os sistemas computacionais reconhecem uma sequncia de bits como sendo um caractere. Provavelmente, voc j ouviu falar na tabela ASCII. A American Standard Code for Information Interchange (ASCII) foi uma tabela originria nos idos do telgrafo, posteriormente registrada no instituto americano ANSI, que consistia em um conjunto de 7 bits onde cada combinao deles representava um nico caractere. Assim, um nmero da combinao seria a letra A (no caso , 65), outro a letra B (66) e assim por diante. Foram catalogados primeiramente 32 caracteres (do 0 ao 31), considerados como caracteres de comando para dispositivos como monitores e impressoras. Por exemplo, o nmero 10 (o binrio 0001010) foi reservado ao comando line feed (LF) para quebra de linha, ou seja, ao imprimir determinado texto, se a impressora se deparasse com este nmero, ela iria partir para escrever o contedo subsequente em uma prxima linha. A maior parte desse caracteres est obsoleta hoje. Alguns so curiosos como o caractere 7, o Bell Character. Ele informava que o dispositivo deveria soar um beep ao interpret-lo. Bell significa sino, mas tambm o nome da empresa me da tabela ASCII. Os demais caracteres foram catalogados nos nmeros superiores. Agora note que, se a tabela era montada em apenas 7 bits, s havia 128 combinaes possveis para os caracteres, dessas, 32 j no poderiam ser utilizadas. Desta maneira, nossos acentos e demais caracteres latinos ficaram de fora. As tabelas de caracteres ISO-8859-1 (conhecida tambm como Latin1 ou Western European) e Windows-1252 so montadas sobre 8 bits respeitando (como a maioria das tabelas de encoding) os valores dos primeiros 7 bits de acordo com a tabela ASCII. Elas so comumente usadas no oeste europeu e Amrica Latina. Possuem alguns caracteres divergentes, mas em geral so intercambiveis. Com 8 bits, possvel haver 256 combinaes, o que j permite contemplar nossos caracteres acentuados. No fim dos anos 80, esforos da Xerox e da Apple criaram a tabela Unicode. Ela tem a inteno de representar todos os caracteres do mundo (perceba que 256 suficiente pra gente, mas e para um Chins?). Para isto, inicialmente se baseou em 16 bits. O que d 56536 combinaes possveis. T achando muito, saiba que a verso atual (5.0) da tabela possui mais de 100 mil caracteres catalogados e montada em 32 bits, o que d mais de 4 bilhes de caracteres possveis. Bom, enquanto ns no formos invadidos por aliengenas, este tamanho deve dar de sobra por muito tempo. Acontece que a tabela Unicode incha qualquer base de dados. Ora, se eu posso armazenar uma letra A em apenas um byte, usando uma tabela como a Latin1, por que eu haveria de trocar por uma tabela que precisa de 4 bytes como a Unicode. Eu vou fatalmente multiplicar o espao armazenado por 4. Pensando nisso, o Unicode Consortium definiu alguns padres de adaptao da tabela. So os 110

AdministraoProfissionaldoPostgreSQL1Primeirospassos modelos UTF (Unicode Transfer Format). O modelo UTF-32 representa a tabela Unicode em sua essncia, ou seja, 32 bits para cada caractere. J o modelo UTF-16 e o mais popular deles UTF-8 so tabelas multibyte. O UTF-8 funciona reservando os 128 primeiros nmeros (7 primeiros bits) para os mesmos caracteres da tabela ASCII. O oitavo bit s utilizado em conjunto com pelo menos mais um byte para juntos formarem o caractere desejado. Dependendo do caractere, possvel o padro UTF-8 chegar a precisar de todos os 32 bits (4 bytes), mas nossos acentos sempre ocupam apenas 2 bytes. Se um dia voc receber um email ou for ler algum texto que no lugar dos acentos aparecerem outras coisas, preste ateno se no so no um mas dois caracteres estranhos para cada caractere acentuado que surgem tela. Neste caso, saiba que o que ocorreu foi que algum gerou o texto em UTF-8 e voc o est lendo atravs de alguma ferramenta que use tabelas de 8 bits como a Latin1. Perceba como o UTF-8 consegue aliar a capacidade de representar todos os caracteres catalogados na Unicode com a flexibilidade certa para no inchar seu banco com bytes desnecessrios. por isso que muitos sistemas operacionais trabalham com UTF-8 como tabela padro. J o padro UTF-16 semelhante, mas j ocupa pelo menos 16 bits. Encoding realmente um problema bastante comum na administrao de bancos de dados. No raro situaes onde h dois aplicativos, possivelmente escritos em linguagens de programao diferentes, acessando uma mesma base, mas trabalhando por padro com charsets distintos. Na maioria dos casos, a recomendao mesmo trabalhar com UTF-8 e tentar ajustar um dos dois aplicativos para que a reconhea. Nota: O PHP, por exemplo, uma linguagem que sempre optou pelo uso da tabela Latin1, no entanto, est definido que em sua prxima verso (PHP 6.0), toda a linguagem ser portada para Unicode, o que certamente vai trabalhar com UTF-8 na hora de manipular arquivos e streams, assim com se faz em Java. Enquanto o PHP 6.0 no vem, h muito se encontram disponveis comandos de converso de Strings de e para Unicode e no de hoje que ele suporta as bibliotecas C mbstring e iconv para manipulaes de strings multibyte (como recuperao do tamanho exato do texto) e transformao de tabela, respectivamente. Quanto chamada localizao (localization ou mais conhecida como l10n em aluso s 10 letras que existem entre o L e o N na palavra), o conjunto de formataes de valores que variam de acordo com a regio geogrfica. As categorias mais conhecidas de regionalizaes so os nmeros (LC_NUMERIC) e principalmente a mscara de datas e horas (LC_TIME). No Brasil, expressamos datas como 24/02/2006, na Alemanha, a mscara normalmente 24.02.2006, nos Estados Unidos, em geral ser 02/24/2006. O mesmo vale para formataes de nmeros, j que usamos a vrgula onde os americanos usam ponto e vice-versa. Nota: O mesmo fizeram com o termo internacionalizao, ou seja, internationalization, comumente conhecida como i18n. Internacionalizao o esforo dos programas em reconhecer o idioma e as caractersticas regionais (l10n) do usurio para apresentar as informaes do jeito que esto nativamente acostumados. Portanto a l10n est intimamente relacionada i18n e os charsets tem tudo a ver com isso uma vez que as tabelas devem ser capazes de representar os caracteres usados no idioma dos usurios. 111

AdministraoProfissionaldoPostgreSQL1Primeirospassos
ProblemascomoDebian/Ubuntu

Distribuies que seguem a linha do Debian ( o caso do Ubuntu) unem encoding ao locale e no possvel criar um banco com qualquer um dos dois diferente do padro. Veja a tentativa de criar uma nova base com um encoding diferente do padro: postgres=#CREATEDATABASElatinaencoding='ISO88591'; ERROR:encodingLATIN1doesnotmatchlocalept_BR.UTF8 DETAIL:ThechosenLC_CTYPEsettingrequiresencodingUTF8. STATEMENT:CREATEDATABASElatinaencoding='ISO88591'; ERROR:encodingLATIN1doesnotmatchlocalept_BR.UTF8 DETAIL:ThechosenLC_CTYPEsettingrequiresencodingUTF8. O exemplo acima tentou fazer algo bem comum entre desenvolvedores brasileiros, criar uma nova base de dados pronta para armazenar textos utilizando a tabela Latin1. No entanto, no Debian e seus derivados, o encoding padro o UTF-8. Nota: H um esforo coletivo para promover o padro UTF-8 ubiquidade. Idiomas e costumes diferentes ao redor do mundo so barreiras histricas plena comunicao. O padro de encoding acabou se tornando um elemento ps-Internet que s veio complicar ainda mais. Se no h como todos falarem o mesmo idioma e as diferenas regionais serem embasadas na riqueza cultural de cada nao, pelo menos ns nerds que no deveramos ter criado mais um elemento capaz de piorar essa babel. Agora confira a tentativa de criar uma base com um locale diferente do padro: postgres=#CREATEDATABASElatinalc_collate='pt_BR'; ERROR:invalidlocalenamept_BR STATEMENT:CREATEDATABASElatinalc_collate='pt_BR'; ERROR:invalidlocalenamept_BR O primeiro problema (no conseguimos trocar o encoding) acusou um erro de locale. O que tem a ver o buraco da otlia com as calas? exatamente isso que faz o Debian e sua prole, une locale com encoding. Assim, o locale padro est preso ao encoding UTF-8. J no segundo problema, logo acima, tentamos criar uma base com um locale no disponvel no sistema operacional. Precisamos habilit-lo. O fato que o locale padro at j o pt_BR caso voc tenha optado por ele no ato de instalao, mas ele se chama pt_BR.UTF-8. No existe aqui um locale chamado pt_BR. Para listar o locale padro do sistema execute o comando locale. $locale LANG=pt_BR.UTF8 LANGUAGE=pt_BR:pt:en LC_CTYPE="pt_BR.UTF8" LC_NUMERIC="pt_BR.UTF8" LC_TIME="pt_BR.UTF8" 112

AdministraoProfissionaldoPostgreSQL1Primeirospassos LC_COLLATE="pt_BR.UTF8" LC_MONETARY="pt_BR.UTF8" LC_MESSAGES="pt_BR.UTF8" LC_PAPER="pt_BR.UTF8" LC_NAME="pt_BR.UTF8" LC_ADDRESS="pt_BR.UTF8" LC_TELEPHONE="pt_BR.UTF8" LC_MEASUREMENT="pt_BR.UTF8" LC_IDENTIFICATION="pt_BR.UTF8" LC_ALL= Assim, voc ainda conhece as diversas caractersticas regionais onde as configuraes regionais fazem diferena. Elas vo alm das categorias disponveis no PostgreSQL.
ContornandooproblemanoDebian

Para adicionar o suporte a outro encoding, precisamos configurar um novo locale. Para isso, execute o comando (como root): #dpkgreconfigurelocales Ser apresentada uma tela como esta: 69 Escolha de novas locales

Nela, voc dever escolher qual(is) locale(s) voc pretende habilitar. A lista a algo realmente bem abrangente e no nos caberia tratar aqui o caso de uma locale ausente na lista. Na prxima tela, voc 113

AdministraoProfissionaldoPostgreSQL1Primeirospassos vai configurar a locale padro de todo o sistema. Mesmo tendo instalado a locale pt_BR que trabalha com o encoding Latin1, vamos manter a do UTF-8 como padro. 70 Opo da locale padro

As locales listadas no comando anterior esto presentes no arquivo /etc/locale.gen. Se preferir, v at o arquivo retirar o comentrio da locale que deseja habilitar e execute o comando localegen para configurar a locale. Ser necessrio reiniciar o sistema, por isso a necessidade de falar disso aqui nos primeiros passos. Sistemas em produo, sobretudo com contrato de alta disponibilidade no podem ser reiniciados por qualquer coisa.
ContornandooproblemanoUbuntu

Voc no vai acreditar! No Ubuntu este processo um pouco mais complicado. Antes 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_BRISO88591 pt_BR.UTF8UTF8 en_US.UTF8UTF8 Aqui, estamos habilitando tambm o locale en_US.UTF8, o padro americano para os filhos do Debian. Agora sim execute o mesmo comando. $sudodpkgreconfigurelocales Generatinglocales... 114

AdministraoProfissionaldoPostgreSQL1Primeirospassos en_US.UTF8...uptodate pt_BR.ISO88591...done pt_BR.UTF8...uptodate pt_PT.UTF8...uptodate Generationcomplete. Se apareceram outros locales em sua lista, por causa de outros dois possveis arquivos no mesmo diretrio do nosso local. So eles pt e en. Eles podem trazer novos locales, para desabilit-los comente suas linhas adicionando cerquilhas (#) no incio de cada linha. Se quiser trocar o locale padro do sistema, mesmo que isto no seja decisivo para o funcionamento do nosso banco, edite o arquivo /etc/default/locale que dever conter as seguintes linhas: LANG="pt_BR.UTF8" LANGUAGE="pt_BR:pt:en" Em LANG, escreva o nome do locale do jeito que instalou. LANGUAGE recebe uma lista separada por dois pontos de nomes de idiomas, em geral o prefixo do nome do locale. No Ubuntu, tambm necessrio reiniciar o sistema para que as alteraes entrem em vigor.
EscolhadelocalesnoinitdbenoCREATEDATABASE

Como dito bem no incio desta seo, o comando initdb admite parmetros para definio do encoding e do locale padro do cluster. $initdbencoding=iso88591locale=pt_BRnovolocale O comando acima cria um novo cluster sob o diretrio novolocale. Uma vez iniciado este novo servio, podemos conect-lo, criar uma nova base da maneira de sempre e visualizar o resultado. postgres=#CREATEDATABASElivro; CREATEDATABASE postgres=#\l Listofdatabases 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|... : (4rows) Mesmo com o sistema por padro trabalhando com UTF-8, criamos uma instncia onde as coisas so por padro LATIN1. Que sacrilgio! 115

AdministraoProfissionaldoPostgreSQL1Primeirospassos Poderamos querer alguma configurao mais extica definindo locales diferentes para cada uma das seguites opes: IV.TabelaOpesespecficasdecategoriasdelocales Opo LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME Descrio Ordenao de strings de acordo com o alfabeto da regio O que classificar como letra de acordo com o alfabeto da regio e quem maisculo ou minsculo de quem Idioma das mensagens do sistema Formatao de moedas Formatao de nmeros. Afeta os caracteres delimitadores de decimais e casas de milhar Formatao padro de datas e horas

Como exemplo, vamos recriar o novo cluster especificando que o alfabeto do sistema ser o do ingls. $localea C POSIX pt_BR pt_BR.iso88591 pt_BR.utf8 $initdbencoding=iso88591locale=pt_BRlcctype=C novolocale Thefilesbelongingtothisdatabasesystemwillbeownedbyuser "postgres". Thisusermustalsoowntheserverprocess. Thedatabaseclusterwillbeinitializedwithlocales COLLATE:pt_BR CTYPE:C MESSAGES:pt_BR MONETARY:pt_BR NUMERIC:pt_BR TIME:pt_BR Thedefaulttextsearchconfigurationwillbesetto"english". ... 116

AdministraoProfissionaldoPostgreSQL1Primeirospassos O comando localea listou todos os locales disponveis em meu sistema operacional. Como no havia en, mas havia C (que padro americano), optei por ela. Como nossa configurao definiu alguma categoria de regionalizao diferente das demais, a sada do initdb nos apresentou um resumo das categorias. As demais linhas seguem a execuo normal do comando. Ao criar uma nova base de dados, a princpio no ser possvel bater de frente com as informaes de locale (lc_collate) encoding e da subcategoria do locale ctype. postgres=#CREATEDATABASElatinaencoding='ISO88591' lc_collate='pt_BR'; ERROR:encodingLATIN1doesnotmatchlocalept_BR.UTF8 DETAIL:ThechosenLC_CTYPEsettingrequiresencodingUTF8. STATEMENT:CREATEDATABASElatinaencoding='ISO88591' lc_collate='pt_BR'; postgres=#CREATEDATABASElatinaencoding='ISO88591' lc_collate='pt_BR'lc_ctype='pt_BR'; ERROR:newencoding(LATIN1)isincompatiblewiththeencodingof thetemplatedatabase(UTF8) HINT:Usethesameencodingasinthetemplatedatabase,oruse template0astemplate. STATEMENT:CREATEDATABASElatinaencoding='ISO88591' lc_collate='pt_BR'lc_ctype='pt_BR'; Ao executar os dois comandos acima, estamos assumindo que estamos em um cluster que seguiu o padro de regionalizao e encoding. O erro da primeira instruo foi gerado por executarmos um comando que foge do padro no encoding e no lc_collate, no entanto o lc_ctype no foi informado, o que o vai fazer seguir a categoria LC_CTYPE padro do sistema operacional, que vai trabalhar com um encoding conflitante com o informado. possvel fugir do encoding padro, desde que haja algum locale registrado vinculado ao encoding desejado ou sua distribuio no vincule as duas coisas. Para isso necessrio executar o comando com a opo de template como template0 e no template1 como sempre sugere o backend. postgres=#CREATEDATABASElatinaencoding='ISO88591' lc_collate='pt_BR'lc_ctype='pt_BR'templatetemplate0; CREATEDATABASE Nota: Template1 a base de dados principal do cluster. Possui inclusive o OID 1. Ela por padro usada como template para criao das novas bases de dados. Assim, o que existir previamente nela, ser copiado para a nova base a cada CREATE DATABASE. Existe outra base template, chamada template0 que serve de backup da primeira. Ou seja, voc at pode criar coisas na template1, mas no se recomenda mexer em nada no interior de template0.

117

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1.3 Opesdeinicializao
importante conhecer alguns parmetros de inicializao que podem sobrepor o definido na instalao e presentes nos arquivos de controle como o postgresql.conf.

1.3.1 Inicializaoviapostgres
J dissemos que o executvel postgres quem de fato inicia o aplicativo do servidor de bancos de dados. Agora h pouco, chegamos a criar um outro cluster (excutamos o initdb apontando para outro diretrio), possvel iniciar mais de uma instncia do servidor. Entretanto, necessrio atentar para dois detalhes. O primeiro que no possvel haver duas instncias em execuo que apontem para o mesmo cluster. O segundo que cada instncia dever rodar em uma porta diferente, mas este segundo assunto vamos deixar para o prximo captulo. A tabela abaixo mostra diversos parmetros que nos podem ser teis em alguma situao. Tentei ser mais breve, colocando apenas as opes que considero mais usuais, para a lista completa, consulte o guia de referncia do comando na documentao oficial. V. TabelaOpesparaopostgres Opo Descrio Opes gerais e de comportamento D Define o caminho para o cluster de onde se deve levantar a instncia do servidor. No sendo informado, vale o valor da varivel de ambiente PGDATA. d1a5 F Define o nvel de debug. Quanto maior for o valor passado (5 o mximo), mais informaes o servidor envia para mecanismo de registro de logs. Desabilita a execuo fsync no commit de uma transao. Apesar de ser um mtodo no recomendado em ambientes que no tolerem perdas de dados no caso de queda do sistema, ligar esta opo em uma instncia, deve aumentar o desempenho da aplicao2. Pode ser utilizado em testes. Se houver aumento considervel de desempenho, deve-se estudar novamente as consultas das transaes mais crticas e pode-se at chegar ao caso de verificar a disponibilidade de uma troca para uma controladora de disco mais eficiente.

Opes de conexes hnome Define o nome do host ou endereo de IP pelo qual o servidor vai receber conexes. Sobrepe o parmetro do postgresql.conf listen_address que ser visto no prximo captulo. i Tambm tem a ver com o listen_address. Usar este parmetro equivale ao valor * (todos) nesta diretiva. p Define a porta onde o servidor dever esperar as conexes. Muito til para levantar uma segunda instncia na mesma mquina. Sobrepe a diretiva
2 CompartilhodaopiniodeFbioTelles(http://www.midstorm.org/~telles),umdosmaisdestacadoscolaboradores dacomunidadePostgreSQLnoBrasilondeelediz:Notroqueseguranapordesempenho.Emgeral,ganhosde desempenhonovalemapenaseocustoforadiminuiodarobustezdoseuservidor.

118

AdministraoProfissionaldoPostgreSQL1Primeirospassos port do postgresql.conf. N Parmetro que sobrepe a diretiva de configurao do postgresql.conf max_connections. Especifica qual o nmero mximo de conexes simultneas que o servidor aceitar. Parmetro que habilita conexes seguras. Confira nas sees sobre instalao que necessrio que o servidor tenha sido compilado com suporte camada SSL (Security Socket Layer) ou, como conhecido atualmente TLS (Transport Layer Security). Veremos no captulo 3. Autenticaes e permisses que as conexes podem partir do chamado caminho local, que no significa necessariamente (embora geralmente) que so conexes requisitadas pela mquina local, mas que utilizem Unix Domain Sockets em vez da rede TCP/IP. Este parmetro especifica o diretrio onde esto os arquivos unix domain. Em geral, vale o / tmp.

kdiretrio

Opes de consumo de recursos Bbuffers Define o tamanho do buffer cache. til quando no queremos alterar o shared_buffers do postgresql.conf e desejamos fazer algum teste de consumo de memria com um valor diferente do disposto l. S Parmetro que sobrepe a diretiva de configurao do postgresql.conf work_mem. Sua letra S em aluso ao nome antigo deste parmetro que era sort_mem. Determina o tamanho de memria utilizada em processos como a organizao de registros em consultas. Devido ao fato desta rea memria no estar limitada a essa operao, o nome do parmetro mudou. Ao executar o comando postgres, o terminal ficar preso execuo. Teclar ctrl+c libera o console, mas obviamente, derruba o servio levantado por este comando. Abaixo segue uma verso bastante difundida de inicializao de um servidor PostgreSQL atravs desse comando (perceba que o usurio desprivilegiado postgres ou quem voc usou no initdb que deve executar o comando): $postgresD/usr/local/pgsql/data>logfile2>&1& O comando postgres teve sua sada padro (stdout) direcionada para um arquivo chamado logfile e sua sada de erros (stderr) direcionada para o mesmo lugar que foi a sada padro (&1 referncia sada 1 padro). O & do fim para liberar o console. Nota: Verses anteriores 8.0 chamavam esse comando de postmaster. O nome foi trocado para o nome atual mais sugestivo, mas possvel que voc encontre alguma referncia a esse nome. De qualquer forma, ainda existe, embora depreciado, um link simblico executvel para o postgres chamado postmaster no diretrio bin do servidor.

119

AdministraoProfissionaldoPostgreSQL1Primeirospassos

1.3.2 Inicializaoviapg_ctl
O pg_ctl um comando de convenincia para iniciar (chamando o executvel postgres), encerrar ou reiniciar o servio. Confira na tabela abaixo as aes possveis com esse comando: VI.TabelaAesdopg_ctl Ao start Descrio Inicia o processo do servidor. Diferente do comando postgres, aqui o comando inicia o servidor em background, no prendendo o console. Todas as mensagens do servidor sero lanadas na tela a menos que uma opo l seja utilizada. Ex.: $pg_ctlD/usr/local/pgsqlstart Inicia o servidor no cluster definido. $pg_ctlstart inicia o servidor no cluster apontado pela varivel PGDATA. $pg_ctll/var/log/pgsql/logfile Inicia o servidor no cluster apontado pela varivel PGDATA e registra as sadas no arquivo definido. Encerra o servidor. H trs modos possveis de encerramento: - Smart: Modo padro. Aguarda todas as transaes conclurem e todos os clientes desconectarem para derrubar o servidor. - Fast: Desfaz (rollback) todas as transaes correntes e desconecta todos os clientes para ento derrubar o servidor de modo seguro. - Immediate: Derruba o servidor de modo abrupto. Semelhante a um desligamento da mquina por razes como falta de energia. Dispara o processo de recovery de arquivos WAL ao reincio do servidor. uma simplesconvenincia a um stop seguido por um start. Envia o sinal SIGHUP ao servidor para que ele apenas recarregue suas configuraes, lendo os arquivos como o postgresql.conf e pg_hba.conf e siga possveis novos parmetros passados nesse momento. Apenas retorna se h um servidor rodando e em que cluster. Permite se passar o sinal desejado ao servidor. Falaremos mais sobre sinais mais frente. Disponvel apenas para o Windows. Permite registrar o servidor PostgreSQL como servio do Windows. O exato oposto da ao register. Tambm s disponvel no Windows.

stop

restart reload

status kill register unregister

A prxima tabela traz as principais opes para as aes do pg_ctl. Confira: VII.TabelaOpesparaasaesdopg_ctl Opo Descrio Ddiretrio A famosa diretiva que define o local onde est o cluster a ser iniciado. larquivo O caminho para o arquivo onde os logs de mensagem devem ser direcionados 120

AdministraoProfissionaldoPostgreSQL1Primeirospassos mmodo Flag que permite a definio dos modos de encerramento j tratados na ao stop. possvel passar apenas as iniciais dos modos: S (smart), F (fast), I (immediate). Permite a passagem de opes ao comando postgres adjacente. Note que algumas opes no esto disponveis no pg_ctl, quando voc precisar de alguma, basta repassar via opo o. Veja um exemplo: pg_ctlo"B128S100"restart Acima, reiniciamos o servidor passando as opes B (shared_buffers) e S (work_mem). Wait. S libera o console aps a esperar pela operao do servidor. o padro para a ao stop. No Wait. No espera pelo servidor para liberar o console. o padro para as aes start e restart.

oopes

w W

Apenas para o Windows Nnome Usado para definir o nome e o label do servio (service name e display name) que ser levantado. Psenha Usado para definir a senha do usurio que vai executar ou derrubar o servio. Uusurio Usado para definir o nome do usurio que vai executar ou derrubar o servio.

Modosdeencerramento

Os modos de encerramento passados pela opo -m merecem alguma prtica para visualizarmos o que de fato ocorre. Eles s diferem realmente se houver algum conectado ao servidor, por tanto, para os prximos exemplos admita que estamos querendo derrubar o servidor, mas existe algum conectado. O primeiro modo, smart, deve esperar o encerramento de todas as conexes para finalmente poder encerrar o servidor, isso est limitado a 60 segundos. $pg_ctlmsstop LOG:receivedsmartshutdownrequest LOG:autovacuumlaunchershuttingdown waitingforservertoshut down.............................................................. .failed pg_ctl:serverdoesnotshutdown $ Como o modo smart o padro no seria necessrio definir a opo ms no comando acima. Na prtica, voc vai perceber os ponto sero escritos um por segundo. Se as conexes no encerrarem nesse tempo, o shutdown falha e o servidor continua ativo como se nada tivesse acontecido. S coloquei a ltima linha com o sinal $ para mostrar que o console s ser liberado ao final da espera, seja ela com xito ou no. 121

AdministraoProfissionaldoPostgreSQL1Primeirospassos Mesmo aps a liberao do console com a mensagem de que o servidor no foi encerrado, o comando stop ainda est espreita. Assim que a ltima conexo encerrar, o servidor cai enfim ser derrubado. Para o usurio que est conectado permitido iniciar, confirmar (commit) ou reverter (rollback) qualquer transao, no entanto estar preso quela conexo, no podendo nem mesmo trocar de base de dados por dentro do psql. Confira: dellstore=#\clivro FATAL:thedatabasesystemisshuttingdown Previousconnectionkept Veja que ele no teve o direito de conectar a outra base. Isso serve para for-lo a deixar de ser Joselito, o menino que no sabe brincar, e encerrar logo que est fazendo. Agora, vamos tentar derrubar o servidor, com a opo no wait (W) para no termos o console preso. $pg_ctlWmsstop servershuttingdown $ O console foi liberado logo aps a instruo servershuttingdown ser escrita na tela. Veja que o servidor ainda no caiu: $psax|greppost 2354pts/0S0:00/usr/local/pgsql/bin/postgres 2356?Ss0:00postgres:writerprocess 2359?Ss0:00postgres:statscollectorprocess 2363?Ss0:00postgres:postgresdellstore[local] idle Agora disparamos a ao sem prender o console. Aps 60 segundos (calma, tambm no precisa cronometrar), executamos a instruo ps para listar os processos ativos na mquina e vimos que no s temos os processos bsicos do PostgreSQL, como tambm h um (o 2363 postgres dellstore[local]idle) que o cara que est impedindo o servidor de encerar. Certamente, voc ver outros processos nessa instruo, mas isso se deve apenas ao fato de termos filtrado (comando grep) a sada do ps a qualquer linha que tenha escrito a palavra post. No modo de encerramento fast (f), o servidor caiu no mesmo momento, no esperando os clientes commitarem (tenho certeza que esse neologismo voc j cometeu, todo DBA j commitou alguma coisa :-). $pg_ctlmfstop LOG:receivedfastshutdownrequest LOG:abortinganyactivetransactions LOG:autovacuumlaunchershuttingdown FATAL:terminatingconnectionduetoadministratorcommand

122

AdministraoProfissionaldoPostgreSQL1Primeirospassos LOG:shuttingdown waitingforservertoshutdown...LOG:databasesystemisshut down done serverstopped Caso um usurio esteja conectado, quando resolver operar, ter a seguinte mensagem: dellstore=#select*fromcustomers; FATAL:terminatingconnectionduetoadministratorcommand serverclosedtheconnectionunexpectedly Thisprobablymeanstheserverterminatedabnormally beforeorwhileprocessingtherequest. Theconnectiontotheserverwaslost.Attemptingreset:Failed. !> Olha s o cursor no final como ficou estranho. Se o usurio estiver no meio de uma transao, esta ser abortada. $pg_ctlmfstop LOG:receivedfastshutdownrequest LOG:abortinganyactivetransactions LOG:autovacuumlaunchershuttingdown FATAL:terminatingconnectionduetoadministratorcommand STATEMENT:CREATEtabletesteasselectc.*fromcustomersccross joinorderso; waitingforservertoshutdown....FATAL:thedatabasesystemis shuttingdown LOG:shuttingdown LOG:databasesystemisshutdown done serverstopped Agora, o servidor foi encerrado no momento em que o usurio estava realizando uma operao. O log do servidor vai coletar quais operaes foram abortadas no momento do shutdown. importante registrar isso para o caso de algum querer lhe matar depois. Pelo menos, voc poder ter uma boa pista do(s) provvel(is) criminoso(s). O mtodo de encerramento immediate (i) desencorajado, uma vez que acredita-se que no deva ser indicado tirar a mquina da tomada enquanto o sistema est no ar. Um servidor encerrado com immediate deve reler os logs WAL antes de reiniciar, confira: $pg_ctlmirestart LOG:receivedimmediateshutdownrequest 123

AdministraoProfissionaldoPostgreSQL1Primeirospassos waitingforservertoshutdown...done serverstopped serverstarting LOG:databasesystemwasinterrupted;lastknownupat20100217 15:53:49BRT LOG:databasesystemwasnotproperlyshutdown;automatic recoveryinprogress LOG:recordwithzerolengthat0/40E66E8 LOG:redoisnotrequired LOG:autovacuumlauncherstarted LOG:databasesystemisreadytoacceptconnections J que um restart chama um stop, podemos passar o modo immediate e vimos que logo no reincio, o servidor precisou realizar a recuperao dos logs WAL.
Sinaisparaprocessosemexecuo

Sinais de interrupo so uma das formas de comunicao entre processos de um sistema operacional (nem sero os nicos que falaremos por aqui). Todo processo em execuo no sistema operacional admite receber alguns sinais de interrupo. Cabe aos programadores das aplicaes, a definio de como deve responder a esses sinais. Em linguagens de mais alto nvel, normalmente os sinais j so pr-definidos pela biblioteca que est sendo usada no momento. Vejamos alguns dos sinais mais utilizados em ambiente Unix alm da forma como PostgreSQL recebe esses sinais. VIII.TabelaSinaisUnix Sinal SIGHUP(1) Descrio Sinal de recarga. Utilizado pelos programas para recarregar seus arquivos de configurao. O PostgreSQL faz exatamente isso quando recebe a ao reload do pg_ctl. Considerando que o identificador do processo (PID process ID) principal do PostgreSQL (o postgres) Os comandos abaixo so idnticos em ambiente Unix: $pg_ctlreload $kill12354 $killHUP2354 Usar o pg_ctlreload mais saudvel por no precisarmos verificar o nmero do processo antes, nem corremos o risco de mandar um sinal para o processo errado. Sinal de interrupo. Muito usado em aplicativos que rodam via console. recebido pelo processo que est executando alguma operao quando o usurio tecla CTRL+C. Em geral, os aplicativos passam para uma prxima instruo ou encerram no recebimento desse sinal. O processo postgres, que prende o console a ser executado, encerra ao receber

SIGINT(2)

124

AdministraoProfissionaldoPostgreSQL1Primeirospassos esse sinal. Enviar um SIGINT para o processo principal do servidor equivalente ao modo de encerramento fast do pg_ctl. Os comando abaixo so equivalentes em ambiente Unix: $pg_ctlmfstop $kill22354 $killINT2354 SIGQUIT(3) Sinal de quit do teclado. O PostgreSQL interpreta esse sinal de maneira equivalente ao modo de encerramento immediate. Os comandos abaixo so equivalentes em ambiente Unix: $pg_ctlmistop $kill32354 $killQUIT2354 Sinal abortar. No PostgreSQL, implementado como um SIGKILL. Sinal de morre murrinha! No importa o que o processo esteja fazendo, ao receber um sinal KILL, ele dever ser encerrado imediatamente. Os kernels dos sistemas operacionais no permitem que o sistema burle esse tipo de sinal. Sinal de encerramento normal. Equivale ao modo de encerramento smart. Os comandos abaixo so equivalentes em ambiente Unix: $pg_ctlstop $pg_ctlmsstop $kill152354 $killTERM2354

SIGABRT(6) SIGKILL(9)

SIGTERM(15)

Em ambiente Windows, a ao kill do pg_ctl vem suprir a ausncia do comando kill. No exemplo abaixo, encerramos o PostgreSQL de modo smart: $pg_ctlkillTERM2354 Em ambiente Unix, h ainda o executvel killall que envia um sinal para todos os processos de certo nome. No Debian, esse comando faz parte do pacote psmisc, que instala utilitrios como o prprio killall e o pstree, que lista processo em desenho hierrquico. Para instalar o pacote, execute: #aptgetinstallpsmisc Para executar o comando killall, voc precisa ser o usurio que iniciou o processo ou o root. Abaixo, enviaremos o sinal de encerramento normal para todos os processos postgres. $killallTERMpostgres

1.4 Saindodoclustercomnovostablespaces
O conceito de tablespace at algo bem intuitivo, no entanto sua implementao pode variar de acordo com o SGBD. O espao de tabela exatamente um local fsico onde os dados devem ser gravados no disco. Voc cria uma tablespace com uma simples instruo SQL CREATE, onde define o nome e o caminho para o diretrio onde devero ser armazenados os dados. Confira sua assinatura: 125

AdministraoProfissionaldoPostgreSQL1Primeirospassos CREATETABLESPACEtablespacename[OWNERusername]LOCATION 'diretrio' Onde diretrio precisa ser o caminho absoluto (desde a raiz) a algum diretrio pr-existente. Para o xito nessa instruo, valem as mesmas regras aplicadas ao diretrio do cluster. Ou seja, necessrio o diretrio estar vazio e pertencer ao usurio que est conectado ao servidor, criando a tablespace. S podem ser criadas por um superusurio do PostgreSQL, mas podem ser utilizadas por outros usurios. A estrutura interna de um diretrio de tablespace semelhante do cluster. Ao criar uma tabela, seus arquivos de dados sero criados da mesma maneira. Mo obra: Vamos primeiro criar o diretrio. Estamos logados como postgres e vamos criar um subdiretrio no home dele. postgres@debianpgsql:~$mkdirtblspc Vamos tentar criar o tablespace sem definir um caminho absoluto: postgres@debianpgsql:~$psqlc"CREATETABLESPACEnovoLOCATION 'tblspc'"; ERROR:tablespacelocationmustbeanabsolutepath STATEMENT:CREATETABLESPACEnovoLOCATION'tblspc' ERROR:tablespacelocationmustbeanabsolutepath Viu? Temos que corrigir isso: $psqlc"CREATETABLESPACEnovoLOCATION '/home/postgres/tblspc'"; CREATETABLESPACE Agora funcionou! Vamos ento alterar o local fsico onde est armazenado o ndice da chave primria da tabela capitulo. $psqlc"ALTERINDEXcapitulo_pkeySETTABLESPACEnovo"livro; ALTERINDEX Vamos conferir o que foi feito fisicamente: postgres@debianpgsql:~$oid2name Alldatabases: OidDatabaseNameTablespace 16603dellstorepg_default 16721latinapg_default 16402livropg_default 11564postgrespg_default 11563template0pg_default 1template1pg_default

126

AdministraoProfissionaldoPostgreSQL1Primeirospassos Assim est nosso banco de dados at o momento. Destaque para a base livro, cujo OID 16402. postgres@debianpgsql:~$ltblspc total16 drwx3postgrespostgres4096Fev1720:33. drwxrxrx3postgrespostgres4096Fev1720:24.. drwx2postgrespostgres4096Fev1720:3316402 rw1postgrespostgres4Fev1720:32PG_VERSION Olha l! O diretrio 16402 foi criado e dentro dele h um arquivo 16733. postgres@debianpgsql:~$llhtblspc/16402/ total16K rw1postgrespostgres16KFev1720:3316733 Apenas confirmando qual objeto detm esse nmero de arquivo: livro=#selectrelfilenodefrompg_classwhere relname='capitulo_pkey'; relfilenode 16733 (1row) Vamos criar mais um tablespace para mostrar o comportamento do servidor quando modificamos o tablespace de toda uma base de dados: Nota: Apenas na verso 8.4, o PostgreSQL permitiu a clusula SET TABLESPACE na instruo ALTER DATABASE. postgres@debianpgsql:~$mkdirtblspc2 $psqlc"CREATETABLESPACEnovo2LOCATION '/home/postgres/tblspc2'"; CREATETABLESPACE $psqlc"ALTERDATABASElivroSETTABLESPACEnovo2"; ALTERDATABASE Vamos listar, atravs do aplicativo oid2name onde esto fisicamente todas as bases de dados: postgres@debianpgsql:~$oid2name Alldatabases: OidDatabaseNameTablespace 16603dellstorepg_default 16721latinapg_default 16402livronovo2 127

AdministraoProfissionaldoPostgreSQL1Primeirospassos 11564postgrespg_default 11563template0pg_default 1template1pg_default Por fim, podemos conferir que todos os arquivos de dados da base livro foram transferidos para o novo diretrio, menos o arquivo do ndice que estava em outro tablespace. Assim, podemos concluir que so transferidos todos os objetos que estejam no tablespace padro da base de dados. postgres@debianpgsql:~$llhtblspc2/16402/ total5,5M rw1postgrespostgres8,0KFev1721:01112 rw1postgrespostgres8,0KFev1721:01113 rw1postgrespostgres56KFev1721:0111447 rw1postgrespostgres24KFev1721:0111447_fsm rw1postgrespostgres8,0KFev1721:0111447_vm ... postgres@debianpgsql:~$llhtblspc/16402/ total16K rw1postgrespostgres16KFev1720:3316733
Infraestruturaecatlogo

No diretrio do cluster, j dissemos que h um subdiretrio chamado pg_tblspc que justamente onde so armazenadas informaes sobre os espaos de nomes utilizados por todo cluster. O que encontramos por l so apenas links simblicos que apontam para os diretrios onde foram criados os tablespaces. O nome dos arquivos dos links so justamente os seus OIDs. $ll/usr/local/pgsql/data/pg_tblspc/ total0 lrwxrwxrwx1postgrespostgres21Fev1720:3216732> /home/postgres/tblspc lrwxrwxrwx1postgrespostgres22Fev1721:0016734> /home/postgres/tblspc2 A tabela de catlogo pg_tablespace traz dados sobre todos os tablespaces criados: postgres=#selectoid,*frompg_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

AdministraoProfissionaldoPostgreSQL1Primeirospassos (4rows) Confira o campo oid para ver se no bate com os links simblicos do diretrio pg_tblspc. O campo spcname apenas o nome, spcowner o identificador do usurio (vejamos onde est esse identificador no prximo comando, logo abaixo). O campo spclocation o caminho absoluto para o diretrio do tablespace e spcacl carrega um array de permisses direcionadas a cada tablespace. postgres=#selectusename,usesysidfrompg_user; usename|usesysid + postgres|10 (1row) A consulta anterior nos mostrou outros dois tablespaces pg_default e pg_global. O primeiro o tablespace da base template1, consequentemente tambm o da base template0 e o padro de toda nova base. A consulta no mostrou, mas j sabemos que justamente o diretrio base do cluster. O segundo onde ficam todos os objetos globais e visveis a todas as bases. justamente o diretrio global.

1.5 Resumogeral
Bom, meu amigo (ou minha amiga), eis que chegamos ao final deste primeiro captulo. A inteno aqui foi resumir o comportamento fsico do processo do servidor. A tnica foi, no caso do PostgreSQL, o que est por baixo, ou o que est por trs do que ns estamos acostumados a ver ao trabalhar com um SGBD. Fizemos o processo de instalao detalhado, em mais de um ambiente e focamos (e vamos continuar focando) nossos exemplos no Debian Lenny 5.0. Conhecemos a estrutura fsica do diretrio de dados e discutimos um pouco sobre como o servidor opera com esses dados. O que ele l ou escreve, como e quando ele realiza determinadas atividades. Muito do que foi apresentado aqui ter seu espao mais detalhado nos prximos captulos, vale a pena conferir cada um e descobrir como bem desenvolvido o nosso PostgreSQL. certamente uma boa idia voc ler o manual oficial do SGBD. Entretanto, esse foi tambm um trabalho de pesquisa e testes empricos que no esto dispostos l na documentao. Tive a honra de poder contar tambm com algumas breves mas bastante importantes explanaes de um dos mais ativos colaboradores do PostgreSQL, Heikki Linnakangas, da EnterpriseDB, criador do novo modelo de mapeamento de espao livre (FSM).

129

AdministraoProfissionaldoPostgreSQL2Opesdeconfigurao

2 Opesdeconfigurao
Veremos neste captulo, que o PostgreSQL admite muito mais opes de configurao do que as passadas no ato de chamada aos executveis initdb, postgres ou pg_ctl. Vamos focar este captulo no postgresql.conf, principal arquivo de configurao de todo o cluster. Em geral, esse arquivo pode ser encontrado no diretrio do cluster, mas possvel estar em outro lugar. Quando voc quiser iniciar uma instncia do servidor lendo um arquivo postgresql.conf de outro diretrio, ser necessrio passar um parmetro ao comando postgres que deixamos para falar apenas aqui. Veja: $postgrescconfig_file=/etc/postgresql/8.4/main/postgresql.conf Este exemplo foi tirado do processo padro do PostgreSQL, instalado via pacotes no Ubuntu (omiti apenas a opo D que j discutimos antes).

130