钢镚儿的开发日志
耐得住寂寞 方能一鸣惊人

docker 部署的 postgres 全量备份和恢复

2026年08月14日
开发
  • 容器名:postgres
  • 镜像:pgvector:pg16(当普通 PostgreSQL 16 用就行)
  • 使用docker-compose
  • 备份目录:当前脚本目录下./backup

一、一次性备份所有数据库(全量)

在宿主机当前目录(和docker-compose.yml同一层)执行:

1
2
3
4
mkdir -p ./backup
docker exec -i postgres \
pg_dumpall -U postgres \
> ./backup/backup-$(date +%F-%H%M%S).sql

说明:
会在./backup下生成一个文件,例如:backup-2026-03-06-153020.sql
包含所有数据库、用户、权限等(pg_dumpall全量逻辑备份)。

如你的数据库用户不是postgres,把-U postgres换成实际用户名。

二、从某个备份文件恢复(全量恢复)

同样在宿主机当前目录(和docker-compose.yml同一层)执行,例如从上面生成的文件恢复:

1
2
3
docker exec -i postgres \
psql -U postgres \
< ./backup/backup-2026-03-06-153020.sql

注意事项:
建议目标实例尽量“干净”(原有数据库/用户尽量不要冲突)。

如果提示role/database already exists,说明当前实例里已存在同名用户/库。

最简单解决办法:重建一个干净的 PG 容器再恢复;
或者手工编辑.sql文件去掉某些CREATE ROLE/CREATE DATABASE语句后再导入(需要一定经验)。

三、只备份和恢复某个数据库(如果你只关心业务库)

假设业务库叫mydb:

备份单库

1
2
mkdir -p ./backup
docker exec -i postgres pg_dump -U postgres -d mydb > ./backup/mydb-$(date +%F).sql

恢复单库

如果目标实例还没有这个库,先创建:

1
docker exec -it postgres createdb -U postgres mydb

再导入备份:

1
docker exec -i postgres psql -U postgres -d mydb < ./backup/mydb-2026-03-06-153020.sql

如果喜欢这篇文章,可以给作者评个份哦~

转载本站文章请注明作者“钢镚儿”及原文出处。