绕过 Docker 故障:PostgreSQL 容器的最终备份与迁移指南

本文档提供了一种在 Docker 环境故障时,通过直接访问宿主机文件系统来备份和恢复 PostgreSQL 数据库的详细流程。

⚠️ 迁移核心原则:权限和数据一致性

数据库迁移的成功取决于两点:

  1. 数据一致性: 确保备份时没有正在进行的写入操作(如果容器能停止,一定要停止)。
  2. 文件权限: 必须使用 tar-p 选项保留权限,并在目标主机上使用 chown 进行修复。

第一部分:源主机操作(备份数据和环境)

1. 识别关键信息

字段含义
数据卷 ID3d005f69...8aa4存储数据的 Docker 卷 ID。
容器 ID55036b80928c无法启动的容器 ID。
数据库密码pgvectorL__0909POSTGRES_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 是诊断启动失败(特别是权限错误)的唯一方法。

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录关闭