Skip to main content

Meu PostgreSQL não conecta, Paulo Vitor Cabral – PGConf.Brasil 2022

By 10 de novembro de 2023novembro 24th, 2023Eventos

É 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:

  1. Formas de conexão
  2. Casos comuns de falha de conexão
  3. O que verificar?
  4. Como verificar?
  5. 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:

Leave a Reply