PostgreSQL 删除数据库

PostgreSQL 删除数据库完全指南

涵盖 命令行、pgAdmin、SQL 脚本、安全删除、强制断开连接、常见错误 等全场景。


一、警告:删除数据库是 不可恢复 操作!

一旦执行 DROP DATABASE:
- 所有表、数据、索引、函数、视图 全部丢失
- 无法 UNDO
- 必须先断开所有连接

请先备份!

pg_dump -U postgres mydb > mydb_backup_$(date +%F).sql

二、删除数据库的 3 种方式

方式适用场景推荐度
SQL 命令脚本化、自动化★★★★★
psql 命令行快速删除★★★★
pgAdmin 图形化新手★★★

三、方式 1:SQL 命令(推荐)

基本语法

DROP DATABASE database_name;

安全删除(推荐)

DROP DATABASE IF EXISTS mydb;

IF EXISTS 避免“数据库不存在”报错


四、方式 2:psql 命令行

1. 使用 dropdb 命令(最快)

dropdb -U postgres mydb

常用参数

dropdb -U username -h host -p port database_name

示例

# 删除本地数据库
dropdb -U postgres myapp

# 删除远程数据库
dropdb -U admin -h 192.168.1.100 -p 5432 analytics_db

# 强制删除(自动断开连接)
dropdb -U postgres --force mydb

2. 在 psql 中删除

psql -U postgres
-- 查看数据库
\l

-- 删除
DROP DATABASE mydb;

-- 安全删除
DROP DATABASE IF EXISTS mydb;

-- 退出
\q

五、方式 3:pgAdmin 图形化(新手友好)

  1. 打开 pgAdmin 4
  2. 展开 ServersDatabases
  3. 右键 目标数据库(如 myapp
  4. 点击 Delete/Drop
  5. 勾选 “Cascade”(自动删除依赖对象)
  6. 确认 → Yes

如果提示“数据库正在被使用”,需先 强制断开连接(见下文)


六、关键步骤:强制断开所有连接(必须!)

错误ERROR: database "mydb" is being accessed by other users

方法 1:SQL 终止会话

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb' 
  AND pid <> pg_backend_pid();  -- 排除当前会话

方法 2:一键脚本(推荐)

-- drop_db_safely.sql
DO $$
DECLARE
    r RECORD;
BEGIN
    -- 终止所有连接
    FOR r IN (SELECT pid FROM pg_stat_activity WHERE datname = 'mydb' AND pid <> pg_backend_pid()) LOOP
        PERFORM pg_terminate_backend(r.pid);
    END LOOP;

    -- 删除数据库
    EXECUTE 'DROP DATABASE IF EXISTS mydb';
END $$;

运行:

psql -U postgres -f drop_db_safely.sql

七、完整安全删除流程(生产推荐)

# 1. 备份(强烈推荐)
pg_dump -U postgres mydb > mydb_backup_$(date +%F).sql

# 2. 强制断开连接 + 删除
psql -U postgres -c "
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb' AND pid <> pg_backend_pid();
"

dropdb -U postgres --force mydb

--force = 自动执行 pg_terminate_backend


八、一键删除脚本(Linux/macOS)

# save as drop_db.sh
#!/bin/bash
DB=$1
USER=${2:-postgres}

if [ -z "$DB" ]; then
    echo "用法: $0 <数据库名> [用户名]"
    exit 1
fi

echo "正在备份 $DB ..."
pg_dump -U $USER $DB > ${DB}_backup_$(date +%F).sql

echo "正在强制删除 $DB ..."
dropdb -U $USER --force $DB

echo "删除完成!"

使用:

chmod +x drop_db.sh
./drop_db.sh myapp

九、常见错误与解决

错误原因解决
database "mydb" is being accessed by other users有连接占用pg_terminate_backend--force
permission denied to drop database无权限必须用超级用户(如 postgres
database "mydb" does not exist数据库不存在IF EXISTS\l 检查
cannot drop the currently open database当前连接的就是它\c postgres 切换

十、切换到安全数据库再删除

-- 必须先切换到其他数据库(如 postgres)
\c postgres

DROP DATABASE mydb;

十一、查看数据库连接数

SELECT datname, count(*) 
FROM pg_stat_activity 
GROUP BY datname;

十二、删除模板数据库?(慎重!)

-- 不要轻易删除 template0 / template1
-- template1 常被修改,template0 是干净模板

十三、快速参考表

命令说明
dropdb mydb删除
dropdb --force mydb强制删除
DROP DATABASE IF EXISTS mydb;安全删除
\l列出数据库
SELECT pg_terminate_backend(pid);断开连接
pg_dump mydb > backup.sql备份

小结:安全删除 3 步曲

1. 备份:pg_dump mydb > backup.sql
2. 断开:SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='mydb';
3. 删除:dropdb --force mydb

现在就动手

  1. \l 查看所有数据库
  2. 备份 test_db
  3. --force 删除它
  4. \l 确认已删除

需要我生成:

  • 一键备份 + 删除脚本?回复 备份删除脚本
  • pgAdmin 批量删除多个数据库?回复 批量删除
  • 防止误删的权限控制?回复 权限控制

随时告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注