PostgreSQL-foutrapportage volgt een stijlgids die bedoeld is om de databasebeheerder te voorzien van de informatie die nodig is om problemen efficiënt op te lossen. Foutmeldingen bevatten normaal gesproken een korte beschrijving, gevolgd door wat gedetailleerde informatie en een hint, indien van toepassing, die de oplossing voorstelt. Er zijn nog andere fijne details, die in de gids worden uitgelegd, zoals het gebruik van de verleden of tegenwoordige tijd om aan te geven of de fout tijdelijk of permanent is.
Soorten fouten en ernstniveaus
Bij het rapporteren van fouten zal PostgreSQL ook een SQLSTATE-foutcode retourneren, daarom worden fouten ingedeeld in verschillende klassen. Houd er bij het bekijken van de lijst met klassen rekening mee dat succes en waarschuwing ook door PostgreSQL worden vastgelegd in het foutenlogboek - dat komt omdat logging_collector, het PostgreSQL-proces dat verantwoordelijk is voor het loggen, alle berichten naar stderr stuurt standaard.
Als de logboekverzamelaar niet is geïnitialiseerd, worden fouten in het systeemlogboek vastgelegd. Als u bijvoorbeeld probeert de service te starten na de installatie van het pakket:
[[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'.
Bij het retourneren van foutberichten naar clients, en dus het loggen in het foutenlogboek, worden berichten vastgelegd met een ernstniveau dat wordt beheerd met behulp van de parameter client_min_messages. Logboekregistratie naar serverlogbestanden wordt beheerd door de parameter log_min_messages, terwijl log_min_error_statement het loggen van SQL-instructies mogelijk maakt die een fout met een specifiek ernstniveau veroorzaken.
PostgreSQL kan worden geconfigureerd om te loggen op de volgende ernstniveaus:
- PANIEK: Alle databasesessies worden afgebroken. Dit is een kritieke situatie die alle klanten treft.
- FATAL: De huidige sessie is afgebroken vanwege een fout. De cliënt kan het opnieuw proberen. Andere databases in het cluster worden niet beïnvloed.
- LOGBOEK: Berichten over normale werking.
- FOUT: Het niet uitvoeren van een opdracht. Dit is een permanente fout.
- WAARSCHUWING: Een gebeurtenis die de voltooiing van de opdracht niet verhindert, maar kan leiden tot fouten als deze niet wordt aangepakt. Het controleren op waarschuwingen is een goede gewoonte bij het vroegtijdig detecteren van problemen aan zowel de server- als de applicatiekant.
- KENNISGEVING: Informatie die klanten kunnen gebruiken om hun code te verbeteren.
- INFO: Logboeken expliciet aangevraagd door klanten.
- DEBUG1..DEBUG5: Informatie over ontwikkelaars.
Opmerking:Berichten op een hoger niveau bevatten berichten van lagere niveaus, d.w.z. door het logboekniveau in te stellen op LOG, zal PostgreSQL instrueren om ook FATAL- en PANIC-berichten te loggen.
Veelvoorkomende fouten en hoe ze te verhelpen
Wat volgt is een niet-limitatieve lijst:
Foutbericht
psql: could not connect to server: No such file or directory
Oorzaak
[[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"?
Oplossing
Controleer of de PostgreSQL-service actief is met behulp van hulpprogramma's voor het besturingssysteem (ps, netstat, ss, systemctl) of controleer op de aanwezigheid van postmaster.pid in de gegevensmap.
Foutbericht
psql: FATAL: Peer authentication failed for user "postgres"
Oorzaak
[[email protected] ~]# psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Oplossing
Het logbestand zal een meer gedetailleerd bericht in die zin bevatten:
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"
Volg deze stappen:
-
Log in als de postgres-gebruiker:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
Breng de volgende wijziging aan in pg_hba.conf, zodat de rootgebruiker kan inloggen zonder wachtwoord:
--- 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
-
Laad de service opnieuw en test:
[[email protected] ~]# psql -U postgres psql (9.6.6) Type "help" for help. postgres=#
Foutbericht
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?
Oorzaak
Een client heeft geprobeerd verbinding te maken met het openbare IP-adres.
Opmerking:dit is een fout die wordt geretourneerd aan de client, in het bovenstaande voorbeeld psql. Controleer in het geval van een webtoepassing het foutenlogboek van de webserver.
Oplossing
Configureer de service om te luisteren op het openbare IP-adres:
Opmerking:gebruik als best practice het systeem wijzigen in plaats van postgresql.conf te bewerken.
postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM
Het alter system commando heeft de postgresql.auto.conf gewijzigd zoals hieronder getoond:
--- 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'
Start de service opnieuw en test:
[[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
We zullen deze fout in het volgende onderwerp behandelen.
Foutbericht
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Oorzaak
De PostgreSQL-service die wordt uitgevoerd op het IP-adres 192.168.0.11 is niet zo geconfigureerd dat de webgebruiker van de gebruiker verbinding kan maken met de database-webapp.
Oplossing
Wijzig het toegangsbestand pg_hba.conf om de verbinding toe te staan:
--- 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
Laad de service opnieuw en test:
[[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".
Foutbericht
ERROR: syntax error at or near "grant"
Oorzaak
Grant is een van de door PostgreSQL gereserveerde zoekwoorden
Oplossing
Gereserveerde zoekwoorden moeten tussen aanhalingstekens staan:
webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
Table "public.grant"
Column | Type | Modifiers
--------+---------+-----------
id | numeric |
webapp=>
Foutbericht
ERROR: cannot drop table cust because other objects depend on it
Oorzaak
Een klant heeft geprobeerd de tabel met onderliggende tabellen te verwijderen.
Oplossing
Bekijk HINT in het logbestand:
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;
Foutbericht
ERROR: invalid input syntax for type numeric: "b" at character 26
Oorzaak
Het logbestand onthult een poging om een waarde in te voegen die niet overeenkomt met het kolomtype:
ERROR: invalid input syntax for type numeric: "b" at character 26
STATEMENT: insert into cust values ('b', 2);
Oplossing
Dit is een applicatiefout die moet worden gecorrigeerd door ontwikkelaars, of als deze is geïnitieerd door een client zoals een DBA met psql. Er is geen actie vereist door de productie-DBA, aangezien de volledige foutmelding ook naar de klant is teruggestuurd.
Download de whitepaper vandaag PostgreSQL-beheer en -automatisering met ClusterControlLees wat u moet weten om PostgreSQL te implementeren, bewaken, beheren en schalenDownload de whitepaperLogboeken bekijken en controleren
De meest eenvoudige optie is het configureren van PostgreSQL om syslog te gebruiken via de log_destination-parameter, zodat logs kunnen worden verzonden naar uw favoriete gecentraliseerde logsysteem (bijv. rsyslog) en daar vervolgens verder worden verwerkt voor waarschuwingen over specifieke foutcondities.
Een andere tool, waarvoor bijna geen setup nodig is, is tail_n_mail, die werkt in combinatie met de cron-daemon.
Nog een ander hulpmiddel in deze lijst is pgBadger dat wordt geleverd met een uitgebreide reeks opties voor het rapporteren, visualiseren en analyseren van niet alleen de PostgreSQL-logbestanden, maar ook de informatie die is vastgelegd door de statistiekenverzamelaar.
Als organisatie hogerop op de complexiteitsschaal, kan het profiteren van het investeren van tijd en moeite voor het opzetten van een ELK-stack, die de Filebeat PostgreSQL-module gebruikt om waarschuwingen en rapporten te genereren.
Conclusie
Het bekijken van de foutenlogboeken, op de hoogte worden gehouden van kritieke problemen en het hebben van een veelzijdig logbeheersysteem dat helpt bij het oplossen van problemen, is belangrijk voor het handhaven van een gezonde databaseomgeving. Gelukkig biedt PostgreSQL een rijk raamwerk voor foutbeheer, wat weerspiegeld wordt in de grote verscheidenheid aan beschikbare producten om uit te kiezen. De criteria voor het selecteren van degene die het beste passen bij een specifieke omgeving, moeten niet alleen de productkenmerken omvatten, maar ook de vereiste technische expertise.