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 :
-
Connectez-vous en tant qu'utilisateur postgres :
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
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
-
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 blancExaminer 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.