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 图形化(新手友好)
- 打开 pgAdmin 4
 - 展开 
Servers→Databases - 右键 目标数据库(如 
myapp) - 点击 Delete/Drop
 - 勾选 “Cascade”(自动删除依赖对象)
 - 确认 → 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
现在就动手:
\l查看所有数据库- 备份 
test_db - 用 
--force删除它 - 再 
\l确认已删除 
需要我生成:
- 一键备份 + 删除脚本?回复 
备份删除脚本 - pgAdmin 批量删除多个数据库?回复 
批量删除 - 防止误删的权限控制?回复 
权限控制 
随时告诉我!