PostgreSQL ERROR: không cho phép thêm kết nối


19

Làm thế nào để bạn giải phóng các kết nối PostgreSQL không được đóng bởi các ứng dụng khách?

Tôi có một ứng dụng khai thác dữ liệu giúp tăng tốc nhiều quy trình, tất cả kết nối với cơ sở dữ liệu PostgreQuery 9.1 cục bộ để truy xuất dữ liệu. Nó chạy tốt trong vài giờ, nhưng sau đó chết với lỗi:

FATAL:  remaining connection slots are reserved for non-replication superuser connections

Nghiên cứu điều này cho thấy điều này rất có thể là do ứng dụng không đóng đúng các kết nối của nó. Tuy nhiên, ngay cả khi ứng dụng bị tắt, các kết nối này không bao giờ được giải phóng. Không có thời gian chờ nào mà PostgreSQL sẽ tự động đóng kết nối?

Tôi cũng đã thử tăng max_connections của Postgres từ 100 lên 200, nhưng việc khởi động lại đã gây ra lỗi cho tôi:

2014-02-23 10:51:15 EST FATAL:  could not create shared memory segment: Invalid argument
2014-02-23 10:51:15 EST DETAIL:  Failed system call was shmget(key=5432001, size=36954112, 03600).
2014-02-23 10:51:15 EST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 36954112 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.

Hệ thống của tôi là Ubuntu 12.04 và có bộ nhớ 8GB và tất cả các cài đặt PG khác đều được mặc định, vì vậy tôi không chắc tại sao nó nghĩ hệ thống không có đủ bộ nhớ.

Sau đó tôi đã cố gắng sử dụng pgbouncer để gộp và sử dụng lại các kết nối. Điều này có vẻ hoạt động tốt hơn một chút, nhưng thậm chí điều này cuối cùng đã hết kết nối, gây ra lỗi cho tôi:

ERROR:  no more connections allowed

Làm thế nào để tôi chẩn đoán thêm và khắc phục vấn đề này?


Hiển thị đầu ra của pg_stat_activity
ETL

Câu trả lời:


8

Bạn có thể tăng số lượng kết nối tối đa bằng cách thay đổi cài đặt bộ nhớ chia sẻ tối đa của mình, tuy nhiên nếu vấn đề là các kết nối của bạn không bị đóng, thì bạn nên thực sự giải quyết điều đó. Nếu phần mềm nằm ngoài tầm kiểm soát của bạn và bị lỗi do không đóng kết nối, bạn có thể sử dụng một số công việc định kỳ như:

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes'
;

Đó là những gì tôi làm để tiêu diệt các kết nối bị rò rỉ từ một phần mềm lỗi tương tự.

Ngoài ra, bạn có thể chạy phần mềm lỗi của mình thông qua nhóm kết nối có chức năng tương tự để tiêu diệt các kết nối nhàn rỗi như pgpool.

Lưu ý : Các phiên bản mới hơn của Postgres có các tên cột hơi khác nhau:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOURDATABASEUSERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Có nên làm việc trên 9.6? Khi tôi thử tôi nhận đượcpostgres=> select pg_terminate_backend(procpid) from pg_stat_activity where current_query = '<IDLE>' and query_start < current_timestamp - interval '5 minutes'; ERROR: column "procpid" does not exist LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity ...
Magick

pidthay vì procpidtrong các phiên bản mới hơn.
ETL

4

Đối với các phiên bản mới hơn của PostgreSQL:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOUR_DATABASE_USERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Ở trên sẽ giúp bạn chấm dứt các kết nối nhàn rỗi của bạn. Tôi đã có cùng một vấn đề nhưng hóa ra đó là một vấn đề với cách Flask và SQLAlchemy của tôi để kết nối với cơ sở dữ liệu.

* tên chúng tôi không phải là một lỗi đánh máy


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.