序言
测试环境:
Windows 10
一、问题
笔者尝试过在 cmd
命令行,使用PostgreSQL 的 psql
工具登录 postgresql,删除某个有问题的数据库,准备新建重载该数据库时,发现 DROP DATABASE database_name
,竟然报错该数据库不存在,可是笔者使用命令 \l
查看数据库时,发现那个数据库明明就还在那里存在着,真就古怪了,后面尝试 pgadmin
可视化工具,删除数据库,报错无法删除该数据库,原因是有一些会话链接存在,导致无法手动删除。
解决方法
用超级管理员,如 postgres
用户,登录 postgresql,记得输入口令,即密码。
psql -U postgres -d postgres
然后在 postgres=#
下运行如下命令:
SELECT CAST(pg_terminate_backend(pid) AS VARCHAR(10)) FROM pg_stat_activity WHERE datname='test-db';
注意,上述语句里的test-db要替换成您将要删除的数据库名即可;
差别多类似下面的样子,就是成功。
pg_terminate_backend
----------------------
true
然后有一点是需要注意的,之后笔者在 cmd
命令行,使用 DROP DATABASE database_name
命令,依旧无法删除指定的那个问题数据库,最后还是通过 pgAdmin 可视化工具,右键点击数据库 DELETE ,删除数据库。
补充
该链接是笔者后面了解到细节问题,关于数据库名要加双引号或单引号,在 PostgreSQL 很关键,最好加上去,当然什么时候用双引号和单引号,经验使然。
数据库无法删除,补充下笔者找到的命令:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname='test' AND pid<>pg_backend_pid();
注意 datname ='删除的数据库名'
将 test 修改为想要删除的数据库名。
二、有一个特别的情况是,即使使用了上面的命令,依旧无法删除数据库的问题。
解决方法:
重新启动 postgreSQL 数据库
注意:不要使用 pg_ctl restart 命令去重启 postgresql 数据库
使用如下命令重启:
pg_ctl stop
pg_ctl start -l /test/pyserver.log
然后还有使用命令,将之前的数据库链接删除:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname='test' AND pid<>pg_backend_pid();
然后就可删除数据库了。
如果还是不行,那么只能靠手速了,复用上面的会话删除命令:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname='test' AND pid<>pg_backend_pid();
快速删除会话,快速删除数据库,争取快过它们建立会话的速度。
drop database "your_database_name";