postgresql - 无法创建数据库 - OperationalError:其他用户正在访问源数据库“template1”

问题描述 投票:35回答:7

我登录到源数据库template1,现在我无法创建数据库。当我尝试创建数据库时,我收到此错误:

OperationalError: source database "template1" is being accessed by other users
DETAIL:  There are 5 other session(s) using the database.

每次我登录template1时,都会使用'exit'命令注销,但是你可以看到它没有注销,每次登录时会话数都会增加。有没有办法强制断开与现在登录的template1的每个连接?

postgresql postgresql-8.4
7个回答
34
投票

数据库template1仅用于提供准系统结构以创建另一个空数据库。你永远不应该登录template1,否则你会遇到问题。

对您来说可能最简单的解决方案是重新启动PostgreSQL服务器进程,然后再次登录。应该始终存在并且可以安全登录的数据库是postgres

如果不能重新启动,则可以使用另一个紧急模板数据库:template0

默认情况下,此语句:

CREATE DATABASE dbname;

相当于:

CREATE DATABASE dbname TEMPLATE template1;

如果template1不可用或已损坏,您可以使用template0作为最后的手段:

CREATE DATABASE dbname TEMPLATE template0;

您可以阅读有关模板数据库here的更多信息。


26
投票

这有助于我解决我的问题:

SELECT *, pg_terminate_backend(procpid) 
FROM pg_stat_activity 
WHERE usename='username';

--Use pid if PostgreSQL version 9.2 or above.

我终止了与template1的所有活动连接,并且可以正常创建数据库


9
投票

要解决这个问题,我必须断开数据库连接与pgAdmin III的连接。


5
投票

您还可以尝试终端终止当前进程线程

搜索过程:

sudo ps aux | grep template1

杀死进程:

sudo kill -9 <你的进程ID>


2
投票

我有一个连接到数据库并对其执行各种操作的脚本,有些要求没有其他人登录。我修改了@Andrius的答案,不是终止我的脚本的连接,而是终止其他人的:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid();

来自docspg_backend_pid()是附加到当前会话的服务器进程的进程ID。


1
投票

在template1和template0数据库中记录(psql template1或psql template0)并使用以下命令退出时会发生此问题。

Ctrl + z

从postgres命令下面的db使用更好的方法然后问题不会创建:

\ q +输入

有2个解决方案,如果有问题。

解决方案 - 1

重新启动postgres服务。

sudo服务postgresql重启

解决方案 - 2

sudo ps aux | grep template1

确保不要删除此进程

postgres 8363 0.0 0.0 111760 7832 pts / 11 T 09:49 0:00 /usr/lib/postgresql/9.5/bin/psql template1 ankit 18119 0.0 0.0 14224 976 pts / 14 S + 12:33 0:00 grep --color =自动模板1

应该使用以下命令杀死其余进程。

sudo kill -9

现在尝试再次创建db。

希望这对你有所帮助。

Ankit:甘地


-1
投票

您可以尝试重新启动在后台运行的postgresql服务。

© www.soinside.com 2019 - 2024. All rights reserved.