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:
-
Přihlaste se jako uživatel postgres:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
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
-
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 WhitepaperKontrola 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.