phpPgAdmin的:它是如何踢出来的用户的Postgres的,所以它可以db_drop?
-
19-09-2019 - |
题
我有一个Posgresql数据库(我的老板),我想放弃它,并从转储重新创建它。
但问题是,有是定期访问数据库几个应用程序(两个网站,导轨和Perl)。所以我得到一个“数据库被其他用户访问”错误。
我读过一个可能性越来越涉及进程的PID和单独杀死他们。我想做些什么清洁剂,如果可能的话。
phpPgAdmin的,似乎做我想做的:我能放下使用其Web界面模式,即使在网站上,没有得到错误。所以,我研究它的代码是如何工作的。不过,我没有PHP的专家。
我想了解,以便看看它是如何做它的phpPgAdmin的代码。我发现线(在Schemas.php 257),在此表示:
$data->dropSchema(...)
$data
是一个全局变量,我无法找到它被定义
任何指针将不胜感激。
解决方案
首先,找到目前所有procesid的使用你的数据库:
SELECT usename, procpid FROM pg_stat_activity WHERE datname = current_database();
二,杀进程,你不想要的:
SELECT pg_terminate_backend(your_procpid);
此工作原理的8.4版本,否则pg_terminate_backend()是未知的,并且你必须杀死在OS水平的过程。
要迅速下降连接到给定数据库的所有连接,该快捷方式很好地工作。必须运行超级用户身份:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='YourDB';
在更近的版本的Postgres(至少9.2+,可能更早),列名已经改变,查询是:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='YourDB';
其他提示
不知道关于PostgreSQL的,但我认为一个可能的解决办法是锁定表,当他们尝试访问它的其他进程将失败。
请参阅: http://www.postgresql.org/docs/current/static/ SQL-lock.html
不隶属于 StackOverflow