PostgreSQL: Thả cơ sở dữ liệu PostgreQuery thông qua dòng lệnh [đã đóng]


321

Tôi đang cố gắng bỏ cơ sở dữ liệu của mình và tạo một cơ sở dữ liệu mới thông qua dòng lệnh.

Tôi đăng nhập bằng cách sử dụng psql -U usernamevà sau đó làm a \connect template1, theo sau là a DROP DATABASE databasename;.

Tôi nhận được lỗi

cơ sở dữ liệu tên dữ liệu đang được truy cập bởi người dùng khác

Tôi đã tắt Apache và thử lại nhưng tôi vẫn gặp lỗi này. Tôi có làm điều gì sai?


2
Điều gì xảy ra nếu bạn chỉ chạy dropdb databasenamelệnh từ dòng lệnh?
Dylan Markow

1
Nó nói "LRI: không thể bỏ cơ sở dữ liệu hiện đang mở"
iman453

4
Sử dụng psql -U <user> -c "drop database protodb"(không có tên cơ sở dữ liệu)
người dùng

3
Điều này sẽ khởi động lại postgres và ngắt kết nối tất cả mọi người: sudo service postgresql restart Sau đó thực hiện: dropdb -h localhost -p 5432 -U "youruser" "testdb" Lưu ý "" để đảm bảo các ký tự đặc biệt đi vào mà không gặp trở ngại.
unom

drop database <dataabase_name>;Đừng quên dấu phẩy.
Sandip Subedi

Câu trả lời:


455

Bạn có thể chạy lệnh dropdb từ dòng lệnh:

dropdb 'database name'

Lưu ý rằng bạn phải là một siêu người dùng hoặc chủ sở hữu cơ sở dữ liệu để có thể loại bỏ nó.

Bạn cũng có thể kiểm tra chế độ xem pg_stat_activity để xem loại hoạt động nào hiện đang diễn ra đối với cơ sở dữ liệu của bạn, bao gồm tất cả các quy trình nhàn rỗi.

SELECT * FROM pg_stat_activity WHERE datname='database name';

3
Tôi đang sử dụng dropuserlệnh để loại bỏ người dùng.
pl1nk

6
Câu trả lời không hữu ích như đối với phiên bản 9. Lỗi về các kết nối đã mở vẫn xuất hiện.
Pavel Vlasov

4
Điều này sẽ khởi động lại postgres và ngắt kết nối tất cả mọi người: sudo service postgresql restart Sau đó thực hiện: dropdb -h localhost -p 5432 -U "youruser" "testdb" Lưu ý "" để đảm bảo các ký tự đặc biệt đi vào mà không gặp trở ngại.
unom

1
sử dụng người dùng postgres: sudo -u postgres dropdb 'tên cơ sở dữ liệu'
leszek.hanusz

\lđể xem tất cả các cơ sở dữ liệu bạn có.
Sandip Subedi

115

Điều này làm việc cho tôi:

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

cho postgresql sớm hơn 9.2 thay thế pidbằngprocpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection- Processes /


12
Phải thay đổi một chút để hoạt động:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt

column "procpid" does not existđối với amazon RDS postgres 9.6 dụ
anon58192932

Hừm. Chạy cái này, nhưng nó vừa kết nối lại ngay lập tức, sau khi nói, "Kết nối SSL bị đóng đột ngột [...] khi cố gắng đặt lại: Đã thành công." Cuối cùng, tôi đã trở lại.
mlissner

67

Thử cái này. Lưu ý không có cơ sở dữ liệu được chỉ định - nó chỉ chạy "trên máy chủ"

psql -U postgres -c "drop database databasename"

Nếu điều đó không hiệu quả, tôi đã thấy một vấn đề với những người đăng bài đang giữ những tuyên bố đã được chuẩn bị mồ côi.
Để làm sạch chúng, hãy làm điều này:

SELECT * FROM pg_prepared_xacts;

sau đó với mọi id bạn thấy, hãy chạy nó:

ROLLBACK PREPARED '<id>';

Xin lỗi tôi chưa quen với cơ sở dữ liệu, vì vậy đây có lẽ là một câu hỏi ngu ngốc, nhưng tôi phải gõ nó ở đâu? Trước khi đăng nhập vào cơ sở dữ liệu phải không? Và tôi nên thay thế databasename bằng tên của cơ sở dữ liệu của tôi phải không?
iman453

@ iman453: Bạn sẽ chạy thẳng từ shell / dòng lệnh của mình.
mu quá ngắn

2
Không có những thứ như "chỉ trên máy chủ" cho postgresql. Bạn phải kết nối với cơ sở dữ liệu. Trong trường hợp này, bạn sẽ kết nối với cơ sở dữ liệu postgres, nơi chỉ có nhiều trường hợp như thế này. Và một điểm tốt về các giao dịch được chuẩn bị, nhưng trong trường hợp đó bạn sẽ nhận được một thông báo lỗi nói rằng đó là vấn đề.
Scott Marlowe

1
Xin lỗi, nhưng bạn là người sai. Đây là pg_stat_activity trong khi chạy createdb từ dòng lệnh: postgres = # select * từ pg_stat_activity; 11564 | bưu điện | 22223 | 16384 | cười thầm | TẠO thử nghiệm cơ sở dữ liệu; | f | 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.916578-06 | | -1 Lưu ý rằng điều này xảy ra trong khi chạy createdb từ dòng lệnh trong một thiết bị đầu cuối khác. Trường đầu tiên đó là db mà tập lệnh createdb của tôi được kết nối với
Scott Marlowe

1
Tại sao đây không phải là câu trả lời hàng đầu, số 1?
Henley Chiu

16

Khi nó nói người dùng được kết nối, truy vấn "select * from pg_stat_activity;" Nói? Có phải những người dùng khác ngoài bạn hiện đang kết nối? Nếu vậy, bạn có thể phải chỉnh sửa tệp pg_hba.conf của mình để từ chối kết nối từ những người dùng khác hoặc tắt bất kỳ ứng dụng nào đang truy cập cơ sở dữ liệu pg để có thể loại bỏ nó. Tôi có vấn đề này trong dịp sản xuất. Đặt pg_hba.conf để có hai dòng như thế này:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

và yêu cầu pssql tải lại hoặc khởi động lại (tức là sudo /etc/init.d/postgresql tải lại hoặc pg_ctl tải lại) và bây giờ cách duy nhất để kết nối với máy của bạn là thông qua các ổ cắm cục bộ. Tôi giả sử bạn đang dùng linux. Nếu không, điều này có thể cần phải được điều chỉnh thành một cái gì đó không phải cục bộ / nhận dạng trên dòng đầu tiên đó, thành một cái gì đó như máy chủ ... tên người dùng của bạn.

Bây giờ bạn sẽ có thể làm:

psql postgres
drop database mydatabase;
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.