中间件配置备份打包恢复
mkdir -p /home/hydev/mongodb/data chown -R 999:999 /home/hydev/mongodb/data
docker run -d \ --name mongodb \ --hostname mongodb \ -p 27017:27017 \ --restart always \ -v /home/hydev/mongodb/data:/data/db \ -v /home/hydev/mongodb/logs:/var/log/mongodb \ -v /home/hydev/mongodb/conf/mongod.conf:/home/mongodb/conf/mongod.conf \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=mongodb0509 \ mongo:6.0 \ --config /home/mongodb/conf/mongod.conf
既然我们已经优化了 Docker 运行命令,将数据精准持久化到了宿主机的 /home/hydev/mongodb/data 目录,那么现在的备份与恢复操作就会变得非常清晰和安全。
以下是基于优化后环境的完整备份与恢复步骤:
📦 第一步:在源服务器(华为云)执行备份
由于你的 MongoDB 容器内没有直接安装 mongodump 工具(或者为了环境隔离),我们采用 docker exec 的方式在容器内执行备份,并将备份文件直接输出到宿主机的持久化目录中。
-
在源服务器上执行备份命令:
# 1. 创建宿主机备份目录(如果不存在) mkdir -p /home/hydev/mongodb/backup # 2. 在容器内执行 mongodump,并将备份文件输出到挂载的宿主机目录 docker exec mongodb mongodump \ --uri="mongodb://admin:mongodb0509@localhost:27017" \ --out=/home/mongodb/backup # 3. 退出后,备份文件实际已保存在宿主机的 /home/hydev/mongodb/backup 目录下注:这里去掉了 URI 末尾的
/admin,确保全量备份所有业务数据库。 -
打包备份文件:
为了方便传输,建议在源服务器上将备份目录打包:tar -czvf /home/hydev/mongodb/backup/mongodb_backup_$(date +%Y%m%d).tar.gz -C /home/hydev/mongodb/backup .
🚀 第二步:在目标服务器(本地虚拟机)执行恢复
-
传输并解压备份文件:
将打包好的mongodb_backup_*.tar.gz文件通过scp等方式传输到本地虚拟机,并解压:# 1. 创建本地备份目录 mkdir -p /home/hydev/mongodb/backup # 2. 解压文件 tar -xzvf mongodb_backup_20260625.tar.gz -C /home/hydev/mongodb/backup -
使用优化后的命令启动新容器:
在本地虚拟机上,使用我们之前优化好的 Docker 命令启动 MongoDB 容器。此时容器内的/data/db对应的是本地虚拟机的/home/hydev/mongodb/data(初始为空)。 -
执行数据恢复:
将宿主机的备份文件拷贝进容器,并执行mongorestore:# 1. 将宿主机的备份文件拷贝进新容器 docker cp /home/hydev/mongodb/backup/. mongodb:/home/mongodb/backup # 2. 在容器内执行恢复 docker exec mongodb mongorestore \ --uri="mongodb://admin:mongodb0509@localhost:27017" \ --drop \ /home/mongodb/backup注:
--drop参数会在恢复前删除目标数据库中已存在的集合,确保恢复的数据与备份完全一致。如果是全新空容器,不加--drop也可以。
💡 进阶优化建议:直接使用宿主机工具
如果你不想每次都通过 docker cp 将备份文件拷进拷出,也可以在本地虚拟机宿主机上直接安装 mongodb-database-tools,然后直接使用宿主机的 mongorestore 命令连接容器的 27017 端口进行恢复:
# 直接在本地虚拟机宿主机上执行(无需 docker cp)
mongorestore \
--uri="mongodb://admin:mongodb0509@localhost:27017" \
--drop \
/home/hydev/mongodb/backup
这种方式利用了 Docker 的 -p 27017:27017 端口映射,操作更加丝滑,备份和恢复的文件都直接存在于宿主机上,效率更高。
docker run --name=mongodb --hostname=fd8af0124adb --mac-address=02:42:ac:11:00:04 --volume /home/hydev/mongodb/conf/mongod.conf:/home/mongodb/conf/mongod.conf --volume /home/hydev/mongodb/logs:/home/mongodb/logs --volume /data/configdb --volume /data/db --volume /home/hydev/mongodb/data:/home/mongodb/data --env=MONGO_INITDB_ROOT_USERNAME=admin --env=MONGO_INITDB_ROOT_PASSWORD=mongodb0509 --network=bridge -p 27017:27017 --runtime=runc --detach=true mongo:6.0 --config /home/mongodb/conf/mongod.conf docker run --name=rabbitmq --hostname=myRabbit --mac-address=02:42:ac:11:00:07 --volume /home/hydev/rabbitmq/data/data:/var/lib/rabbitmq --env=RABBITMQ_DEFAULT_VHOST=my_vhost --env=RABBITMQ_DEFAULT_USER=admin --env=RABBITMQ_DEFAULT_PASS=admin --network=bridge --expose=15671 -p 15672:15672 --expose=15691 --expose=15692 --expose=25672 --expose=4369 --expose=5671 -p 5672:5672 --runtime=runc --detach=true rabbitmq:3.13-management rabbitmq-server docker run --name=nacos --hostname=02a0d71f274b --mac-address=02:42:ac:11:00:03 --volume /home/hydev/nacos/conf:/home/nacos/conf --volume /home/hydev/nacos/data:/home/nacos/data --env=NACOS_AUTH_IDENTITY_KEY=nacos --env=NACOS_AUTH_IDENTITY_VALUE=nacos --env=MYSQL_SERVICE_PASSWORD=123456 --env=MODE=standalone --env=JVM_XMS=128m --env=JVM_XMX=128m --env=JVM_XMN=128m --network=bridge --workdir=/home/nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 --runtime=runc --detach=true nacos/nacos-server:v2.5.1 docker run --name=xxl-job-admin --hostname=12c4639a2d79 --mac-address=02:42:ac:11:00:05 --volume /home/hydev/xxljob/logs:/opt/apps/xxljob/logs --volume /home/hydev/xxljob/conf:/opt/apps/xxljob/conf --env=PARAMS=--spring.config.location=/opt/apps/xxljob/conf/application.properties --network=bridge -p 8844:8080 --restart=always --runtime=runc --detach=true xuxueli/xxl-job-admin:2.5.0
根据你提供的配置文件,迁移方案需要做一些关键调整。核心发现是:Nacos 和 XXL-JOB 的数据都在 MySQL 里,所以只要 MySQL 迁移成功,它们的数据就安全了。我们只需要迁移它们的配置文件,并更新数据库连接地址即可。
以下是更新后的详细迁移方案。
📋 迁移总览 (更新版)
| 中间件 | 核心数据/配置 | 迁移关键点 |
|---|---|---|
| MongoDB | 数据目录 /data/db |
使用 mongodump 和 mongorestore 进行逻辑备份恢复。 |
| RabbitMQ | 数据目录 /var/lib/rabbitmq |
停止容器后直接拷贝数据文件,注意修复权限。 |
| Nacos | 数据在 MySQL 中 | 只需迁移 conf 配置文件,并修改数据库连接地址。 |
| XXL-JOB | 数据在 MySQL 中 | 只需迁移 conf 配置文件,并修改数据库连接地址。 |
1. MongoDB 迁移方案
此方案不变,依然是逻辑备份与恢复。
步骤 1: 在华为云上备份
# 1. 进入容器
docker exec -it mongodb bash
# 2. 在容器内执行备份 (会提示输入密码 mongodb0509)
mongodump --uri="mongodb://admin:mongodb0509@localhost:27017/admin" --out=/home/mongodb/backup
# 3. 退出容器
exit
# 4. 将备份文件拷贝到宿主机
docker cp mongodb:/home/mongodb/backup /home/hydev/mongodb/backup
步骤 2: 在本地虚拟机恢复
- 准备目录:确保本地有
/home/hydev/mongodb/data目录。 - 拷贝备份:将华为云上的
/home/hydev/mongodb/backup目录拷贝到本地虚拟机的/home/hydev/mongodb/下。 - 启动容器:使用你提供的
docker run命令启动 MongoDB 容器。 - 恢复数据:
# 1. 将备份文件拷贝进新容器
docker cp /home/hydev/mongodb/backup/. mongodb:/home/mongodb/backup
# 2. 进入容器并恢复
docker exec -it mongodb bash
mongorestore --uri="mongodb://admin:mongodb0509@localhost:27017/admin" /home/mongodb/backup
2. RabbitMQ 迁移方案
此方案不变,直接拷贝数据文件。
步骤 1: 在华为云上备份
# 1. 停止容器
docker stop rabbitmq
# 2. 打包数据目录
tar -czvf /home/hydev/rabbitmq_data_backup.tar.gz -C /home/hydev/rabbitmq/data/data .
# 3. 启动容器
docker start rabbitmq
步骤 2: 在本地虚拟机恢复
- 准备目录:确保本地有
/home/hydev/rabbitmq/data/data目录。 - 拷贝备份:将
rabbitmq_data_backup.tar.gz拷贝到本地。 - 恢复数据:
# 1. 清空本地数据目录(如果有的话)
rm -rf /home/hydev/rabbitmq/data/data/*
# 2. 解压备份文件
tar -xzvf /home/hydev/rabbitmq_data_backup.tar.gz -C /home/hydev/rabbitmq/data/data
# 3. 关键:修复文件权限
chown -R 999:999 /home/hydev/rabbitmq/data/data
- 启动容器:使用你提供的
docker run命令启动。
3. Nacos 迁移方案 (重点更新)
Nacos 的数据在 MySQL 中,我们只需迁移配置文件,并确保它能连接到本地的 MySQL。
步骤 1: 在华为云上备份
# 打包 Nacos 的 conf 目录
tar -czvf /home/hydev/nacos_conf_backup.tar.gz -C /home/hydev/nacos conf
步骤 2: 在本地虚拟机恢复
- 准备目录:确保本地有
/home/hydev/nacos/conf目录。 - 拷贝备份:将
nacos_conf_backup.tar.gz拷贝到本地。 - 恢复并修改配置:
# 1. 解压配置文件
tar -xzvf /home/hydev/nacos_conf_backup.tar.gz -C /home/hydev/nacos
# 2. 修改 application.properties,指向本地 MySQL
# 关键修改项:db.url.0, db.user.0, db.password.0
sed -i 's|db.url.0=.*|db.url.0=jdbc:mysql://<你的本地虚拟机IP>:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true|' /home/hydev/nacos/conf/application.properties
sed -i 's|db.user.0=.*|db.user.0=root|' /home/hydev/nacos/conf/application.properties
sed -i 's|db.password.0=.*|db.password.0=<你的本地MySQL密码>|' /home/hydev/nacos/conf/application.properties
- 启动容器:使用你提供的
docker run命令启动。Nacos 会连接到本地已恢复的 MySQL。
4. XXL-JOB 迁移方案 (重点更新)
与 Nacos 类似,XXL-JOB 的数据也在 MySQL 中,我们只需迁移并修改配置文件。
步骤 1: 在华为云上备份
# 打包 conf 目录
tar -czvf /home/hydev/xxljob_conf_backup.tar.gz -C /home/hydev/xxljob conf
步骤 2: 在本地虚拟机恢复
- 准备目录:确保本地有
/home/hydev/xxljob/conf目录。 - 拷贝备份:将
xxljob_conf_backup.tar.gz拷贝到本地。 - 恢复并修改配置:
# 1. 解压配置文件
tar -xzvf /home/hydev/xxljob_conf_backup.tar.gz -C /home/hydev/xxljob
# 2. 修改 application.properties,指向本地 MySQL
# 关键修改项:spring.datasource.url, spring.datasource.username, spring.datasource.password
sed -i 's|spring.datasource.url=.*|spring.datasource.url=jdbc:mysql://<你的本地虚拟机IP>:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai|' /home/hydev/xxljob/conf/application.properties
sed -i 's|spring.datasource.username=.*|spring.datasource.username=app|' /home/hydev/xxljob/conf/application.properties
sed -i 's|spring.datasource.password=.*|spring.datasource.password=hyapp250509|' /home/hydev/xxljob/conf/application.properties
- 启动容器:使用你提供的
docker run命令启动。XXL-JOB 会连接到本地已恢复的 MySQL。
✅ 最终验证方案
所有中间件启动后,通过你的 biz 应用进行端到端验证。
-
连接性验证:
- MySQL:
biz应用能否正常启动,并执行增删改查操作。 - Redis:
biz应用能否正常读写缓存。 - Nacos:
biz应用能否成功注册到 Nacos,并能从 Nacos 拉取到配置。 - MongoDB:
biz应用能否连接并操作 MongoDB 数据库。 - RabbitMQ:
biz应用能否成功连接,并能发送/消费消息。 - XXL-JOB:
biz应用作为执行器,能否在 XXL-JOB 管理后台被正确发现。
- MySQL:
-
功能验证:
- 在
biz应用中触发一个完整的业务流程,该流程应涉及上述多个中间件。
- 在
-
日志检查:
- 使用
docker logs -f <container_name>实时查看各个中间件容器的日志,确保没有报错信息。
- 使用
浙公网安备 33010602011771号