sql >> Database >  >> RDS >> PostgreSQL

Hoe de PostgreSQL-foutlogboeken te decoderen

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:

  1. Log in als de postgres-gebruiker:

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

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


  1. Hoe MySQL op Debian 7 te installeren

  2. Waar slaat PostgreSQL configuratie-/conf-bestanden op?

  3. Heroku Postgres-fout:PGError:FOUT:relatieorganisaties bestaan ​​niet (ActiveRecord::StatementInvalid)

  4. Afbeeldingen in database streamen met HttpHandler