PostgreSQL Docker 数据库导出与导入文档
本文记录 PostgreSQL 在 Docker 环境下的常用备份与恢复方式。
假设 PostgreSQL 容器名为:
postgresql假设数据库名为:
ums假设数据库用户为:
postgres一、查看 PostgreSQL 容器
先确认 PostgreSQL 容器是否正在运行:
docker ps如果容器名不是 postgresql,需要将后续命令中的 postgresql 替换成实际容器名。
二、导出数据库
1. 导出为 plain SQL 文件
推荐用于普通备份、迁移、排查问题。
docker exec -i postgresql pg_dump -U postgres -d ums > postgre-db_ums_$(date +%Y%m%d_%H%M%S).sql示例生成文件:
postgre-db_ums_20260617_010001.sql这种方式导出的文件是普通 SQL 文本文件,可以用 psql -f 导入。
2. 指定导出文件名
docker exec -i postgresql pg_dump -U postgres -d ums > postgre-db_ums-20260617__01_00_01.sql3. 只导出表结构
docker exec -i postgresql pg_dump -U postgres -d ums --schema-only > ums_schema.sql4. 只导出数据
docker exec -i postgresql pg_dump -U postgres -d ums --data-only > ums_data.sql5. 导出指定表
docker exec -i postgresql pg_dump -U postgres -d ums -t public.table_name > table_name.sql示例:
docker exec -i postgresql pg_dump -U postgres -d ums -t public.sys_user > sys_user.sql三、导入数据库
1. 导入 SQL 文件到已有数据库
如果数据库 ums 已经存在,可以直接导入:
docker exec -i postgresql psql -U postgres -d ums < postgre-db_ums-20260617__01_00_01.sql这是最常用的导入方式。
2. 进入容器后导入
也可以先把 SQL 文件复制进容器:
docker cp postgre-db_ums-20260617__01_00_01.sql postgresql:/tmp/ums.sql进入容器:
docker exec -it postgresql bash执行导入:
psql -U postgres -d ums -f /tmp/ums.sql四、数据库不存在时的导入流程
如果目标数据库还不存在,需要先创建数据库。
1. 创建数据库
docker exec -it postgresql createdb -U postgres ums或者进入 PostgreSQL 后创建:
docker exec -it postgresql psql -U postgres进入后执行:
CREATE DATABASE ums;退出:
\q2. 导入 SQL 文件
docker exec -i postgresql psql -U postgres -d ums < postgre-db_ums-20260617__01_00_01.sql五、恢复前清空旧数据库
如果目标数据库中已有旧表、旧数据,直接导入可能出现:
- 表已存在
- 主键冲突
- 类型已存在
- 约束已存在
- 数据重复
可以根据情况选择以下方式。
方式一:删除并重建数据库
如果确认目标库可以清空,推荐使用这种方式。
docker exec -it postgresql dropdb -U postgres ums
docker exec -it postgresql createdb -U postgres ums
docker exec -i postgresql psql -U postgres -d ums < postgre-db_ums-20260617__01_00_01.sql方式二:清空 public schema
如果不想删除数据库本身,可以清空 public schema:
docker exec -it postgresql psql -U postgres -d ums进入后执行:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;然后退出:
\q再导入:
docker exec -i postgresql psql -U postgres -d ums < postgre-db_ums-20260617__01_00_01.sql六、常见问题
1. 为什么不要直接复制 SQL 到客户端执行?
pg_dump 导出的 plain SQL 文件中可能包含:
COPY table_name (...) FROM stdin;后面跟着大量数据,例如:
1 admin 管理员
2 user 普通用户
\.这种格式需要由 psql 正确处理。
如果直接在 Navicat、DataGrip、DBeaver 等客户端中复制粘贴执行,可能出现语法错误,例如:
ERROR: syntax error at or near "2040317010859634689"原因是客户端没有正确识别 COPY ... FROM stdin 的数据段。
推荐使用命令行:
docker exec -i postgresql psql -U postgres -d ums < xxx.sql2. pg_dump 和 pg_restore 有什么区别?
如果导出的是普通 .sql 文件:
pg_dump -U postgres -d ums > ums.sql导入使用:
psql -U postgres -d ums -f ums.sql如果导出的是自定义格式:
pg_dump -U postgres -d ums -Fc > ums.dump恢复才使用:
pg_restore -U postgres -d ums ums.dump简单理解:
| 导出格式 | 文件类型 | 导入工具 |
|---|---|---|
| plain SQL | .sql |
psql |
| custom format | .dump / .backup |
pg_restore |
3. 导入时报表已存在怎么办?
如果报错类似:
ERROR: relation "xxx" already exists说明目标库中已经存在旧表。
可以选择:
docker exec -it postgresql dropdb -U postgres ums
docker exec -it postgresql createdb -U postgres ums
docker exec -i postgresql psql -U postgres -d ums < xxx.sql或者清空 public schema 后再导入。
4. 导入时报权限问题怎么办?
如果报错类似:
ERROR: role "xxx" does not exist说明 dump 文件中包含原数据库的 owner 或权限信息,但目标数据库没有对应角色。
可以在导出时加:
--no-owner --no-privileges示例:
docker exec -i postgresql pg_dump -U postgres -d ums --no-owner --no-privileges > ums.sql然后再导入。
七、推荐日常备份命令
建议使用:
mkdir -p ./pg_backup
docker exec -i postgresql pg_dump -U postgres -d ums --no-owner --no-privileges > ./pg_backup/ums_$(date +%Y%m%d_%H%M%S).sql八、推荐日常恢复命令
确认可以覆盖目标数据库后执行:
docker exec -it postgresql dropdb -U postgres ums
docker exec -it postgresql createdb -U postgres ums
docker exec -i postgresql psql -U postgres -d ums < ./pg_backup/ums_20260617_010001.sql九、完整示例
备份
docker exec -i postgresql pg_dump -U postgres -d ums --no-owner --no-privileges > postgre-db_ums-20260617__01_00_01.sql恢复
docker exec -it postgresql dropdb -U postgres ums
docker exec -it postgresql createdb -U postgres ums
docker exec -i postgresql psql -U postgres -d ums < postgre-db_ums-20260617__01_00_01.sql十、注意事项
.sql文件使用psql导入。.dump或.backup文件使用pg_restore导入。- 不建议把
pg_dump的 SQL 内容复制到数据库客户端里执行。 - 恢复前确认目标数据库是否可以清空。
- 生产环境恢复前必须先备份当前数据库。
- Docker 容器名、数据库名、用户名需要根据实际环境替换。
- 如果只是迁移业务数据,建议导出时使用
--no-owner --no-privileges,减少权限和角色问题。
最后编辑:张三 更新时间:2026-06-18 10:46