我须要编写一个脚原本删除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'