sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man avkodar PostgreSQL-felloggarna

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:

  1. Logga in som postgres-användare:

    [[email protected] ~]# su - postgres
    [[email protected] ~]$ psql
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#
  2. 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
  3. 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 Whitepaper

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


  1. Ändra lösenord med Oracle SQL Developer

  2. Tio vanliga hot mot genomförandeplanens kvalitet

  3. LADDA DATA LOKAL INFIL förbjuden i... PHP

  4. Tio sätt att utöka funktionaliteten hos PostgreSQL