Làm thế nào để thả tất cả các kết nối đến một cơ sở dữ liệu cụ thể mà không dừng máy chủ?


45

Tôi muốn bỏ tất cả các kết nối (phiên) hiện đang được mở sang cơ sở dữ liệu PostgreQuery cụ thể nhưng không khởi động lại máy chủ hoặc ngắt kết nối với các cơ sở dữ liệu khác.

Làm thế nào tôi có thể làm điều đó?


Tôi đọc ở đâu đó rằng bạn có thể sử dụng lowth.com/cutter để đạt được điều này.

Câu trả lời:


22

Đây là câu trả lời của tôi cho câu hỏi rất giống nhau trên StackOverflow.

Tùy thuộc vào phiên bản postgresql của bạn, bạn có thể gặp phải một lỗi, điều đó làm cho pg_stat_activityviệc bỏ qua các kết nối hoạt động từ những người dùng bị đánh rơi. Các kết nối này cũng không được hiển thị bên trong pgAdminIII.

Nếu bạn đang thực hiện kiểm tra tự động (trong đó bạn cũng tạo người dùng) thì đây có thể là một tình huống có thể xảy ra.

Trong trường hợp này, bạn cần hoàn nguyên các truy vấn như:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');

8
LRI: thiếu mục nhập TỪ mệnh đề cho bảng "pg_stat_activity" (psql (9.6.1))
user1767316

4
điều này không còn hoạt động nữa .... nhận được lỗi trên ^
nhẹ

Xem câu trả lời dưới đây của Szymon Guz
Dfranc3373

Thiếu từ khoản, không hoạt động
Vipul

78

Truy vấn như thế này sẽ giúp (giả sử cơ sở dữ liệu được đặt tên là 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pidđã từng được gọi procpid, vì vậy nếu bạn đang sử dụng phiên bản postgres cũ hơn 9.2, bạn có thể thử các cách sau:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Tuy nhiên, bạn phải là một siêu người dùng để ngắt kết nối người dùng khác.

Nó cũng có thể hữu ích REVOKE CONNECT ON DATABASE FROM PUBLIChoặc một cái gì đó tương tự, và sau đó GRANTnó.


3

Điều này có thể được sử dụng để "giải phóng" cơ sở dữ liệu khỏi các kết nối máy khách, ví dụ như bạn có thể đổi tên nó:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

Xin lưu ý rằng điều này có thể gây ra hành vi có vấn đề cho các ứng dụng khách của bạn. Dữ liệu thực tế không nên bị gián đoạn do sử dụng các giao dịch.

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.