PostgreSQL felrapportering följer en stilguide som syftar till att ge databasadministratören den information som krävs för att effektivt felsöka problem. Felmeddelanden innehåller normalt en kort beskrivning, följt av lite detaljerad information, och en ledtråd, om tillämpligt, som föreslår lösningen. Det finns andra fina detaljer som förklaras i guiden, som användningen av dåtid eller presens för att indikera om felet är tillfälligt eller permanent.
Typer av fel och allvarlighetsnivåer
Vid felrapportering kommer PostgreSQL även returnera en SQLSTATE-felkod, därför klassificeras fel i flera klasser. När du granskar listan med klasser, notera att framgång och varning också loggas av PostgreSQL till felloggen — det är för att logging_collector, PostgreSQL-processen som ansvarar för loggning, skickar alla meddelanden till stderr som standard.
När loggningssamlaren inte har initierats loggas fel i systemloggen. Till exempel när du försöker starta tjänsten efter paketinstallationen:
[[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'.
När felmeddelanden returneras till klienter, och därför loggas till felloggen, loggas meddelanden med en allvarlighetsnivå som kontrolleras med parametern client_min_messages. Loggning till serverloggfiler styrs av parametern log_min_messages, medan log_min_error_statement möjliggör loggning av SQL-satser som orsakar ett fel av en specifik allvarlighetsnivå.
PostgreSQL kan konfigureras för att logga på följande allvarlighetsnivåer:
- PANIK: Alla databassessioner avbryts. Detta är en kritisk situation som påverkar alla kunder.
- DÖSTLIGT: Den aktuella sessionen avbryts på grund av ett fel. Klienten kan försöka igen. Andra databaser i klustret påverkas inte.
- LOGG: Normal driftmeddelanden.
- FEL: Misslyckades med att utföra ett kommando. Detta är ett permanent fel.
- VARNING: En händelse som, även om den inte hindrar kommandot att slutföra, kan leda till fel om den inte åtgärdas. Övervakning av varningar är en bra praxis för att tidigt upptäcka problem på både server- och applikationssidan.
- OBS: Information som kunder kan använda för att förbättra sin kod.
- INFO: Loggar som uttryckligen efterfrågas av klienter.
- DEBUG1..DEBUG5: Utvecklarinformation.
Obs:Meddelanden på högre nivå inkluderar meddelanden från lägre nivåer, dvs. att ställa in loggningsnivån till LOGG kommer att instruera PostgreSQL att även logga FATAL- och PANIC-meddelanden.
Vanliga fel och hur man åtgärdar dem
Vad som följer är en icke uttömmande lista:
Felmeddelande
psql: could not connect to server: No such file or directory
Orsak
[[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"?
Upplösning
Verifiera att PostgreSQL-tjänsten körs med hjälp av operativsystemsverktyg (ps, netstat, ss, systemctl) eller kontrollera om postmaster.pid finns i datakatalogen.
Felmeddelande
psql: FATAL: Peer authentication failed for user "postgres"
Orsak
[[email protected] ~]# psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Upplösning
Loggfilen kommer att innehålla ett mer detaljerat meddelande om detta:
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"
Följ dessa steg:
-
Logga in som postgres-användare:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
Gör följande ändring till pg_hba.conf som gör att rootanvändaren kan logga in utan lösenord:
--- 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
-
Ladda om tjänsten och testa:
[[email protected] ~]# psql -U postgres psql (9.6.6) Type "help" for help. postgres=#
Felmeddelande
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?
Orsak
En klient försökte ansluta till den offentliga IP-adressen.
Obs:Detta är ett fel som returneras till klienten, i exemplet ovan psql. Om det finns en webbapplikation, kontrollera webbserverns fellogg.
Upplösning
Konfigurera tjänsten för att lyssna på den offentliga IP-adressen:
Obs:Som bästa praxis använd alter system snarare än att redigera postgresql.conf.
postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM
Kommandot alter system har modifierat postgresql.auto.conf som visas nedan:
--- 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'
Starta om tjänsten och testa:
[[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
Vi tar upp det här felet i nästa ämne.
Felmeddelande
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Orsak
PostgreSQL-tjänsten som körs på IP-adressen 192.168.0.11 är inte konfigurerad för att tillåta användarens webbanvändare att ansluta till databasens webbapp.
Upplösning
Ändra åtkomstfilen pg_hba.conf för att tillåta anslutningen:
--- 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
Ladda om tjänsten och testa:
[[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".
Felmeddelande
ERROR: syntax error at or near "grant"
Orsak
Grant är ett av PostgreSQL reserverade nyckelord
Upplösning
Reserverade sökord måste citeras:
webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
Table "public.grant"
Column | Type | Modifiers
--------+---------+-----------
id | numeric |
webapp=>
Felmeddelande
ERROR: cannot drop table cust because other objects depend on it
Orsak
En klient försökte ta bort den anpassade tabell som har underordnade tabeller.
Upplösning
Granska TIPS i loggfilen:
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;
Felmeddelande
ERROR: invalid input syntax for type numeric: "b" at character 26
Orsak
Loggfilen visar ett försök att infoga ett värde som inte matchar kolumntypen:
ERROR: invalid input syntax for type numeric: "b" at character 26
STATEMENT: insert into cust values ('b', 2);
Upplösning
Detta är ett fel på applikationssidan som måste korrigeras av utvecklare, eller om det initierades av en klient som en DBA som kör psql. Ingen åtgärd krävs av produktions-DBA, eftersom det fullständiga felmeddelandet också returnerades till klienten.
Ladda ner Whitepaper Today PostgreSQL Management &Automation med ClusterControlLäs om vad du behöver veta för att distribuera, övervaka, hantera och skala PostgreSQLDladda WhitepaperGranska och övervaka loggar
Det enklaste alternativet är att konfigurera PostgreSQL för att använda syslog via log_destination-parametern så att loggar kan skickas till ditt favoritcentraliserade loggningssystem (t.ex. rsyslog) och sedan vidarebearbetas där för att varna om specifika feltillstånd.
Ett annat verktyg som kräver en nästan ingen-installation är tail_n_mail, som fungerar i kombination med cron-demonen.
Ytterligare ett verktyg i den här listan är pgBadger som kommer med en rik uppsättning alternativ för att rapportera, visualisera och analysera inte bara PostgreSQL-loggfilerna utan även informationen som loggas av statistikinsamlaren.
När du går upp på komplexitetsskalan kan organisationen dra nytta av att investera tid och ansträngning för att sätta upp en ELK-stack, som använder Filebeat PostgreSQL-modulen för att generera varningar och rapporter.
Slutsats
Att granska felloggarna, bli underrättad om kritiska frågor och ha ett mångsidigt logghanteringssystem som hjälper till vid felsökning är viktigt för att upprätthålla en sund databasmiljö. Lyckligtvis tillhandahåller PostgreSQL ett rikt ramverk för felhantering, vilket återspeglas i det stora utbudet av tillgängliga produkter att välja mellan. Kriterierna för att välja de som bäst passar en specifik miljö måste inkludera inte bara produktegenskaperna utan även den tekniska expertis som krävs.