Você está na página 1de 3

Meu PostgreSQL no conecta!

Comeando do incio...
Observao: Apesar de os testes terem sido feitos em ambiente Linux, os comandos (ping, telnet, psql) e arquivos de configurao (postgresql.conf, pg_hba.conf) existem e funcionam tambm no Windows, Macintosh ou FreeBSD, no respectivo terminal. Antes de tudo, faamos alguns testes que respondem algumas perguntas.

A mquina est no ar e enxergada na rede pelo cliente?


Um simples "ping" pode nos ajudar:
$ ping 10.15.23.15

Se estiver tudo correto, aparecer o texto abaixo:


rodrigo@asgard:~$ ping 10.15.23.15 PING 10.15.23.15 (10.15.23.15) 56(84) bytes of data. 64 bytes from 10.15.23.15: icmp_seq=1 ttl=64 time=0.044 64 bytes from 10.15.23.15: icmp_seq=2 ttl=64 time=0.034 64 bytes from 10.15.23.15: icmp_seq=3 ttl=64 time=0.034 --- 10.15.23.15 ping statistics --3 packets transmitted, 3 received, 0% packet loss, time rtt min/avg/max/mdev = 0.034/0.037/0.044/0.006 ms ms ms ms 1999ms

Se este for o caso, resolva este problema de conexo e configurao de rede antes de continuar.

O servidor est respondendo ao servio na porta do PostgreSQL?


Se no estiver, qualquer acesso externo ao PostgreSQL barrado, e a seguinte mensagem ser exibida:
psql: could not connect to server: Conexo recusada Is the server running on host "10.15.23.15" and accepting TCP/IP connections on port 5432?

Para comprovar isso, podemos fazer um simples teste com o "telnet":


$ telnet 10.15.23.15 5432 rodrigo@asgard:~$ telnet 10.15.23.15 5432 Trying 10.15.23.15... telnet: Unable to connect to remote host: Connection refused

Este um problema que ocorre com 5 de cada 4 iniciantes neste banco de dados: a conexo nolocal! Bom, o fato que a configurao padro do PostgreSQL faz com que apenas conexes locais (via soquete UNIX) sejam permitidas. O primeiro passo alterar uma opo no arquivo de configuraes postgresql.conf:

Verso Original Mudar para 7.X e anteriores tcpip_socket = false tcpip_socket = true 8.X em diante listen_addresses = 'localhost' listen_addresses = '*' Aps salvar o arquivo, ser preciso reiniciar o SGBD (no basta apenas fazer um "reload"). Agora refaa o teste do "telnet". Ter que aceitar a conexo e aparecer este texto:
rodrigo@asgard:~$ telnet 10.15.23.15 5432 Trying 10.15.23.15... Connected to 10.15.23.15. Escape character is '^]'.

D um CTRL+C para sair. Se ainda no funcionar, ser preciso verificar se firewalls no esto impedindo a conexo entre o cliente e o servidor, na porta do PostgreSQL (padro: 5432). Resolva essa questo antes de continuar a leitura... Opa! Metade do servio est concluda! Agora, outro problema que atormenta quem est comeando, este erro ao tentar se conectar:
$ psql -h 10.15.23.15 correios rodrigo psql: FATAL: nenhuma entrada no pg_hba.conf para mquina "10.15.22.32", usurio "rodrigo", banco de dados "correios", SSL desabilitado

Sigamos a dica que o PostgreSQL nos d! Abra o seguinte arquivo de configurao: pg_hba.conf. Este arquivo controla: quais hosts tm permisso de conexo, como os clientes se autenticam, quais usurios do PostgreSQL podem ser usados e que bancos de dados eles podem acessar. Os registros podem ter uma das seguintes formas:
local host hostssl hostnossl DATABASE DATABASE DATABASE DATABASE USER USER USER USER METHOD [OPTION] CIDR-ADDRESS METHOD CIDR-ADDRESS METHOD CIDR-ADDRESS METHOD [OPTION] [OPTION] [OPTION]

Sendo assim, nestas entradas de permisses de acesso ao PostgreSQL, podemos alterar: tipo de conexo ("local", "host") banco de dados ("all": todos) usurio ("all": todos) endereo IP e mscara (estilo CIDR) mtodo ("reject", "trust", "password", "md5", "ident same user")

Importante: o arquivo lido de cima para baixo, e a primeira entrada que esteja de acordo com a requisio considerada. Isso um fato que s vezes confunde os administradores. Os campos podem ser separados por espaos ou tabulaes - tanto faz, funcionar de ambas as formas. Bom, para resolver o problema em questo, precisamos incluir a seguinte linha:
host correios rodrigo 10.15.22.32/32 md5

Desta vez, no ser preciso reiniciar o PostgreSQL. No Linux, podemos enviar um sinal do tipo HUP das seguintes maneiras:
$ /etc/init.d/postgresql-8.1 reload $ killall -HUP postmaster

No Windows eu vou ficar devendo, mas deve ser algo como "recarregar o servio". Pronto! Simples, no? Se voc quiser, pode fazer com que o PostgreSQL funcione de modo promscuo, adicionando a seguinte linha:
host all all 0.0.0.0/0 trust

Isso faz com que qualquer usurio, de qualquer IP acesse qualquer banco de dados, e sem necessidade de senha! Se, ao invs de "trust" for usado "reject", todo acesso ser fechado. Lembre-se que, pelo padro CIDR de endereamento, diversos IPs podem ser configurados com uma s linha! Por exemplo, ambas as linhas abaixo fazem com que toda a subrede do IP 10.15.22.32/22 tenha acesso, por senha, ao banco "correios":
host host correios correios all all 10.15.20.0/22 10.15.22.32 password 255.255.252.0 password

Uma coisa interessante restringir o acesso ao usurio "postgres", Senhor de Todo o Cluster, com a incluso da seguinte linha:
local all postgres ident sameuser

Com isso, somente acesso local (via "ssh" e instruo "su - postgres") poder ser feita com este super usurio, que tem permisso para fazer o que quiser em qualquer banco de dados.