我須要編寫一個腳原本刪除PostgreSQL數據庫。 可能有不少鏈接,可是腳本應該忽略它。 linux
當存在打開的鏈接時,標準的DROP DATABASE db_name
查詢不起做用。 sql
我該如何解決這個問題? 數據庫
我注意到postgres 9.2如今調用列pid而不是procpid。 bash
我傾向於從外殼調用它: post
#!/usr/bin/env bash # kill all connections to the postgres server if [ -n "$1" ] ; then where="where pg_stat_activity.datname = '$1'" echo "killing all connections to database '$1'" else echo "killing all connections to database" fi cat <<-EOF | psql -U postgres -d postgres SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity ${where} EOF
但願對您有所幫助。 感謝@JustBob的sql。 測試
在PostgreSQL 9.2及更高版本中,要斷開除會話外的全部鏈接,請斷開與數據庫的鏈接: spa
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();
在舊版本中是相同的,只是將pid
更改成procpid
。 要斷開與其餘數據庫的鏈接,只需將current_database()
更改成要與用戶斷開鏈接的數據庫的名稱。 rest
您可能但願在斷開用戶鏈接以前先從數據庫用戶REVOKE
CONNECT
權限,不然用戶將繼續從新鏈接,您將永遠沒有機會刪除數據庫。 請參閱此註釋以及與之相關的問題, 如何將全部其餘用戶從數據庫中分離出來 。 postgresql
若是您只想斷開空閒用戶的鏈接,請參閱此問題 。 code
根據您的postgresql版本,您可能會遇到一個錯誤,這會使pg_stat_activity
忽略掉線用戶的活動鏈接。 這些鏈接也未在pgAdminIII內部顯示。
若是您正在執行自動測試(您還將在其中建立用戶),則多是這種狀況。
在這種狀況下,您須要還原爲如下查詢:
SELECT pg_terminate_backend(procpid) FROM pg_stat_get_activity(NULL::integer) WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
注意:在9.2+中,您將procpid
更改成pid
。
在Linux命令提示符下,我將首先經過將此命令綁定sudo /etc/init.d/postgresql restart來中止全部正在運行的postgresql進程。
鍵入命令bg檢查其餘postgresql進程是否仍在運行
而後由dropdb dbname刪除數據庫
sudo /etc/init.d/postgresql restart bg dropdb dbname
這對我在linux命令提示符下有效
PostgreSQL 9.2及更高版本:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'