Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果存在到PostgreSQL数据库的活动连接,如何删除该数据库?_Postgresql - Fatal编程技术网

如果存在到PostgreSQL数据库的活动连接,如何删除该数据库?

如果存在到PostgreSQL数据库的活动连接,如何删除该数据库?,postgresql,Postgresql,我需要写一个脚本来删除PostgreSQL数据库。它可能有很多连接,但是脚本应该忽略这一点 当存在打开的连接时,标准DROP DATABASE db_name查询不起作用 如何解决此问题?这将删除除您之外的现有连接: 查询pg_stat_活动并获取要终止的pid值,然后向它们发出SELECT pg_terminate_backendpid int PostgreSQL 9.2及以上版本: PostgreSQL 9.1及以下版本: 一旦断开每个人的连接,您就必须断开并从另一个数据库(也就是您尝试断

我需要写一个脚本来删除PostgreSQL数据库。它可能有很多连接,但是脚本应该忽略这一点

当存在打开的连接时,标准DROP DATABASE db_name查询不起作用


如何解决此问题?

这将删除除您之外的现有连接:

查询pg_stat_活动并获取要终止的pid值,然后向它们发出SELECT pg_terminate_backendpid int

PostgreSQL 9.2及以上版本:

PostgreSQL 9.1及以下版本:

一旦断开每个人的连接,您就必须断开并从另一个数据库(也就是您尝试断开的数据库)的连接发出DROP DATABASE命令


请注意,procpid列已重命名为pid。请参阅。

在使用pg_terminate_backendint函数删除数据库之前,可以先终止所有连接

您可以使用系统视图pg_stat_活动获取所有正在运行的后端

我不完全确定,但以下可能会终止所有会话:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'doomed_database'

当然,您自己可能没有连接到该数据库

我注意到postgres 9.2现在调用的是列pid,而不是procpid

我倾向于从外壳上称之为:

#!/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

希望这是有帮助的。感谢PostgreSQL 9.2及更高版本中的@JustBob提供的sql.

,要断开除会话之外的所有内容与所连接数据库的连接,请执行以下操作:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
  AND pid <> pg_backend_pid();
在旧版本中也是一样的,只需将pid更改为procpid。要断开与其他数据库的连接,只需将当前_数据库更改为要断开与用户连接的数据库的名称

在断开用户连接之前,您可能希望撤销数据库用户的连接权限,否则用户将继续重新连接,您将永远没有机会删除数据库。请参阅及其关联的问题


如果您只想断开空闲用户的连接,请参阅。

根据您的postgresql版本,您可能会遇到一个错误,这使得pg_stat_活动忽略掉的用户的活动连接。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命令提示符中,我将首先通过绑定此命令停止所有正在运行的postgresql进程 sudo/etc/init.d/postgrestart

键入命令 bg检查其他postgresql进程是否仍在运行

然后后跟dropdb dbname以删除数据库

sudo /etc/init.d/postgresql restart
bg
dropdb dbname
这在linux命令提示符下适用于我,PostgreSQL 9.2及更高版本:


从pg_stat_activity中选择pg_terminate_backendpid,其中datname='YOUR_DATABASE_NAME_HERE'

在我的情况下,我必须执行命令删除所有连接,包括我的活动管理员连接

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
它终止了所有连接并向我显示致命错误消息:

致命:由于管理员命令SQL状态:57P01而终止连接

在那之后,有可能删除数据库

这是我的攻击=D

sudo /etc/init.d/postgresql restart
bg
dropdb dbname
# Make sure no one can connect to this database except you!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "UPDATE pg_database SET datallowconn=false WHERE datname='<DATABASE_NAME>';"

# Drop all existing connections except for yours!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '<DATABASE_NAME>' AND pid <> pg_backend_pid();"

# Drop database! =D
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "DROP DATABASE <DATABASE_NAME>;"
我之所以给出这个答案,是因为上面包含了一个阻止新连接的命令,并且因为任何使用该命令的尝试

。。。请勿阻止新连接

感谢@araqnid@GoatWalker=D


我只是重新启动Ubuntu中的服务来断开连接的客户端

sudo service postgresql stop
sudo service postgresql start

psql
DROP DATABASE DB_NAME;
PostgreSQL 13引入了强制选项

删除数据库删除数据库。。。此外,如果其他任何人连接到目标数据库,除非使用下面描述的FORCE选项,否则此命令将失败

强迫

尝试终止与目标数据库的所有现有连接。如果目标数据库中存在准备好的事务、活动逻辑复制插槽或订阅,则不会终止


除了使用pgAdmin4登录外,我什么都没用。在仪表板上,我断开了除pgAdmin4之外的所有连接,然后可以通过右键单击数据库和属性并键入新名称进行重命名。

在Windows上,您可以打开任务管理器->服务,找到postgresql进程,然后重新启动它。当服务将再次运行时,可以删除数据库


您使用的是哪个版本的PostgreSQL?问题:虽然您可能会终止连接到数据库的会话,但它们可能会很快重新连接,以至于您仍然无法删除数据库。令人高兴的是,这篇文章展示了如何锁定新连接,这样您就可以按照计划终止当前连接并删除数据库:我在dba.stackexchange上找到了这个答案,它非常有用-简洁但解释性很强。当然,一定要从一个不是“TARGET_db”连接的db连接执行此操作,否则你会得到“错误”。“postgres”连接运行良好。实际上,它会断开客户端的连接
Y一个,如果你的客户在列表中间,它也会断开。因此,某些连接将保持活动状态。所以,正确的答案是克雷格·林格(Craig Ringer),见下文。从pg_stat_activity中选择pg_terminate_backendpg_stat_activity.pid,其中datname=当前_数据库和pg_stat_activity.pid pg_backend_pid;在他们完成当前事务后,我如何断开连接,然后删除有问题的表?在我的情况下,客户会很快重新连接,所以将此放在前面;删除数据库目标数据库;在我的情况下,这项工作很好,确保在事情开始重试时数据库已经消失。我甚至会花钱购买dropdb-force。从pg_stat_activity中选择pg_terminate_backendpg_stat_activity.pid,其中datname=当前_数据库和pg_stat_activity.pid pg_backend_pid;这就是我想要的,但是假设9.2及更高版本,你必须删除对pg_stat_活动的引用,并将procpid更改为pid。将procpid更改为pid后,此代码段在9.3上工作。即使不删除pg_stat_活动?我在9.2OK上出错了。现在我明白了,那是个打字错误。谢谢从9.3及以上版本中,从pg_stat_get_activityNULL::integer中选择pg_terminate_backendpid,其中datid=从pg_数据库中选择oid,其中datname='您的_数据库';如果您有许多数据库,并且只想断开单个数据库的连接,那么这是不好的。这将杀死所有连接。这有点夸张。@Nick true,但请记住,我们正在重新启动所有连接并完全停止它们。这不是也会终止活动连接吗?
REVOKE CONNECT ON DATABASE <DATABASE_NAME> FROM PUBLIC, <USERS_ETC>;
sudo service postgresql stop
sudo service postgresql start

psql
DROP DATABASE DB_NAME;
DROP DATABASE db_name WITH (FORCE);