本文档提供了一种在 Docker 环境故障时,通过直接访问宿主机文件系统来备份和恢复 PostgreSQL 数据库的详细流程。
⚠️ 迁移核心原则:权限和数据一致性
数据库迁移的成功取决于两点:
- 数据一致性: 确保备份时没有正在进行的写入操作(如果容器能停止,一定要停止)。
- 文件权限: 必须使用
tar的-p选项保留权限,并在目标主机上使用chown进行修复。
第一部分:源主机操作(备份数据和环境)
1. 识别关键信息
| 字段 | 值 | 含义 |
|---|---|---|
| 数据卷 ID | 3d005f69...8aa4 | 存储数据的 Docker 卷 ID。 |
| 容器 ID | 55036b80928c | 无法启动的容器 ID。 |
| 数据库密码 | pgvectorL__0909 | POSTGRES_PASSWORD 环境变量。 |
2. 执行直接文件系统备份
- 数据卷物理路径示例:
/var/lib/docker/volumes/3d005f69896471eddcbcd41b4eaeeab804943a4db84d2442b952d23fdb668aa4/_data - 备份文件目标:
/home/pg_backup/pg_data_direct_backup.tar.gz
3. 备份容器运行环境 (Image)
4. 传输文件
将 /home/pg_backup/ 目录下的所有文件传输到目标主机。
第二部分:目标主机操作(恢复和启动)
1. 准备环境和恢复数据
- 加载镜像:
sudo docker load -i /tmp/pg_image.tar - 创建新卷:
sudo docker volume create restored_pg_data - 恢复数据(确保使用
tar xzpf保留权限):
2. 权限修复(核心步骤)
这是启动 PostgreSQL 容器前必须执行的一步。
3. 启动恢复后的 PostgreSQL 容器
🎯 总结与关键注意事项
| 区域 | 关键操作 | 注意事项 (Potential Pitfalls) |
|---|---|---|
| 备份 (源主机) | 使用 tar cpzf 命令。 | 绝不要 使用 cp -r,它会导致权限丢失。 |
| 恢复 (目标主机) | 使用 tar xzpf 命令。 | 确保 p 选项存在,否则权限信息将不会被恢复。 |
| 权限修复 | 执行 chown -R postgres:postgres。 | 这是数据库启动的关键。如果容器内数据库用户不是 postgres,需要相应修改。 |
| 启动命令 | 完整还原所有端口和环境变量。 | 端口映射 (-p 8976:5432) 和密码 (-e POSTGRES_PASSWORD) 必须与原容器完全一致。 |
| 镜像版本 | 尽可能使用与源容器完全相同的 PostgreSQL 版本。 | 如果目标主机上的 PostgreSQL 主版本不同,可能导致数据文件不兼容而无法启动。 |
| 故障排除 | 立即检查容器日志。 | sudo docker logs pg_restored 是诊断启动失败(特别是权限错误)的唯一方法。 |