Pelaporan kesalahan PostgreSQL mengikuti panduan gaya yang ditujukan untuk menyediakan administrator database dengan informasi yang diperlukan untuk memecahkan masalah secara efisien. Pesan kesalahan biasanya berisi deskripsi singkat, diikuti oleh beberapa informasi rinci, dan petunjuk, jika berlaku, menyarankan solusi. Ada detail halus lainnya, yang dijelaskan dalam panduan, seperti penggunaan past atau present tense untuk menunjukkan apakah kesalahannya bersifat sementara atau permanen.
Jenis Kesalahan dan Tingkat Keparahan
Saat melaporkan kesalahan, PostgreSQL juga akan mengembalikan kode kesalahan SQLSTATE, oleh karena itu kesalahan diklasifikasikan ke dalam beberapa kelas. Saat meninjau daftar kelas, perhatikan bahwa keberhasilan dan peringatan juga dicatat oleh PostgreSQL ke log kesalahan — itu karena logging_collector, proses PostgreSQL yang bertanggung jawab untuk pencatatan, mengirim semua pesan ke stderr secara default.
Ketika pengumpul logging belum diinisialisasi, kesalahan dicatat ke log sistem. Misalnya, ketika mencoba memulai layanan setelah instalasi paket:
[[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'.
Saat mengembalikan pesan kesalahan ke klien, dan karenanya masuk ke log kesalahan, pesan dicatat dengan tingkat keparahan yang dikendalikan menggunakan parameter client_min_messages. Logging ke file log server dikendalikan oleh parameter log_min_messages, sedangkan log_min_error_statement mengaktifkan logging pernyataan SQL yang menyebabkan kesalahan tingkat keparahan tertentu.
PostgreSQL dapat dikonfigurasi untuk log pada tingkat keparahan berikut:
- PANIK: Semua sesi database dibatalkan. Ini adalah situasi kritis yang mempengaruhi semua klien.
- FATAL: Sesi saat ini dibatalkan karena kesalahan. Klien dapat mencoba lagi. Basis data lain di cluster tidak terpengaruh.
- LOG: Pesan operasi normal.
- KESALAHAN: Kegagalan untuk menjalankan perintah. Ini adalah kesalahan permanen.
- PERINGATAN: Peristiwa yang, meskipun tidak mencegah perintah untuk diselesaikan, dapat menyebabkan kegagalan jika tidak ditangani. Memantau peringatan adalah praktik yang baik dalam deteksi dini masalah di sisi server dan aplikasi.
- PERHATIKAN: Informasi yang dapat digunakan klien untuk meningkatkan kode mereka.
- INFORMASI: Log yang diminta secara eksplisit oleh klien.
- DEBUG1..DEBUG5: Informasi pengembang.
Catatan:Pesan tingkat yang lebih tinggi menyertakan pesan dari tingkat yang lebih rendah yaitu mengatur tingkat pencatatan ke LOG, akan menginstruksikan PostgreSQL untuk juga mencatat pesan FATAL dan PANIC.
Kesalahan Umum dan Cara Memperbaikinya
Berikut ini adalah daftar yang tidak lengkap:
Pesan Kesalahan
psql: could not connect to server: No such file or directory
Penyebab
[[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"?
Resolusi
Verifikasi bahwa layanan PostgreSQL berjalan menggunakan alat sistem operasi (ps, netstat, ss, systemctl) atau periksa keberadaan postmaster.pid di direktori data.
Pesan Galat
psql: FATAL: Peer authentication failed for user "postgres"
Penyebab
[[email protected] ~]# psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Resolusi
File log akan berisi pesan yang lebih rinci untuk efek itu:
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"
Ikuti langkah-langkah berikut:
-
Masuk sebagai pengguna postgres:
[[email protected] ~]# su - postgres [[email protected] ~]$ psql psql (9.6.6) Type "help" for help. postgres=#
-
Buat perubahan berikut pada pg_hba.conf yang memungkinkan pengguna root untuk masuk tanpa kata sandi:
--- 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
-
Muat ulang layanan dan uji:
[[email protected] ~]# psql -U postgres psql (9.6.6) Type "help" for help. postgres=#
Pesan Galat
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?
Penyebab
Seorang klien mencoba koneksi ke alamat IP publik.
Catatan:Ini adalah kesalahan yang dikembalikan ke klien, pada contoh psql di atas. Jika ada aplikasi web, periksa log kesalahan server web.
Resolusi
Konfigurasikan layanan untuk mendengarkan pada alamat IP publik:
Catatan:Sebagai praktik terbaik, gunakan sistem alter daripada mengedit postgresql.conf.
postgres=# alter system set listen_addresses TO 'localhost,192.168.0.11';
ALTER SYSTEM
Perintah alter system telah memodifikasi postgresql.auto.conf seperti yang ditunjukkan di bawah ini:
--- 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'
Mulai ulang layanan dan uji:
[[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
Kami akan mengatasi kesalahan ini di topik berikutnya.
Pesan Galat
psql: FATAL: no pg_hba.conf entry for host "192.168.0.11", user "webuser", database "webapp", SSL off
Penyebab
Layanan PostgreSQL yang berjalan pada alamat IP 192.168.0.11 tidak dikonfigurasi untuk memungkinkan pengguna web pengguna terhubung ke database webapp.
Resolusi
Ubah file akses pg_hba.conf untuk mengizinkan koneksi:
--- 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
Muat ulang layanan dan uji:
[[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".
Pesan Galat
ERROR: syntax error at or near "grant"
Penyebab
Grant adalah salah satu kata kunci yang dicadangkan PostgreSQL
Resolusi
Kata kunci yang dicadangkan harus dikutip:
webapp=> create table "grant" (id numeric);
CREATE TABLE
And verify:
webapp=> \d "grant"
Table "public.grant"
Column | Type | Modifiers
--------+---------+-----------
id | numeric |
webapp=>
Pesan Kesalahan
ERROR: cannot drop table cust because other objects depend on it
Penyebab
Seorang klien mencoba menghapus tabel cust yang memiliki tabel anak.
Resolusi
Tinjau PETUNJUK dalam file log:
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;
Pesan Galat
ERROR: invalid input syntax for type numeric: "b" at character 26
Penyebab
File log menunjukkan upaya untuk memasukkan nilai yang tidak cocok dengan jenis kolom:
ERROR: invalid input syntax for type numeric: "b" at character 26
STATEMENT: insert into cust values ('b', 2);
Resolusi
Ini adalah kesalahan sisi aplikasi yang harus diperbaiki oleh pengembang, atau jika itu dimulai oleh klien seperti DBA yang menjalankan psql. Tidak ada tindakan yang diperlukan oleh DBA produksi, karena pesan kesalahan lengkap juga dikembalikan ke klien.
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh WhitepaperMeninjau dan Memantau Log
Opsi paling sederhana adalah mengonfigurasi PostgreSQL untuk menggunakan syslog melalui parameter log_destination sehingga log dapat dikirimkan ke sistem logging terpusat favorit Anda (misalnya rsyslog) dan kemudian diproses lebih lanjut di sana untuk memperingatkan kondisi kesalahan tertentu.
Alat lain, yang memerlukan penyiapan hampir tidak ada adalah tail_n_mail, yang bekerja dalam kombinasi dengan daemon cron.
Alat lain dalam daftar ini adalah pgBadger yang hadir dengan serangkaian opsi untuk melaporkan, memvisualisasikan, dan menganalisis tidak hanya file log PostgreSQL tetapi juga informasi yang dicatat oleh pengumpul statistik.
Naik pada skala kompleksitas, organisasi dapat mengambil manfaat dari menginvestasikan waktu dan upaya untuk menyiapkan tumpukan ELK, yang menggunakan modul Filebeat PostgreSQL untuk menghasilkan peringatan dan laporan.
Kesimpulan
Meninjau log kesalahan, diberitahu tentang masalah kritis, dan memiliki sistem manajemen log serbaguna yang membantu dalam pemecahan masalah penting dalam menjaga lingkungan database yang sehat. Untungnya, PostgreSQL menyediakan kerangka kerja manajemen kesalahan yang kaya, tercermin dalam berbagai macam produk yang tersedia untuk dipilih. Kriteria untuk memilih produk yang paling sesuai dengan lingkungan tertentu harus mencakup tidak hanya fitur produk tetapi juga keahlian teknis yang diperlukan.