É bastante comum que desenvolvedores, tanto iniciantes quanto alguns mais experientes, enfrentem desafios ao tentar conectar suas aplicações ao PostgreSQL. Durante sua apresentação no evento PGConf.Brasil 2022, o consultor da Timbira, Paulo Vitor Cabral, explorou as situações mais recorrentes de falhas de conexão no PostgreSQL e ofereceu soluções em sua palestra “Meu PostgreSQL não conecta”.
Nesta palestra, foram abordados os seguintes tópicos:
- Formas de conexão
- Casos comuns de falha de conexão
- O que verificar?
- Como verificar?
- Bônus
Transcrição:
É bem chato quando queremos aprender alguma nova tecnologia e nos deparamos com algumas barreiras que atrasam nossa evolução. Isso acontece porque geralmente não iniciamos nosso aprendizado buscando informações na documentação oficial, mas sim, testando na prática a utilização desta tecnologia. E com o PostgreSQL não é diferente.
1- Formas de conexão
Existem duas formas de conexão ao PostgreSQL:
1- Socket: É um arquivo Unix com uma porta associada a ele
2- Host: Uma conexão via protocolo TCP/IP
2- Casos comuns de falhas de conexão
Falha de conexão ao socket:
> $ psql -d pgconfbr2022 -U elefante psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket?
Falha de autenticação no pg_hba.conf
> $ psql -h 150.xxx.xxx.5 -d pgconfbr2022 -U elefante psql: error: connection to server at "150.xxx.xxx.5", port 5432 failed: FATAL: no pg_hba.conf entry for host "186.xxx.xxx.179", user "elefante", database "pgconfbr2022", SSL encryption connection to server at "150.xxx.xxx.5", port 5432 failed: FATAL: no pg_hba.conf entry for host "186.xxx.xxx.179", user "elefante", database "pgconfbr2022", no encryption
Falha de autenticação via peer
ubuntu@lab01:~$ psql -p 5432 -d postgres -U postgres psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"
3- O que devemos verificar?
Devemos fazer um “troubleshooting ” para identificar o possível ponto de falha na conexão ao cluster. Podemos fazer isso com algumas verificações:
– Serviço do PostgreSQL
– parâmetro listen_addresses
– Porta
– pg_hba.conf
4- Como devemos verificar?
Podemos verificar diretamente nos processos se o serviço do PostgreSQL está sendo executado.
Exemplos:
postgres@lab01:~$ pgrep postgres -fa 8125 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf 8126 postgres: 14/main: logger 8128 postgres: 14/main: checkpointer 8129 postgres: 14/main: background writer 8130 postgres: 14/main: walwriter 8131 postgres: 14/main: autovacuum launcher 8132 postgres: 14/main: stats collector 8133 postgres: 14/main: logical replication launcher
Gerenciador de tarefas do Windows:
Utilitário ps no linux:
>~$ ps -fax | grep postgres 994 ? Ss 0:04 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf 1029 ? Ss 0:00 \_ postgres: 14/main: logger 1031 ? Ss 0:00 \_ postgres: 14/main: checkpointer 1032 ? Ss 0:00 \_ postgres: 14/main: background writer 1033 ? Ss 0:00 \_ postgres: 14/main: walwriter 1034 ? Ss 0:00 \_ postgres: 14/main: autovacuum launcher 1035 ? Ss 0:01 \_ postgres: 14/main: stats collector 1036 ? Ss 0:00 \_ postgres: 14/main: logical replication launcher
Via systemctl:
>~$ systemctl status postgresql
-
postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Sat 2022-08-20 20:51:09 UTC; 17h ago Process: 1097 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 1097 (code=exited, status=0/SUCCESS) CPU: 3ms Aug 20 20:51:09 lab01 systemd[1]: Starting PostgreSQL RDBMS... Aug 20 20:51:09 lab01 systemd[1]: Finished PostgreSQL RDBMS.
Parâmetro listen_addresses
É possível colocarmos um endereço IP ou uma faixa de endereços que o PostgreSQL “escutará” ao subirmos o serviço.
No `listen_addresses` podemos definir as seguintes opções:
– hostname
– IPv4/IPv6
– 0.0.0.0
– ::
– *
Obs.: se ele estiver vazio (default), somente conexões locais serão aceitas.
Exemplos:
- `listen_addresses = '*'` [2022-08-20 08:28:43 UTC] LOG: 00000: listening on IPv4 address "0.0.0.0", port 5432 [2022-08-20 08:28:43 UTC] LOG: 00000: listening on IPv6 address "::", port 5432 [2022-08-20 08:28:43 UTC] LOG: 00000: listening on Unix socket "/tmp/.s.PGSQL.5432" [2022-08-20 08:28:43 UTC] LOG: 00000: database system was shut down at 2022-08-20 08:28:43 UTC [2022-08-20 08:28:43 UTC] LOG: 00000: database system is ready to accept connections - `listen_addresses = '127.0.0.1,*'` [2022-08-20 09:13:42 UTC] LOG: 00000: listening on IPv4 address "127.0.0.1", port 5432 [2022-08-20 09:13:42 UTC] LOG: XX000: could not bind IPv4 address "0.0.0.0": Address already in use [2022-08-20 09:13:42 UTC] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. [2022-08-20 09:13:42 UTC] LOG: 00000: listening on IPv6 address "::", port 5432 [2022-08-20 09:13:42 UTC] LOG: 00000: listening on Unix socket "/tmp/.s.PGSQL.5432" [2022-08-20 09:13:42 UTC] LOG: 00000: database system was shut down at 2022-08-20 09:13:42 UTC [2022-08-20 09:13:42 UTC] LOG: 00000: database system is ready to accept connections
- Referências: https://pgpedia.info/l/listen_addresses.html, https://www.postgresql.org/docs/current/runtime-config-connection.html
Porta
Via host ou socket a conexão deve passar por uma porta. O padrão é 5432. Devemos investigar a porta em que o serviço do PostgreSQL estará em execução.
>~$ sudo ss -nltp | grep LISTEN LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=3466,fd=5))
pg_hba.conf
É um arquivo de configuração do PostgreSQL responsável por definir as regras de autenticação no cluster utilizando os filtros de:
– Usuário
– Database
– Host
– Forma de autenticação
Obs.: hba = host-based authentication
Cada linha no pg_hba.conf é um registro e é respeitada uma hierarquia do início para o fim do arquivo.
Exemplos:
# TYPE DATABASE USER ADDRESS METHOD # Aceitar conexões locais do usuário elefante no database pgconfbr2022, sem senha host pgconfbr2022 elefante 127.0.0.1/32 trust # Aceitar conexões para o grupo elefante e usuários com GRANT dele, de determinado IP em todos os databases, com senha host all +elefante 187.131.242.37/32 md5 # Aceitar conexões para databases provenientes do arquivo $PGDATA/financeiro a partir do usuário postgres, de um certo domínio e com senha host @financeiro postgres .elefante.com scram-sha-256
No PostgreSQL
sql SELECT * FROM pg_hba_file_rules;
5- Bônus
– Guia de troubleshooting: https://mydbanotebook.org/post/cant-connect/
– Seguir o diagrama com as orientações descritas ali
Referências: