wsl的docker备份redis和迁移

从数据丢失到完美恢复:一次惊险的Docker容器迁移实战

一次意外的容器重启,让我直面数据丢失的危机。本文将完整还原Redis和MongoDB容器数据恢复的惊险过程与核心技术方案。

一、危机来临:当容器重启后数据消失

那天,当我像往常一样重启测试环境的Redis容器后,熟悉的业务数据竟然全部消失了。docker exec my-redis redis-cli DBSIZE 返回了一个冷酷的 0。

最初的困惑过后,我意识到自己犯了一个常见错误:在创建容器时没有为数据卷设置持久化挂载。这意味着所有数据都存储在了容器的可写层中,容器一删,数据即亡。

面对这个局面,我开始了这次数据恢复的探索之旅,并总结出了一套可靠的容器数据迁移方法论。

二、Redis恢复之战:与自动持久化的博弈

2.1 发现关键线索:RDB文件仍在

幸运的是,容器只是重启而非删除。检查容器内部后,我发现 /data/dump.rdb 文件依然存在,且大小正常:

bash 复制代码
# 检查容器内数据文件
docker exec my-redis ls -lh /data/
# 输出显示 dump.rdb 文件存在
-rw-r--r-- 1 redis redis 1.2G Feb 5 03:01 dump.rdb

这表明数据实际上没有丢失,只是Redis没有加载这个文件。问题在于Redis的配置和启动方式。

2.2 首次失败尝试:直接重启的教训

我最初的尝试简单直接:将RDB文件复制到新容器并重启。结果令人失望:

bash 复制代码
# 将备份文件复制到新容器
docker cp redis_backup.rdb my-redis:/data/
docker restart my-redis
bash 复制代码
# 检查数据
docker exec my-redis redis-cli DBSIZE
# 输出: 0

数据依然是空的!检查日志后发现,Redis启动时自动创建了新的空RDB文件,覆盖了我的备份。

2.3 突破性发现:防止数据重置的关键配置

经过深入研究,我找到了问题的核心:Redis的自动持久化配置。解决方案是创建一个禁用自动保存的Redis配置文件:

bash 复制代码
ini
# redis_restore.conf
save ""  # 禁用所有自动保存规则
protected-mode no  # 允许远程连接(根据需求调整)
# requirepass yourpassword  # 如果有密码,取消注释并设置

这个简单的 save "" 指令是恢复成功的关键,它告诉Redis:"不要自动触发任何保存操作"。

2.4 完整恢复流程

以下是经过实践验证的完整恢复步骤:

bash 复制代码
bash
# 1. 在源服务器备份数据
docker cp my-redis:/data/dump.rdb ./redis_backup.rdb

# 2. 打包容器为镜像(保留原有配置)
docker commit my-redis my-redis:custom
docker save -o my-redis-custom.tar my-redis:custom

# 3. 在目标服务器准备恢复环境
mkdir -p /data/redis_data
cp redis_backup.rdb /data/redis_data/dump.rdb

# 4. 创建防止重置的配置文件
echo 'save ""' > /data/redis_data/redis.conf
echo 'protected-mode no' >> /data/redis_data/redis.conf

# 5. 使用正确配置启动容器
docker run -d \
  --name redis-new \
  -p 6379:6379 \
  -v /data/redis_data:/data \
  my-redis:custom \
  redis-server /data/redis.conf

# 6. 验证恢复结果
docker exec redis-new redis-cli DBSIZE

终于看到了期待的数字: 48763

相关推荐
大盛供应链·卢生8 小时前
哪些国产芯片可以替代进口芯片,哪些替代不了
fpga开发·容器
小小的木头人8 小时前
Docker 环境下迁移 containerd 数据目录:从 `/var/lib/containerd` 到 `/data/containerd`
linux·docker
Gl�ria10 小时前
Redis 高可用架构对比
数据库·redis
Zenova EdgeOS12 小时前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
hanchenxing12 小时前
前端异步任务三方案:Celery vs Redis Stream vs BullMQ 实战对比消息队列
前端·数据库·redis·异步任务·方案对比
Mr小林13 小时前
Docker 安装教程(在线 + 离线)
运维·docker·容器
java_logo13 小时前
Docker 部署 Milvus:轻松搭建高性能向量数据库平台
数据库·docker·私有化部署·milvus·向量数据库·rag·轩辕镜像
wdfk_prog17 小时前
VMware Ubuntu 虚拟机从 124 GB 压缩到 33 GB
运维·缓存·docker·容器
刃神太酷啦19 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
闲云野鹤在人间20 小时前
Docker入门|第3章 镜像详解
linux·网络·docker·容器·centos·云计算·php