2009-04-07 28 views

Trả lời

20

Kết hợp chức năng pg_terminate_backend và chế độ xem pg_stat_activity hệ thống.

+2

pg_cancel_backend() không ngắt kết nối, nó chỉ hủy truy vấn hiện tại. Truy vấn tiếp theo có thể đến trong bất kỳ giây nào bằng cách sử dụng cùng một kết nối cũ vẫn còn đó. –

+0

Đã sửa lỗi. Cảm ơn bạn! –

0

Tôi đã tìm thấy this thread trong danh sách gửi thư. Nó cho thấy sử dụng SIGTERM để làm cho máy khách ngắt kết nối.

Không sạch sẽ như db2 force application all.

36

giết chết quá trình nhàn rỗi trong PostgreSQL 8.4:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity 
    WHERE current_query LIKE '<IDLE>'; 
+0

Hoạt động như một nét duyên dáng trong Postgres v9.1.4. Cảm ơn vì những hiểu biết! –

+13

Trên phiên bản postgres mới nhất: 'SELECT pid, (SELECT pg_terminate_backend (pid)) bị giết từ pg_stat_activity WHERE state LIKE 'nhàn rỗi';' –

+0

@Mike Weller: cảm ơn, điều này đã làm cho tôi! – jipiboily

1

lẽ là một cách tiếp cận thuận tay nặng hơn thì nên được sử dụng nhưng:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done 
5

This SO answer đẹp giải thích (full quote từ araqnid giữa các quy tắc ngang, sau đó tôi lại):


T o đánh dấu cơ sở dữ liệu 'applog' khi không chấp nhận kết nối mới:

update pg_database set datallowconn = false where datname = 'applogs'; 

Một khả năng khác là thu hồi quyền truy cập 'kết nối' trên cơ sở dữ liệu cho (các) vai trò khách hàng.

Ngắt kết nối người dùng khỏi cơ sở dữ liệu = xóa chương trình phụ trợ. Vì vậy, để ngắt kết nối tất cả những người dùng khác từ "applogs" cơ sở dữ liệu, ví dụ:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

Khi bạn đã thực hiện tất cả những người, bạn là người dùng chỉ kết nối với 'applogs'. Mặc dù có thể thực sự có sự chậm trễ trước khi các chương trình phụ trợ thực sự kết thúc ngắt kết nối?


Cập nhật từ MarkJL: Thực sự có sự chậm trễ trước khi chương trình phụ trợ kết thúc ngắt kết nối.

Bây giờ tôi một lần nữa: Điều đó được nói, hãy nhớ rằng cột procpid đã được đổi tên thành pid trong PostgreSQL 9.2 trở lên.

Tôi nghĩ rằng điều này hữu ích hơn nhiều so với câu trả lời của Milen A. Radev, trong khi về mặt kỹ thuật giống nhau, không đi kèm với ví dụ sử dụng và đề xuất thực tế.

+0

Có chắc chắn là một sự chậm trễ trong ngắt kết nối phụ trợ. – MarkJL

+1

@MarkJL cảm ơn, thêm nó vào câu trả lời (sẽ xóa nhận xét này trong một vài ngày) – mirabilos

4

tôi gửi câu trả lời của tôi, vì tôi không thể sử dụng bất kỳ trong số họ trong kịch bản của tôi, máy chủ 9,3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';" 

Trong dòng tiếp theo, bạn có thể làm bất cứ điều gì yo muốn với 'my_database_to_alter'. Như bạn có thể thấy, yo thực hiện truy vấn từ cơ sở dữ liệu "postgres", tồn tại gần như trong mọi cài đặt postgresql.

Làm bởi superuser và bên ngoài cơ sở dữ liệu vấn đề chính nó làm việc hoàn hảo cho tôi.

Các vấn đề liên quan