若是存在活动链接,如何删除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'

相关文章
相关标签/搜索