PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara Mendekode Log Kesalahan PostgreSQL

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:

  1. Masuk sebagai pengguna postgres:

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan wadah PostgreSQL dengan data yang ada?

  2. Bagaimana cara menampilkan fungsi, prosedur, kode sumber pemicu di postgresql?

  3. Konsep Oracle Ketersediaan Tinggi di PostgreSQL

  4. Cara Mengaktifkan Log Kueri Lambat di PostgreSQL

  5. Kolom PostgreSQL tidak ada tetapi sebenarnya ada