若是存在活動鏈接,如何刪除PostgreSQL數據庫?

我須要編寫一個腳原本刪除PostgreSQL數據庫。 可能有不少鏈接,可是腳本應該忽略它。 linux

當存在打開的鏈接時,標準的DROP DATABASE db_name查詢不起做用。 sql

我該如何解決這個問題? 數據庫


#1樓

我注意到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。 測試


#2樓

在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


#3樓

根據您的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


#4樓

在Linux命令提示符下,我將首先經過將此命令綁定sudo /etc/init.d/postgresql restart來中止全部正在運行的postgresql進程。

鍵入命令bg檢查其餘postgresql進程是否仍在運行

而後由dropdb dbname刪除數據庫

sudo /etc/init.d/postgresql restart
bg
dropdb dbname

這對我在linux命令提示符下有效


#5樓

PostgreSQL 9.2及更高版本:

SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'

相關文章
相關標籤/搜索