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 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 đó?
Câu trả lời:
Đâ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_activity
việ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');
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 PUBLIC
hoặc một cái gì đó tương tự, và sau đó GRANT
nó.
Đ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.