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:
-
Đă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=#
-
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
-
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ứcNhậ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.