O relatório de erros do PostgreSQL segue um guia de estilo destinado a fornecer ao administrador do banco de dados as informações necessárias para solucionar problemas com eficiência. As mensagens de erro normalmente contêm uma breve descrição, seguida de algumas informações detalhadas e uma dica, se aplicável, sugerindo a solução. Existem outros detalhes, explicados no guia, como o uso do tempo passado ou presente para indicar se o erro é temporário ou permanente.
Tipos de erros e níveis de gravidade
Ao relatar erros, o PostgreSQL também retornará um código de erro SQLSTATE, portanto, os erros são classificados em várias classes. Ao revisar a lista de classes, observe que o sucesso e o aviso também são registrados pelo PostgreSQL no log de erros — isso porque logging_collector, o processo do PostgreSQL responsável pelo log, envia todas as mensagens para stderr por padrão.
Quando o coletor de log não foi inicializado, os erros são registrados no log do sistema. Por exemplo, ao tentar iniciar o serviço após a instalação do pacote:
[[email protected] ~]# systemctl start postgresql
Job for postgresql.service failed because the control process exited with error code.
See "systemctl status postgresql.service" and "journalctl -xe" for details.
[[email protected] ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2018-01-24 19:10:04 PST; 8s ago
Process: 1945 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=1/FAILURE)
Jan 24 19:10:04 omiday.can.local systemd[1]: Starting PostgreSQL database server...
Jan 24 19:10:04 omiday.can.local postgresql-check-db-dir[1945]: Directory "/var/lib/pgsql/data" is missing or empty.
Jan 24 19:10:04 omiday.can.local postgresql-check-db-dir[1945]: Use "/usr/bin/postgresql-setup --initdb"
Jan 24 19:10:04 omiday.can.local postgresql-check-db-dir[1945]: to initialize the database cluster.
Jan 24 19:10:04 omiday.can.local postgresql-check-db-dir[1945]: See /usr/share/doc/postgresql/README.rpm-dist for more information.
Jan 24 19:10:04 omiday.can.local systemd[1]: postgresql.service: Control process exited, code=exited status=1
Jan 24 19:10:04 omiday.can.local systemd[1]: Failed to start PostgreSQL database server.
Jan 24 19:10:04 omiday.can.local systemd[1]: postgresql.service: Unit entered failed state.
Jan 24 19:10:04 omiday.can.local systemd[1]: postgresql.service: Failed with result 'exit-code'.
Ao retornar mensagens de erro para clientes e, portanto, registrar no log de erros, as mensagens são registradas com um nível de gravidade controlado usando o parâmetro client_min_messages. O log nos arquivos de log do servidor é controlado pelo parâmetro log_min_messages, enquanto o log_min_error_statement permite o log de instruções SQL que causam um erro de um nível de gravidade específico.
O PostgreSQL pode ser configurado para registrar nos seguintes níveis de gravidade:
- PÂNICO: Todas as sessões de banco de dados são abortadas. Esta é uma situação crítica que afeta todos os clientes.
- FATAL: A sessão atual é abortada devido a um erro. O cliente pode tentar novamente. Outros bancos de dados no cluster não são afetados.
- LOG: Mensagens de operação normal.
- ERRO: Falha ao executar um comando. Este é um erro permanente.
- AVISO: Um evento que, embora não impeça a conclusão do comando, pode levar a falhas se não for resolvido. O monitoramento de avisos é uma boa prática na detecção precoce de problemas no servidor e no aplicativo.
- AVISO: Informações que os clientes podem usar para melhorar seu código.
- INFORMAÇÕES: Registros solicitados explicitamente pelos clientes.
- DEBUG1..DEBUG5: Informações do desenvolvedor.
Nota:As mensagens de nível superior incluem mensagens de níveis inferiores, ou seja, definir o nível de registro como LOG, instruirá o PostgreSQL a também registrar mensagens FATAL e PANIC.
Erros comuns e como corrigi-los
O que se segue é uma lista não exaustiva:
Mensagem de erro
psql: could not connect to server: No such file or directory
Causa
[[email protected] ~]# psql -U postgres
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Resolução
Verifique se o serviço PostgreSQL está sendo executado usando as ferramentas do sistema operacional (ps, netstat, ss, systemctl) ou verifique a presença de postmaster.pid no diretório de dados.
Mensagem de erro
psql: FATAL: Peer authentication failed for user "postgres"
Causa
[[email protected] ~]# psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Resolução
O arquivo de log conterá uma mensagem mais detalhada para esse efeito:
LOG: provided user name (postgres) and authenticated user name (root) do not match
FATAL: Peer authentication failed for user "postgres"
DETAIL: Connection matched pg_hba.conf line 80: "local all all peer"
Siga esses passos:
-
Faça login como usuário postgres:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
Faça a seguinte alteração no pg_hba.conf que permitirá que o usuário root faça login sem uma senha:
--- a/var/lib/pgsql/data/pg_hba.conf +++ b/var/lib/pgsql/data/pg_hba.conf @@ -77,6 +77,7 @@ # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only +local all postgres trust local all all peer # IPv4 local connections: host all all 127.0.0.1/32 ident
-
Recarregue o serviço e teste:
[[email protected] ~]# psql -U postgres psql (9.6.6) Type "help" for help. postgres=#
Mensagem de erro
psql: could not connect to server: Connection refused
Is the server running on host "192.168.0.11" and accepting
TCP/IP connections on port 5432?
Causa
Um cliente tentou uma conexão com o endereço IP público.
Nota:Este é um erro retornado ao cliente, no exemplo acima psql. No caso de um aplicativo da web, verifique o log de erros do servidor da web.
Resolução
Configure o serviço para escutar no endereço IP público:
Observação:como prática recomendada, use alter system em vez de editar postgresql.conf.
postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM
O comando alter system modificou o postgresql.auto.conf conforme mostrado abaixo:
--- a/var/lib/pgsql/data/postgresql.auto.conf
+++ b/var/lib/pgsql/data/postgresql.auto.conf
@@ -1,2 +1,3 @@
# Do not edit this file manually!
-# It will be overwritten by the ALTER SYSTEM command.
+# It will be overwritten by ALTER SYSTEM command.
+listen_addresses = 'localhost,192.168.0.11'
Reinicie o serviço e teste:
[[email protected] ~]# psql -U webuser -h 192.168.0.11 webapp
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Abordaremos esse erro no próximo tópico.
Mensagem de erro
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Causa
O serviço PostgreSQL executado no endereço IP 192.168.0.11 não está configurado para permitir que o usuário webuser se conecte ao banco de dados webapp.
Resolução
Modifique o arquivo de acesso pg_hba.conf para permitir a conexão:
--- a/var/lib/pgsql/data/pg_hba.conf
+++ b/var/lib/pgsql/data/pg_hba.conf
@@ -81,6 +81,7 @@
local all postgres trust
local all all peer
# IPv4 local connections:
host all webuser 127.0.0.1/32 md5
+host all webuser 192.168.0.11/32 md5
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all webuser ::1/128 md5
Recarregue o serviço e teste:
[[email protected] ~]# psql -U webuser -h 192.168.0.11 webapp
Password for user webuser:
psql (9.6.6)
Type "help" for help.
webapp=> \c
You are now connected to database "webapp" as user "webuser".
Mensagem de erro
ERROR: syntax error at or near "grant"
Causa
Grant é uma das palavras-chave reservadas do PostgreSQL
Resolução
As palavras-chave reservadas devem ser citadas:
webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
Table "public.grant"
Column | Type | Modifiers
--------+---------+-----------
id | numeric |
webapp=>
Mensagem de erro
ERROR: cannot drop table cust because other objects depend on it
Causa
Um cliente tentou remover a tabela cust que possui tabelas filhas.
Resolução
Revise a DICA no arquivo de log:
ERROR: cannot drop table cust because other objects depend on it
DETAIL: table cust_region_1 depends on table cust
HINT: Use DROP ... CASCADE to drop the dependent objects too.
STATEMENT: drop table cust;
Mensagem de erro
ERROR: invalid input syntax for type numeric: "b" at character 26
Causa
O arquivo de log revela uma tentativa de inserir um valor que não corresponde ao tipo de coluna:
ERROR: invalid input syntax for type numeric: "b" at character 26
STATEMENT: insert into cust values ('b', 2);
Resolução
Este é um erro do lado do aplicativo que deve ser corrigido pelos desenvolvedores ou se foi iniciado por um cliente, como um DBA executando o psql. Nenhuma ação é exigida pelo DBA de produção, pois a mensagem de erro completa também foi retornada ao cliente.
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper
Revisando e monitorando registros
A opção mais simples é configurar o PostgreSQL para usar o syslog por meio do parâmetro log_destination para que os logs possam ser enviados para seu sistema de log centralizado favorito (por exemplo, rsyslog) e depois processados para alertar sobre condições de erro específicas.
Outra ferramenta que requer quase nenhuma configuração é tail_n_mail, que funciona em combinação com o daemon cron.
Outra ferramenta nesta lista é o pgBadger que vem com um rico conjunto de opções para relatórios, visualização e análise não apenas dos arquivos de log do PostgreSQL, mas também das informações registradas pelo coletor de estatísticas.
Subindo na escala de complexidade, a organização pode se beneficiar investindo tempo e esforço para configurar uma pilha ELK, que usa o módulo Filebeat PostgreSQL para gerar alertas e relatórios.
Conclusão
Revisar os logs de erros, ser notificado sobre problemas críticos e ter um sistema de gerenciamento de logs versátil que auxilia na solução de problemas é importante para manter um ambiente de banco de dados saudável. Felizmente, o PostgreSQL oferece uma rica estrutura de gerenciamento de erros, refletida na grande variedade de produtos disponíveis para escolha. Os critérios para selecionar os que melhor se adequam a um ambiente específico devem incluir não apenas as características do produto, mas também o conhecimento técnico necessário.