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.sql

3. 只导出表结构

docker exec -i postgresql pg_dump -U postgres -d ums --schema-only > ums_schema.sql

4. 只导出数据

docker exec -i postgresql pg_dump -U postgres -d ums --data-only > ums_data.sql

5. 导出指定表

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;

退出:

\q

2. 导入 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.sql

2. pg_dumppg_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

十、注意事项

  1. .sql 文件使用 psql 导入。
  2. .dump.backup 文件使用 pg_restore 导入。
  3. 不建议把 pg_dump 的 SQL 内容复制到数据库客户端里执行。
  4. 恢复前确认目标数据库是否可以清空。
  5. 生产环境恢复前必须先备份当前数据库。
  6. Docker 容器名、数据库名、用户名需要根据实际环境替换。
  7. 如果只是迁移业务数据,建议导出时使用 --no-owner --no-privileges,减少权限和角色问题。
作者:张三  创建时间:2026-06-18 10:46
最后编辑:张三  更新时间:2026-06-18 10:46
上一篇:
下一篇: