sql >> Databáze >  >> RDS >> PostgreSQL

Jak dekódovat protokoly chyb PostgreSQL

Hlášení chyb PostgreSQL se řídí stylovým průvodcem, jehož cílem je poskytnout správci databáze informace potřebné k efektivnímu řešení problémů. Chybové zprávy obvykle obsahují krátký popis, za nímž následují podrobné informace a případně nápovědu s návrhem řešení. V průvodci jsou vysvětleny další jemné detaily, jako je použití minulého nebo přítomného času k označení, zda je chyba dočasná nebo trvalá.

Typy chyb a úrovně závažnosti

Při hlášení chyb PostgreSQL také vrátí kód chyby SQLSTATE, proto jsou chyby klasifikovány do několika tříd. Při kontrole seznamu tříd si všimněte, že úspěch a varování PostgreSQL také zaznamenává do protokolu chyb – to proto, že logging_collector, proces PostgreSQL odpovědný za protokolování, posílá všechny zprávy na stderr ve výchozím nastavení.

Pokud nebyl inicializován kolektor protokolování, chyby se zaprotokolují do systémového protokolu. Například při pokusu o spuštění služby po instalaci balíčku:

[[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'.

Při vracení chybových zpráv klientům, a tedy protokolování do protokolu chyb, jsou protokolovány zprávy s úrovní závažnosti, která je řízena pomocí parametru client_min_messages. Protokolování do souborů protokolu serveru je řízeno parametrem log_min_messages, zatímco protokol log_min_error_statement umožňuje protokolování příkazů SQL, které způsobují chybu určité úrovně závažnosti.

PostgreSQL lze nakonfigurovat pro přihlášení na následujících úrovních závažnosti:

  • PANIKA: Všechny relace databáze jsou přerušeny. Toto je kritická situace, která se týká všech klientů.
  • FATAL: Aktuální relace je přerušena kvůli chybě. Klient to může zkusit znovu. Ostatní databáze v clusteru nejsou ovlivněny.
  • LOG: Zprávy o normálním provozu.
  • CHYBA: Selhání provedení příkazu. Toto je trvalá chyba.
  • UPOZORNĚNÍ: Událost, která sice nebrání dokončení příkazu, ale pokud není řešena, může vést k selhání. Sledování varování je dobrou praxí pro včasnou detekci problémů na straně serveru i aplikace.
  • UPOZORNĚNÍ: Informace, které mohou klienti použít ke zlepšení svého kódu.
  • INFO: Protokoly výslovně požadované klienty.
  • DEBUG1..DEBUG5: Informace pro vývojáře.

Poznámka:Zprávy vyšší úrovně zahrnují zprávy z nižších úrovní, tj. nastavení úrovně protokolování na LOG, dá PostgreSQL pokyn, aby také protokoloval zprávy FATAL a PANIC.

Časté chyby a jak je opravit

Následuje neúplný seznam:

Chybová zpráva

psql: could not connect to server: No such file or directory

Příčina

[[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"?

Rozlišení

Ověřte, že služba PostgreSQL běží pomocí nástrojů operačního systému (ps, netstat, ss, systemctl) nebo zkontrolujte přítomnost postmaster.pid v datovém adresáři.

Chybová zpráva

psql: FATAL:  Peer authentication failed for user "postgres"

Příčina

[[email protected] ~]# psql -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"

Rozlišení

Soubor protokolu bude obsahovat podrobnější zprávu v tomto smyslu:

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"

Postupujte takto:

  1. Přihlaste se jako uživatel postgres:

    [[email protected] ~]# su - postgres
    [[email protected] ~]$ psql
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#
  2. Proveďte následující změnu v pg_hba.conf, která umožní uživateli root přihlásit se bez hesla:

    --- 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. Znovu načtěte službu a otestujte:

    [[email protected] ~]# psql -U postgres
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#

Chybová zpráva

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?

Příčina

Klient se pokusil o připojení k veřejné IP adrese.

Poznámka:Toto je chyba vrácená klientovi v příkladu výše psql. V případě webové aplikace zkontrolujte protokol chyb webového serveru.

Rozlišení

Nakonfigurujte službu tak, aby naslouchala na veřejné IP adrese:

Poznámka:Jako osvědčený postup použijte alter system místo úpravy postgresql.conf.

postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM

Příkaz alter system upravil postgresql.auto.conf, jak je ukázáno níže:

--- 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'

Restartujte službu a otestujte:

[[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

Této chybě se budeme věnovat v dalším tématu.

Chybová zpráva

psql: FATAL:  no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off

Příčina

Služba PostgreSQL běžící na IP adrese 192.168.0.11 není nakonfigurována tak, aby umožňovala uživateli webu připojit se k webové aplikaci databáze.

Rozlišení

Upravte přístupový soubor pg_hba.conf tak, aby umožňoval připojení:

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

Znovu načtěte službu a otestujte:

[[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".

Chybová zpráva

ERROR:  syntax error at or near "grant"

Příčina

Grant je jedno z PostgreSQL vyhrazených klíčových slov

Rozlišení

Rezervovaná klíčová slova musí být citována:

webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
     Table "public.grant"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | numeric |

webapp=>

Chybová zpráva

ERROR:  cannot drop table cust because other objects depend on it

Příčina

Klient se pokusil odebrat vlastní tabulku, která má podřízené tabulky.

Rozlišení

Zkontrolujte HINT v souboru protokolu:

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;

Chybová zpráva

ERROR:  invalid input syntax for type numeric: "b" at character 26

Příčina

Soubor protokolu odhalí pokus o vložení hodnoty, která neodpovídá typu sloupce:

ERROR:  invalid input syntax for type numeric: "b" at character 26
STATEMENT:  insert into cust values ('b', 2);

Rozlišení

Toto je chyba na straně aplikace, kterou musí opravit vývojáři, nebo pokud byla iniciována klientem, jako je DBA se spuštěným psql. Produkční DBA nevyžaduje žádnou akci, protože klientovi byla vrácena také úplná chybová zpráva.

Stáhněte si Whitepaper Today Správa a automatizace PostgreSQL s ClusterControlZjistěte, co potřebujete vědět k nasazení, monitorování, správě a škálování PostgreSQLStáhněte si Whitepaper

Kontrola a monitorování protokolů

Nejjednodušší možností je nakonfigurovat PostgreSQL tak, aby používal syslog pomocí parametru log_destination, takže protokoly lze odesílat do vašeho oblíbeného centralizovaného systému protokolování (např. rsyslog) a tam je dále zpracovávat pro upozornění na konkrétní chybové stavy.

Dalším nástrojem, který nevyžaduje téměř žádné nastavení, je tail_n_mail, který funguje v kombinaci s démonem cron.

Dalším nástrojem v tomto seznamu je pgBadger, který přichází s bohatou sadou možností pro vytváření sestav, vizualizaci a analýzu nejen souborů protokolu PostgreSQL, ale také informací zaznamenaných sběračem statistik.

Posouváme-li se na stupnici složitosti, organizace může těžit z investování času a úsilí do nastavení zásobníku ELK, který využívá modul Filebeat PostgreSQL ke generování výstrah a zpráv.

Závěr

Kontrola chybových protokolů, upozornění na kritické problémy a všestranný systém správy protokolů, který pomáhá při odstraňování problémů, je důležité pro udržení zdravého databázového prostředí. Naštěstí PostgreSQL poskytuje bohatý rámec pro správu chyb, který se odráží ve velkém množství dostupných produktů, ze kterých si můžete vybrat. Kritéria pro výběr těch, které nejlépe vyhovují konkrétnímu prostředí, musí zahrnovat nejen vlastnosti produktu, ale také požadované technické znalosti.


  1. Jak mohu použít uživatelem definovanou proměnnou MySql v .NET MySqlCommand?

  2. Jak funguje operátor LIKE v MySQL

  3. Alternativy k LIMIT a OFFSET pro stránkování v Oracle

  4. Nelze se připojit k databázovému serveru (pracovní plocha mysql)