You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

域名过期致MongoDB副本集无法访问,如何恢复数据?

解决方案:修复MongoDB副本集或导出数据

问题根源是副本集成员配置使用的域名失效,导致节点间无法通信,集群无法选举主节点,所有节点处于异常状态。以下是两种可行方案:


方案一:修复副本集(恢复集群运行)

1. 临时配置本地域名映射

在每个主机的/etc/hosts文件中添加域名与对应主机IP的映射,让节点能互相解析:

# 编辑hosts文件
sudo vi /etc/hosts

# 添加以下内容(替换为各主机实际IP)
<host1-实际IP> host1.mydomain.com
<host2-实际IP> host2.mydomain.com
<host3-实际IP> host3.mydomain.com

重启每个节点的MongoDB容器使配置生效:

docker restart <mongodb容器名>

2. 重新配置副本集为IP地址

进入任意节点的MongoDB容器:

docker exec -it <mongodb容器名> mongo

执行认证并修改副本集配置:

use admin;
db.auth('admin', '<你的密码>');

# 获取当前副本集配置
var cfg = rs.conf();

# 将成员域名替换为实际IP
cfg.members[0].host = "<host1-实际IP>:27017";
cfg.members[1].host = "<host2-实际IP>:27017";
cfg.members[2].host = "<host3-实际IP>:27017";

# 强制重新配置副本集
rs.reconfig(cfg, {force: true});

等待集群重新选举,执行rs.status()查看状态,直到出现PRIMARY节点。

3. 验证恢复

连接到主节点执行show dbs,确认能正常访问数据。后续连接字符串可改为IP形式:

mongodb://admin:<密码>@<host1-IP>:27017,<host2-IP>:27017,<host3-IP>:27017/admin?replicaSet=rs0

方案二:直接导出数据(无需恢复集群)

1. 停止所有MongoDB容器

docker stop <mongodb容器名>

2. 启动单实例MongoDB

选择数据完整的节点(优先原主节点),查看其数据挂载目录:

docker inspect <mongodb容器名> | grep -A 10 "Mounts"

复制Source字段对应的主机目录(如/var/lib/mongodb),启动单实例容器:

docker run -d -p 27017:27017 -v /var/lib/mongodb:/data/db --name mongodb-single mongo

3. 导出数据

进入容器执行认证,然后用mongodump导出:

# 进入容器
docker exec -it mongodb-single mongo

# 认证
use admin;
db.auth('admin', '<你的密码>');

# 退出shell,执行导出命令
exit
docker exec mongodb-single mongodump -u admin -p <你的密码> --authenticationDatabase admin --out /data/db/dump

# 将导出文件复制到主机
docker cp mongodb-single:/data/db/dump /本地存储路径

注意事项

  • 操作前务必备份MongoDB数据目录,避免数据丢失。
  • 方案一中需确保节点间IP可互通(开放27017端口防火墙/安全组)。
  • 方案二中优先选择原主节点的数据,保证数据完整性。

内容的提问来源于stack exchange,提问作者abhinavkulkarni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:27:37