PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách giải mã nhật ký lỗi PostgreSQL

Báo cáo lỗi PostgreSQL tuân theo hướng dẫn kiểu nhằm cung cấp cho người quản trị cơ sở dữ liệu thông tin cần thiết để khắc phục sự cố một cách hiệu quả. Thông báo lỗi thường chứa một mô tả ngắn, sau đó là một số thông tin chi tiết và gợi ý, nếu có, đề xuất giải pháp. Có những chi tiết nhỏ khác, được giải thích trong hướng dẫn, chẳng hạn như việc sử dụng thì quá khứ hoặc hiện tại để cho biết lỗi là tạm thời hay vĩnh viễn.

Các loại lỗi và mức độ nghiêm trọng

Khi báo cáo lỗi, PostgreSQL cũng sẽ trả về mã lỗi SQLSTATE, do đó lỗi được phân loại thành nhiều lớp. Khi xem lại danh sách các lớp, hãy lưu ý rằng thành công và cảnh báo cũng được PostgreSQL ghi vào nhật ký lỗi - đó là vì logging_collector, quy trình PostgreSQL chịu trách nhiệm ghi nhật ký, gửi tất cả thông báo đến stderr theo mặc định.

Khi trình thu thập nhật ký chưa được khởi tạo, các lỗi sẽ được ghi vào nhật ký hệ thống. Ví dụ:khi cố gắng khởi động dịch vụ sau khi cài đặt gói:

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

Khi trả lại thông báo lỗi cho máy khách và do đó ghi vào nhật ký lỗi, thông báo được ghi với mức độ nghiêm trọng được kiểm soát bằng cách sử dụng tham số client_min_messages. Việc ghi nhật ký vào tệp nhật ký máy chủ được kiểm soát bởi tham số log_min_messages, trong khi log_min_error_statement cho phép ghi nhật ký các câu lệnh SQL gây ra lỗi ở mức độ nghiêm trọng cụ thể.

PostgreSQL có thể được định cấu hình để đăng nhập ở các mức độ nghiêm trọng sau:

  • PANIC: Tất cả các phiên cơ sở dữ liệu bị hủy bỏ. Đây là một tình huống quan trọng ảnh hưởng đến tất cả các khách hàng.
  • CHẤT BÉO: Phiên hiện tại bị hủy bỏ do lỗi. Khách hàng có thể thử lại. Các cơ sở dữ liệu khác trong cụm không bị ảnh hưởng.
  • ĐĂNG NHẬP: Thông báo hoạt động bình thường.
  • LỖI: Không thực hiện được lệnh. Đây là một lỗi vĩnh viễn.
  • CẢNH BÁO: Một sự kiện, trong khi không ngăn lệnh hoàn thành, có thể dẫn đến thất bại nếu không được giải quyết. Theo dõi các cảnh báo là một phương pháp hay để phát hiện sớm các sự cố trên cả phía máy chủ và ứng dụng.
  • LƯU Ý: Thông tin mà khách hàng có thể sử dụng để cải thiện mã của họ.
  • THÔNG TIN: Nhật ký được khách hàng yêu cầu rõ ràng.
  • DEBUG1..DEBUG5: Thông tin nhà phát triển.

Lưu ý:Các thông báo cấp cao hơn bao gồm các thông báo từ các cấp thấp hơn, tức là đặt cấp độ ghi nhật ký thành LOG, sẽ hướng dẫn PostgreSQL cũng ghi nhật ký các thông báo FATAL và PANIC.

Các lỗi thường gặp và cách khắc phục chúng

Sau đây là danh sách không đầy đủ:

Thông báo lỗi

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

Nguyên nhân

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

Độ phân giải

Xác minh rằng dịch vụ PostgreSQL đang chạy bằng các công cụ hệ điều hành (ps, netstat, ss, systemctl) hoặc kiểm tra sự hiện diện của postmaster.pid trong thư mục dữ liệu.

Thông báo lỗi

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

Nguyên nhân

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

Độ phân giải

Tệp nhật ký sẽ chứa một thông báo chi tiết hơn về hiệu ứng đó:

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"

Làm theo các bước sau:

  1. Đăng nhập với tư cách người dùng postgres:

    [[email protected] ~]# su - postgres
    [[email protected] ~]$ psql
    psql (9.6.6)
    Type "help" for help.
    
    postgres=#
  2. Thực hiện thay đổi sau đối với pg_hba.conf sẽ cho phép người dùng root đăng nhập mà không cần mật khẩu:

    --- 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. Tải lại dịch vụ và kiểm tra:

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

Thông báo lỗi

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?

Nguyên nhân

Một khách hàng đã cố gắng kết nối với địa chỉ IP công cộng.

Lưu ý:Đây là lỗi được trả về cho máy khách, trong ví dụ psql ở trên. Trong trường hợp ứng dụng web, hãy kiểm tra nhật ký lỗi máy chủ web.

Độ phân giải

Định cấu hình dịch vụ để lắng nghe trên địa chỉ IP công cộng:

Lưu ý:Cách tốt nhất là sử dụng hệ thống thay đổi thay vì chỉnh sửa postgresql.conf.

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

Lệnh hệ thống thay đổi đã sửa đổi postgresql.auto.conf như được hiển thị bên dưới:

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

Khởi động lại dịch vụ và kiểm tra:

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

Chúng tôi sẽ giải quyết lỗi này trong chủ đề tiếp theo.

Thông báo lỗi

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

Nguyên nhân

Dịch vụ PostgreSQL chạy trên địa chỉ IP 192.168.0.11 không được định cấu hình để cho phép người dùng web của người dùng kết nối với webapp cơ sở dữ liệu.

Độ phân giải

Sửa đổi tệp truy cập pg_hba.conf để cho phép kết nối:

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

Tải lại dịch vụ và kiểm tra:

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

Thông báo lỗi

ERROR:  syntax error at or near "grant"

Nguyên nhân

Grant là một trong những từ khóa dành riêng cho PostgreSQL

Độ phân giải

Các từ khóa dành riêng phải được trích dẫn:

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

webapp=>

Thông báo lỗi

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

Nguyên nhân

Một khách hàng đã cố gắng xóa hộp bảo vệ bảng có các bảng con.

Độ phân giải

Xem lại GỢI Ý trong tệp nhật ký:

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;

Thông báo lỗi

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

Nguyên nhân

Tệp nhật ký cho thấy nỗ lực chèn giá trị không khớp với loại cột:

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

Độ phân giải

Đây là lỗi phía ứng dụng phải được sửa bởi nhà phát triển hoặc nếu nó được khởi tạo bởi một ứng dụng khách, chẳng hạn như psql chạy DBA. DBA sản xuất không yêu cầu hành động nào, vì thông báo lỗi đầy đủ cũng đã được trả lại cho máy khách.

Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Nhật ký xem xét và giám sát

Tùy chọn đơn giản nhất là định cấu hình PostgreSQL để sử dụng nhật ký hệ thống thông qua tham số log_destination để các nhật ký có thể được chuyển đến hệ thống ghi nhật ký tập trung yêu thích của bạn (ví dụ:rsyslog) và sau đó được xử lý thêm ở đó để cảnh báo về các điều kiện lỗi cụ thể.

Một công cụ khác, yêu cầu gần như không có thiết lập nào là tail_n_mail, hoạt động kết hợp với trình nền cron.

Tuy nhiên, một công cụ khác trong danh sách này là pgBadger đi kèm với một bộ tùy chọn phong phú để báo cáo, hiển thị và phân tích không chỉ các tệp nhật ký PostgreSQL mà còn cả thông tin được ghi lại bởi bộ thu thập thống kê.

Nâng cao mức độ phức tạp, tổ chức có thể hưởng lợi từ việc đầu tư thời gian và công sức để thiết lập ngăn xếp ELK, sử dụng mô-đun Filebeat PostgreSQL để tạo cảnh báo và báo cáo.

Kết luận

Xem lại nhật ký lỗi, được thông báo về các vấn đề quan trọng và có một hệ thống quản lý nhật ký đa năng hỗ trợ khắc phục sự cố là rất quan trọng trong việc duy trì một môi trường cơ sở dữ liệu lành mạnh. May mắn thay, PostgreSQL cung cấp một khung quản lý lỗi phong phú, thể hiện qua nhiều sản phẩm có sẵn để bạn lựa chọn. Tiêu chí để chọn những sản phẩm phù hợp nhất với môi trường cụ thể không chỉ phải bao gồm các tính năng của sản phẩm mà còn phải có kiến ​​thức chuyên môn kỹ thuật.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chèn JSONB vào Postgresql bằng Python?

  2. Báo cáo đường ray không thể tìm thấy một cột ở đó

  3. Làm cách nào để nhận hỗ trợ LISTEN / NOTIFY không đồng bộ / hướng sự kiện trong Java bằng cách sử dụng cơ sở dữ liệu Postgres?

  4. ComboBox.ValueMember và DisplayMember

  5. PostgreSQL cách xem truy vấn nào đã chạy