La segnalazione degli errori PostgreSQL segue una guida di stile volta a fornire all'amministratore del database le informazioni necessarie per risolvere i problemi in modo efficiente. I messaggi di errore normalmente contengono una breve descrizione, seguita da alcune informazioni dettagliate e un suggerimento, se applicabile, che suggerisce la soluzione. Ci sono altri dettagli fini, spiegati nella guida, come l'uso del passato o del presente per indicare se l'errore è temporaneo o permanente.
Tipi di errore e livelli di gravità
Quando si segnalano gli errori, PostgreSQL restituirà anche un codice di errore SQLSTATE, quindi gli errori sono classificati in diverse classi. Quando si esamina l'elenco delle classi, si noti che il successo e l'avviso vengono registrati anche da PostgreSQL nel registro degli errori, poiché logging_collector, il processo PostgreSQL responsabile della registrazione, invia tutti i messaggi a stderr per impostazione predefinita.
Quando il raccoglitore di registrazione non è stato inizializzato, gli errori vengono registrati nel registro di sistema. Ad esempio, quando si tenta di avviare il servizio dopo l'installazione del pacchetto:
[[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'.
Quando si restituiscono messaggi di errore ai client, e quindi si registrano nel registro errori, i messaggi vengono registrati con un livello di gravità controllato tramite il parametro client_min_messages. La registrazione nei file di registro del server è controllata dal parametro log_min_messages, mentre log_min_error_statement abilita la registrazione delle istruzioni SQL che causano un errore di un livello di gravità specifico.
PostgreSQL può essere configurato per accedere ai seguenti livelli di gravità:
- PANICO: Tutte le sessioni del database vengono interrotte. Questa è una situazione critica che riguarda tutti i clienti.
- FATALE: La sessione corrente viene interrotta a causa di un errore. Il cliente può riprovare. Gli altri database nel cluster non sono interessati.
- LOGO: Messaggi di normale funzionamento.
- ERRORE: Mancata esecuzione di un comando. Questo è un errore permanente.
- ATTENZIONE: Un evento che, pur non impedendo il completamento del comando, può portare a errori se non affrontato. Il monitoraggio degli avvisi è una buona pratica per il rilevamento precoce di problemi sia lato server che lato applicazione.
- AVVISO: Informazioni che i clienti possono utilizzare per migliorare il proprio codice.
- INFO: Registri esplicitamente richiesti dai client.
- DEBUG1..DEBUG5: Informazioni sullo sviluppatore.
Nota:i messaggi di livello superiore includono i messaggi dei livelli inferiori, ad es. l'impostazione del livello di registrazione su LOG, indicherà a PostgreSQL di registrare anche i messaggi FATAL e PANIC.
Errori comuni e come risolverli
Quello che segue è un elenco non esaustivo:
Messaggio di errore
psql: could not connect to server: No such file or directory
Causa
[[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"?
Risoluzione
Verifica che il servizio PostgreSQL sia in esecuzione utilizzando gli strumenti del sistema operativo (ps, netstat, ss, systemctl) o verifica la presenza di postmaster.pid nella directory dei dati.
Messaggio di errore
psql: FATAL: Peer authentication failed for user "postgres"
Causa
[[email protected] ~]# psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Risoluzione
Il file di registro conterrà un messaggio più dettagliato in tal senso:
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"
Segui questi passaggi:
-
Accedi come utente postgres:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
Apporta la seguente modifica a pg_hba.conf che consentirà all'utente root di accedere senza password:
--- 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
-
Ricarica il servizio e prova:
[[email protected] ~]# psql -U postgres psql (9.6.6) Type "help" for help. postgres=#
Messaggio di errore
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?
Causa
Un client ha tentato una connessione all'indirizzo IP pubblico.
Nota:questo è un errore restituito al client, nell'esempio sopra psql. Nel caso di un'applicazione web, controllare il log degli errori del server web.
Risoluzione
Configura il servizio per l'ascolto sull'indirizzo IP pubblico:
Nota:come best practice usa alter system invece di modificare postgresql.conf.
postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM
Il comando alter system ha modificato postgresql.auto.conf come mostrato di seguito:
--- 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'
Riavvia il servizio e prova:
[[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
Affronteremo questo errore nel prossimo argomento.
Messaggio di errore
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Causa
Il servizio PostgreSQL in esecuzione sull'indirizzo IP 192.168.0.11 non è configurato per consentire all'utente webutente di connettersi all'app web del database.
Risoluzione
Modificare il file di accesso pg_hba.conf per consentire la connessione:
--- 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
Ricarica il servizio e prova:
[[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".
Messaggio di errore
ERROR: syntax error at or near "grant"
Causa
Grant è una delle parole chiave riservate di PostgreSQL
Risoluzione
Le parole chiave riservate devono essere citate:
webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
Table "public.grant"
Column | Type | Modifiers
--------+---------+-----------
id | numeric |
webapp=>
Messaggio di errore
ERROR: cannot drop table cust because other objects depend on it
Causa
Un client ha tentato di rimuovere la tabella cust con tabelle figlio.
Risoluzione
Rivedi SUGGERIMENTO nel file di registro:
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;
Messaggio di errore
ERROR: invalid input syntax for type numeric: "b" at character 26
Causa
Il file di registro rivela un tentativo di inserire un valore che non corrisponde al tipo di colonna:
ERROR: invalid input syntax for type numeric: "b" at character 26
STATEMENT: insert into cust values ('b', 2);
Risoluzione
Questo è un errore lato applicazione che deve essere corretto dagli sviluppatori o se è stato avviato da un client come un DBA che esegue psql. Non è richiesta alcuna azione dal DBA di produzione, poiché anche il messaggio di errore completo è stato restituito al client.
Scarica il whitepaper oggi Gestione e automazione di PostgreSQL con ClusterControlScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare PostgreSQLScarica il whitepaperRevisione e monitoraggio dei registri
L'opzione più semplice è configurare PostgreSQL per utilizzare syslog tramite il parametro log_destination in modo che i log possano essere inviati al tuo sistema di registrazione centralizzato preferito (ad es. rsyslog) e quindi ulteriormente elaborati lì per avvisare su condizioni di errore specifiche.
Un altro strumento, che richiede una configurazione quasi nulla è tail_n_mail, che funziona in combinazione con il demone cron.
Ancora un altro strumento in questo elenco è pgBadger che viene fornito con un ricco set di opzioni per la creazione di report, la visualizzazione e l'analisi non solo dei file di registro PostgreSQL, ma anche delle informazioni registrate dal raccoglitore di statistiche.
Salendo sulla scala della complessità, l'organizzazione può trarre vantaggio dall'investimento del tempo e degli sforzi per configurare uno stack ELK, che utilizza il modulo Filebeat PostgreSQL per generare avvisi e report.
Conclusione
La revisione dei registri degli errori, la notifica di problemi critici e la disponibilità di un versatile sistema di gestione dei registri che aiuti nella risoluzione dei problemi è importante per mantenere un ambiente di database sano. Fortunatamente, PostgreSQL fornisce un ricco framework di gestione degli errori, che si riflette nella grande varietà di prodotti disponibili tra cui scegliere. I criteri per selezionare quelli più adatti a uno specifico ambiente devono includere non solo le caratteristiche del prodotto ma anche la competenza tecnica richiesta.