Mongodb 数据库备份与还原

MongoDB 中使用 mongodump 来对整个数据库进行备份,使用 mongorestore 来将数据从备份中还原。

本文介绍一种常用的备份还原的参数设置,可以在实际工作中直接使用

功能安装

mongodumpmongorestore 是 mongodb-database-tools 中提供的命令行工具,使用这两个命令,需要先安装 mongodb-database-tools。

scoop 安装方法:

1
scoop install mongodb-database-tools

手动安装:

Try MongoDB Tools Free 下载 MongoDB Command Line Database Tools Download 安装包进行安装。

备份

1
mongodump -h localhost:27017 -d databaseName -u test -p testpwd --authenticationDatabase admin --gzip --archive=C:\Users\%username%\Desktop\dump\databaseName.gzip
  • -h / --host

    MongoDB 所在服务器地址,也可以同时指定端口号:127.0.0.1:27017

  • -d / --db

    指定数据库名称

  • -u / --username

    用于授权验证的用户名

  • -p / --password

    用于授权验证的密码

  • --authenticationDatabase

    验证授权的数据库名,一般是 admin

  • -o / --out

    指定导出目录,如果不指定 -archive,会在该目录中导出多个文件,每个集合有两个文件。

  • --gzip

    导出时使用 gzip 压缩

  • --archive

    导出成单个文件

还原

1
mongorestore -h localhost:27018 -u test -p testpwd --authenticationDatabase admin --gzip --objcheck --drop --noIndexRestore --nsInclude=databaseName.*  --nsFrom=databaseName.* --nsTo=newDatabaseName.* --archive=C:\Users\%username%\Desktop\dump\databaseName.gzip

如果不需要重命名数据库,去掉 --nsFrom--nsTo 参数即可

  • --drop

    删除已经存在的集合

  • --noIndexRestore

    禁止恢复索引

  • --nsInclude

    包含的命名空间(namespace),databaseName.* 表示数据库 databaseName 下的所有集合

  • --nsFrom

    指定重命名前的数据库命名空间

  • --nsTo

    指定重命名后的数据库命名空间

副本集中备份与还原

如果 MongoDB 配置了副本集,上述中的 -h 需要使用主节点的 IP 地址和端口

通过以下方法查看主节点:

1
2
3
4
5
# 进入到 mongodb 的任意节点中
mongosh --host 127.0.0.1 --port 27018 -u yourUsername -p yourPassword

# 获取状态
rs.status()

The mongo shell is removed from MongoDB 6.0. The replacement is mongosh.

MongoDB 6.0 以后 mongo 命令取消了,改用 mongoshmongosh 需要手动安装,可以使用 scoop 安装:scoop install mongosh

可以看到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 下面内容省略了其它无关配置
{
members: [
{
_id: 0,
name: "192.168.3.240:27018",
health: 1,
state: 1,
stateStr: "PRIMARY", // 说明是主节点
uptime: 7710,
},
{
_id: 1,
name: "192.168.3.240:27019",
health: 1,
state: 2,
stateStr: "SECONDARY",
uptime: 7701,
},
{
_id: 2,
name: "192.168.3.240:27020",
health: 1,
state: 2,
stateStr: "SECONDARY",
uptime: 7699
},
],
}

在上述结果中,state 为 1 时(stateStr 为 "PRIMARY")表示主节点。

在对副本集数据库进行恢复时,若数据过大,节点过多,会导致磁盘的读写飙升到100%,从而无法完成数据库恢复。此时可以减少副本节点,建议只使用 2 个。

参考

Try MongoDB Tools Free

The MongoDB Database Tools Documentation

mongod, mongo, mongosh, mongos, what now?