1. MongoDB备份
在进行数据库恢复之前,我们需要有一个可用的数据库备份。MongoDB提供了mongodump工具,可以将指定的数据库导出到一个二进制文件中。以下是mongodump的基本用法:
mongodump --host <hostname> --port <port> --username <username> --password <password> --authenticationDatabase <auth-db> --db <database> --out <path>
其中,--host用于指定MongoDB服务器的IP地址或主机名,--port用于指定服务器的端口号,默认为27017,--username和--password用于指定访问服务器的用户名和密码,--authenticationDatabase用于指定身份验证所使用的数据库,--db用于指定要备份的数据库,--out用于指定导出文件的保存路径。
2. MongoDB恢复
2.1 单节点恢复
如果我们的MongoDB服务器没有副本集,也没有分片集群,那么数据库恢复就非常简单了。我们只需要使用mongorestore命令,将备份文件中的数据导入到服务器中即可。以下是mongorestore的基本用法:
mongorestore --host <hostname> --port <port> --username <username> --password <password> --authenticationDatabase <auth-db> --db <database> --drop <path>
其中,--drop用于在导入数据之前先删除指定数据库中的所有数据。
2.2 副本集恢复
如果我们的MongoDB服务器是一个副本集,那么数据库恢复就稍微复杂一些了。以下是副本集恢复的基本步骤:
将要恢复的节点加入副本集
关闭其他节点,只保留一个节点运行
进行单节点恢复
清空恢复节点的数据目录,将恢复节点作为正常节点加入副本集
这里需要注意的是,在进行单节点恢复之前,我们需要将要恢复的节点加入到副本集的配置中。以下是将节点加入副本集的命令:
rs.add(<hostname>)
其中,<hostname>为要加入的节点的IP地址或主机名。
除了加入节点之外,剩下的步骤和单节点恢复是一样的。
2.3 分片集群恢复
如果我们的MongoDB服务器是一个分片集群,那么数据库恢复就更加复杂了。以下是分片集群恢复的基本步骤:
关闭整个集群,停止所有mongod进程
为每一个片段创建一个临时的目录
将备份文件中的数据导入到临时目录中,并使用mongos启动导入的临时分片集群
将分片集群分别导入到临时分片上,启动balancer并等待均衡完成
停止balancer,关闭mongos,清空旧的分片目录,将新的分片目录改名为旧的分片目录
这里需要注意的是,在进行分片集群恢复之前,我们需要记录每个片段的元数据,包括片段名称、主分片、副本集数量等信息。下面是一个获取元数据的例子:
use config
db.chunks.find({}, {_id: 0, shard: 1, ns: 1}).pretty()
这个查询将返回一个包含所有片段信息的列表。
除了上述步骤之外,还需要注意到的是,我们需要确保所有mongod进程都已停止,否则分片集群恢复可能会失败。