如何对PostgreSQL数据库进行数据迁移
- 使用 `pg_dump` 和 `pg_restore` 工具
- 备份
- 恢复
- 直接备份 PostgreSQL 数据目录
- 备份
- 恢复
- 使用 Docker 卷备份
- 备份步骤
- 恢复
- 总结
在使用 Docker 部署 PostgreSQL 数据库时,数据备份和恢复是非常重要的操作。以下是几种可靠的备份和恢复方法:
使用 pg_dump
和 pg_restore
工具
这是 PostgreSQL 官方推荐的逻辑备份方法,适合备份单个数据库。
备份
-
进入运行 PostgreSQL 的 Docker 容器:
docker exec -it <容器名称或ID> bash
-
使用
pg_dump
备份数据库:pg_dump -U <用户名> -d <数据库名> -F c -b -v -f /backup/<备份文件名>.dump
-U
:指定数据库用户名。-d
:指定数据库名称。-F c
:指定备份格式为自定义格式(适合pg_restore
)。-b
:包含大对象(如二进制数据)。-v
:显示详细日志。-f
:指定备份文件路径。
例如:
pg_dump -U postgres -d mydb -F c -b -v -f /backup/mydb_backup.dump
-
将备份文件从容器复制到宿主机:
docker cp <容器名称或ID>:/backup/mydb_backup.dump /宿主机路径/
恢复
- 将备份文件复制到容器中:
docker cp /宿主机路径/mydb_backup.dump <容器名称或ID>:/backup/mydb_backup.dump
- 进入容器并恢复数据库:
pg_restore -U <用户名> -d <数据库名> -v /backup/mydb_backup.dump
直接备份 PostgreSQL 数据目录
这种方法适合备份整个 PostgreSQL 实例(包括所有数据库和配置)。
备份
-
停止 PostgreSQL 容器:
docker stop <容器名称或ID>
-
备份 PostgreSQL 数据目录(通常挂载在
/var/lib/postgresql/data
):tar -czvf postgres_backup.tar.gz -C /宿主机挂载路径 .
例如:
tar -czvf postgres_backup.tar.gz -C /var/lib/docker/volumes/my_postgres_data .
-
启动 PostgreSQL 容器:
docker start <容器名称或ID>
恢复
- 停止 PostgreSQL 容器:
docker stop <容器名称或ID>
- 解压备份文件到数据目录:
tar -xzvf postgres_backup.tar.gz -C /宿主机挂载路径
- 启动 PostgreSQL 容器:
docker start <容器名称或ID>
使用 Docker 卷备份
如果 PostgreSQL 数据存储在 Docker 卷中,可以直接备份 Docker 卷。
备份步骤
- 查找 PostgreSQL 数据卷:
docker volume ls
- 备份卷数据:
例如:docker run --rm -v <卷名称>:/volume -v /宿主机路径:/backup busybox tar -czvf /backup/postgres_volume_backup.tar.gz -C /volume .
docker run --rm -v my_postgres_data:/volume -v /home/user/backups:/backup busybox tar -czvf /backup/postgres_volume_backup.tar.gz -C /volume .
恢复
- 停止 PostgreSQL 容器:
docker stop <容器名称或ID>
- 恢复卷数据:
docker run --rm -v <卷名称>:/volume -v /宿主机路径:/backup busybox tar -xzvf /backup/postgres_volume_backup.tar.gz -C /volume
- 启动 PostgreSQL 容器:
docker start <容器名称或ID>
总结
- 逻辑备份:使用
pg_dump
和pg_restore
,适合单个数据库备份。 - 物理备份:直接备份数据目录或 Docker 卷,适合全量备份。
根据需求选择合适的方法,并定期测试备份文件的恢复能力,以确保数据安全。