2013-07-03 26 views
54

Bất cứ khi nào tôi cố gắng thả cơ sở dữ liệu tôi nhận được:PostgreSQL - không thể thả cơ sở dữ liệu vì một số các kết nối tự động đến DB

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

Khi tôi sử dụng:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

tôi chấm dứt kết nối từ đó DB , nhưng nếu tôi cố gắng để thả cơ sở dữ liệu sau đó bằng cách nào đó ai đó tự động kết nối với cơ sở dữ liệu đó và đưa ra lỗi này. Điều gì có thể làm điều đó? Không ai sử dụng cơ sở dữ liệu này, ngoại trừ tôi.

Trả lời

54

Bạn có thể ngăn các kết nối trong tương lai:

REVOKE CONNECT ON DATABASE thedb FROM public; 

(và có thể là khác người dùng/vai trò, xem \l+ trong psql)

Sau đó bạn có thể chấm dứt tất cả các kết nối đến db này ngoại trừ chính bạn:

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid(); 

Trên các phiên bản cũ hơn pid được gọi là procpid vì vậy bạn sẽ phải giải quyết vấn đề đó.

Vì bạn đã thu hồi các quyền CONNECT, bất kỳ điều gì đã cố gắng tự động kết nối sẽ không thể thực hiện được nữa.

Bây giờ, bạn có thể thả DB.

Điều này sẽ không hoạt động nếu bạn đang sử dụng kết nối superuser cho hoạt động bình thường, nhưng nếu bạn đang làm điều đó bạn cần phải khắc phục vấn đề đó trước.

+2

Nếu bạn nhập một cơ sở dữ liệu khác có cùng tên sau, hãy cấp kết nối capab ility cho công chúng trở lại: 'GRANT CONNECT ON DATABASE thedb TO public;' – Mike

18

Chỉ cần kiểm tra kết nối là gì, kết nối đến từ đâu. Bạn có thể xem tất cả điều này trong:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

Có lẽ đó là kết nối của bạn?

+4

sudo kill -9 PID trong thiết bị đầu cuối sau khi xem kết quả –

42

Bất cứ khi nào tôi cố gắng thả cơ sở dữ liệu tôi nhận được:

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

Đầu tiên Bạn cần phải thu hồi

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

Sau đó sử dụng:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

Nó chắc chắn sẽ làm việc.

4

Nếu không có tác động tiềm năng trên các dịch vụ khác trên máy tính của bạn, chỉ cần service postgresql restart

5

Tôi tìm thấy một giải pháp cho vấn đề này cố gắng chạy lệnh này trong thiết bị đầu cuối quá trình giết

ps -ef | grep postgres 

bởi lệnh này

sudo kill -9 PID