PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment décoder les journaux d'erreurs PostgreSQL

Le rapport d'erreurs PostgreSQL suit un guide de style visant à fournir à l'administrateur de la base de données les informations nécessaires pour résoudre efficacement les problèmes. Les messages d'erreur contiennent normalement une brève description, suivie de quelques informations détaillées et d'un indice, le cas échéant, suggérant la solution. Il y a d'autres petits détails, expliqués dans le guide, comme l'utilisation du passé ou du présent pour indiquer si l'erreur est temporaire ou permanente.

Types d'erreurs et niveaux de gravité

Lors du signalement d'erreurs, PostgreSQL renverra également un code d'erreur SQLSTATE, par conséquent, les erreurs sont classées en plusieurs classes. Lors de l'examen de la liste des classes, notez que le succès et l'avertissement sont également consignés par PostgreSQL dans le journal des erreurs - c'est parce que logging_collector, le processus PostgreSQL responsable de la journalisation, envoie tous les messages à stderr par défaut.

Lorsque le collecteur de journalisation n'a pas été initialisé, les erreurs sont consignées dans le journal système. Par exemple, lors d'une tentative de démarrage du service après l'installation du package :

[[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'.

Lors du renvoi de messages d'erreur aux clients, et donc de la journalisation dans le journal des erreurs, les messages sont consignés avec un niveau de gravité contrôlé à l'aide du paramètre client_min_messages. La journalisation dans les fichiers journaux du serveur est contrôlée par le paramètre log_min_messages, tandis que log_min_error_statement permet la journalisation des instructions SQL qui provoquent une erreur d'un niveau de gravité spécifique.

PostgreSQL peut être configuré pour se connecter aux niveaux de gravité suivants :

  • PANIQUE : Toutes les sessions de base de données sont abandonnées. Il s'agit d'une situation critique qui affecte tous les clients.
  • FATAL : La session en cours est interrompue en raison d'une erreur. Le client peut réessayer. Les autres bases de données du cluster ne sont pas affectées.
  • LOG : Messages de fonctionnement normal.
  • ERREUR : Échec de l'exécution d'une commande. Il s'agit d'une erreur permanente.
  • AVERTISSEMENT : Un événement qui, tout en n'empêchant pas l'exécution de la commande, peut entraîner des échecs s'il n'est pas résolu. La surveillance des avertissements est une bonne pratique pour la détection précoce des problèmes côté serveur et côté application.
  • AVIS : Informations que les clients peuvent utiliser pour améliorer leur code.
  • INFO : Journaux explicitement demandés par les clients.
  • DEBUG1..DEBUG5 : Informations pour les développeurs.

Remarque :les messages de niveau supérieur incluent les messages de niveaux inférieurs, c'est-à-dire que définir le niveau de journalisation sur LOG, demandera à PostgreSQL de consigner également les messages FATAL et PANIC.

Erreurs courantes et comment les corriger

Ce qui suit est une liste non exhaustive :

Message d'erreur

psql: could not connect to server: No such file or directory

Cause

[[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"?

Résolution

Vérifiez que le service PostgreSQL est en cours d'exécution à l'aide des outils du système d'exploitation (ps, netstat, ss, systemctl) ou vérifiez la présence de postmaster.pid dans le répertoire de données.

Message d'erreur

psql: FATAL:  Peer authentication failed for user "postgres"

Cause

[[email protected] ~]# psql -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"

Résolution

Le fichier journal contiendra un message plus détaillé à cet effet :

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"

Suivez ces étapes :

  1. Connectez-vous en tant qu'utilisateur postgres :

    [[email protected] ~]# su - postgres
    [[email protected] ~]$ psql
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#
  2. Apportez la modification suivante à pg_hba.conf qui permettra à l'utilisateur root de se connecter sans mot de passe :

    --- 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
  3. Rechargez le service et testez :

    [[email protected] ~]# psql -U postgres
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#

Message d'erreur

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?

Cause

Un client a tenté de se connecter à l'adresse IP publique.

Remarque :Il s'agit d'une erreur renvoyée au client, dans l'exemple ci-dessus psql. Dans le cas d'une application Web, consultez le journal des erreurs du serveur Web.

Résolution

Configurez le service pour écouter sur l'adresse IP publique :

Remarque :comme meilleure pratique, utilisez alter system plutôt que de modifier postgresql.conf.

postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM

La commande alter system a modifié le postgresql.auto.conf comme indiqué ci-dessous :

--- 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'

Redémarrez le service et testez :

[[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

Nous aborderons cette erreur dans le sujet suivant.

Message d'erreur

psql: FATAL:  no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off

Cause

Le service PostgreSQL exécuté sur l'adresse IP 192.168.0.11 n'est pas configuré pour permettre à l'utilisateur webuser de se connecter à la base de données webapp.

Résolution

Modifiez le fichier d'accès pg_hba.conf pour autoriser la connexion :

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

Rechargez le service et testez :

[[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".

Message d'erreur

ERROR:  syntax error at or near "grant"

Cause

Grant est l'un des mots clés réservés de PostgreSQL

Résolution

Les mots clés réservés doivent être entre guillemets :

webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
     Table "public.grant"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | numeric |

webapp=>

Message d'erreur

ERROR:  cannot drop table cust because other objects depend on it

Cause

Un client a tenté de supprimer la table cust qui a des tables enfants.

Résolution

Consultez HINT dans le fichier journal :

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;

Message d'erreur

ERROR:  invalid input syntax for type numeric: "b" at character 26

Cause

Le fichier journal révèle une tentative d'insertion d'une valeur qui ne correspond pas au type de colonne :

ERROR:  invalid input syntax for type numeric: "b" at character 26
STATEMENT:  insert into cust values ('b', 2);

Résolution

Il s'agit d'une erreur côté application qui doit être corrigée par les développeurs, ou si elle a été initiée par un client tel qu'un DBA exécutant psql. Aucune action n'est requise de la part du DBA de production, car le message d'erreur complet a également été renvoyé au client.

Téléchargez le livre blanc aujourd'hui PostgreSQL Management &Automation with ClusterControlDécouvrez ce que vous devez savoir pour déployer, surveiller, gérer et faire évoluer PostgreSQLTélécharger le livre blanc

Examiner et surveiller les journaux

L'option la plus simple consiste à configurer PostgreSQL pour qu'il utilise syslog via le paramètre log_destination afin que les journaux puissent être envoyés à votre système de journalisation centralisé préféré (par exemple, rsyslog), puis traités ultérieurement pour alerter sur des conditions d'erreur spécifiques.

Un autre outil, qui nécessite une configuration quasi nulle, est tail_n_mail, qui fonctionne en combinaison avec le démon cron.

Un autre outil de cette liste est pgBadger qui est livré avec un riche ensemble d'options pour rapporter, visualiser et analyser non seulement les fichiers journaux PostgreSQL mais aussi les informations enregistrées par le collecteur de statistiques.

En évoluant sur l'échelle de complexité, l'organisation peut bénéficier du temps et des efforts investis dans la configuration d'une pile ELK, qui utilise le module Filebeat PostgreSQL pour générer des alertes et des rapports.

Conclusion

L'examen des journaux d'erreurs, la notification des problèmes critiques et le fait de disposer d'un système de gestion des journaux polyvalent qui facilite le dépannage sont importants pour maintenir un environnement de base de données sain. Heureusement, PostgreSQL fournit un cadre de gestion des erreurs riche, reflété dans la grande variété de produits disponibles parmi lesquels choisir. Les critères de sélection de ceux qui conviennent le mieux à un environnement spécifique doivent inclure non seulement les fonctionnalités du produit, mais également l'expertise technique requise.