云计算百科
云计算领域专业知识百科平台

创建postgres数据库失败

异常:

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 创建postgres数据库失败
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!