异常:
postgres=# CREATE DATABASE deepflow_agent2;
ERROR: source database "template1" is being accessed by other users
DETAIL: There are 2 other sessions using the database
如何断联这两个session
要解决 PostgreSQL 中因 template1
数据库被占用导致无法创建新数据库的问题,请按以下步骤操作:
1. 查看占用 template1 的会话
SELECT pid, usename, application_name, client_addr,query_start,state FROM pg_stat_activity WHERE datname = 'template1' AND pid <> pg_backend_pid(); -- 排除当前会话
2. 终止占用会话(三种方法)
方法1:逐个终止(推荐)
-- 对查询结果中的每个 pid 执行 SELECT pg_terminate_backend(目标pid); -- 替换为目标pid
方法2:批量终止所有占用会话
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'template1'AND pid <> pg_backend_pid();
方法3:使用 template0 模板创建(避免冲突)
CREATE DATABASE deepflow_agent2 TEMPLATE template0; -- 使用空白模板
3. 验证会话是否终止
SELECT count(*) FROM pg_stat_activity WHERE datname = 'template1'; -- 返回 1 表示只剩当前会话
4. 重新创建数据库
CREATE DATABASE deepflow_agent2;
预防措施:
-
永久解决方案:
ALTER DATABASE template1 ALLOW_CONNECTIONS = OFF; -- 禁止连接模板库
-
设置默认模板:
ALTER DATABASE template1 IS_TEMPLATE = false; -- 取消模板属性
-
使用专用模板:
CREATE DATABASE my_template IS_TEMPLATE = true; CREATE DATABASE new_db TEMPLATE my_template; -- 使用自定义模板
关键说明:
-
pg_terminate_backend()
需要超级用户权限 -
生产环境谨慎操作,终止会话可能导致用户操作中断
-
使用
template0
是最安全的替代方案,它是不可修改的干净模板
执行后如果仍有问题,检查 PostgreSQL 日志:
tail -n 50 /var/log/postgresql/postgresql-*.log