MongoDB Command Line Database Tools

摘要

  • 本文介绍Linux下MongoDB Command Line Database Tools的安装与使用

  • MongoDB Command Line Database Tools官方文档

  • 本文基于CentOS8(x86_64)

MongoDB Database Tools

  • MongoDB Database Tools是MongoDB官方提供的数据库管理工具,可以用于管理MongoDB数据库,包括MongoDB的备份、恢复、监控等功能。

  • MongoDB Database Tools的下载地址

1
2
3
4
5
6
7
8
9
10
11
# 下载安装包
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.9.4.tgz
# 解压安装包
tar -xvzf mongodb-database-tools-rhel80-x86_64-100.9.4.tgz
# 创建软连接
ln -s mongodb-database-tools-rhel80-x86_64-100.9.4 /mongodb/tools

# 在/etc/profile文件中配置PATH环境变量
export PATH=/mongodb/tools/bin:$PATH
# 使配置生效
source /etc/profile
  • MongoDB Database Tools常用命令,详细的使用方法请查看官方文档

文件名称 作用
mongostat 数据库性能监控工具
mongotop 热点表监控工具
mongodump 数据库逻辑备份工具
mongorestore 数据库逻辑恢复工具
mongoexport 数据导出工具
mongoimport 数据导入工具
bsondump BSON格式转换工具
mongofiles GridFS文件工具

mongoexport: 导出数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导出csv格式的数据
mongoexport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books -f _id,title,type,tag --type=csv -o books.csv

# 导出json格式的数据
mongoexport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books -f _id,title,type,tag --type=json -o books.json

# 参数说明
-d 指定数据库
-c 指定集合
-f 指定导出字段,csv格式需要指定字段,json格式可以不指定字段,默认导出全部
--type=csv/json 指定导出格式
-o 指定导出文件

# 导出时可以增加过滤条件
mongoexport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017?authSource=admin&replicaSet=rs0" -d mydb -c user --type=json -o user.json --limit=10 --skip=2 --sort='{"name":1}' --query='{"age":{"$gt":25},"name":"zhangsan"}'

# 参数说明
--limit=10 指定导出条数
--skip=2 指定跳过条数
--sort='{"name":1}' 指定排序字段
--query='{"age":{"$gt":25},"name":"zhangsan"}' 指定查询条件,注意这里的查询条件是json格式,字段名需要使用双引号包裹

mongoimport: 导入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导入csv格式的数据
# 注意此时导入的csv文件中第一行如果是字段名,需要先删除第一行再导入,这里使用了 -f 指定字段,来和导入的csv文件的列一一对应
mongoimport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books_new -f _id,title,type,tag --type=csv --file books.csv

# 注意此时导入的csv文件中第一行如果是字段名,需要先删除第一行再导入,这里使用了 -f 指定字段,来和导入的csv文件的列一一对应
mongoimport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books_new --headerline --type=csv --file books.csv

# 导入json格式的数据
mongoimport "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books_new --type=json --file books.json

-d 指定数据库
-c 指定集合
-f 指定导入字段,csv格式需要指定字段
--headerline 指定第一行是字段名
--type=csv/json 指定导入格式
--file 指定导入文件
--mode 指定导入方式,默认是insert,还可以是upsert,merge,delete

mode说明

  • insert: 默认值,如果数据不存在,则插入,如果存在,则报错

  • upsert: 如果数据不存在,则插入,如果存在,则更新

  • merge: 如果数据不存在,则插入,如果存在,则合并后更新

  • delete: 如果数据不存在,也不执行插入,如果存在,则删除

mongostat: 数据库性能监控

  • mongostat命令用于实时监控MongoDB数据库的性能,包括连接数、文档数、索引数、内存使用情况等。

1
2
3
4
5
6
7
8
9
10
11
12
# 监控20次,间隔1秒
mongostat "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -n20 1

# 参数说明
-n 指定监控次数
1 指定监控间隔时间,单位为秒

# 监控实时数据
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn set repl time
10.1.2.142:27017 *0 *0 *0 *0 0 4|0 0.4% 5.0% 0 2.95G 151M 0|0 0|0 1.13k 75.2k 24 rs0 SLV Apr 3 08:37:49.405
10.1.2.26:27017 *0 *0 *0 *0 0 2|0 0.2% 3.8% 0 2.87G 138M 0|0 0|0 710b 74.3k 14 rs0 SEC Apr 3 08:37:49.385
10.1.2.41:27017 *0 *0 *0 *0 0 5|0 0.0% 17.7% 0 2.96G 184M 0|0 0|0 1.45k 75.5k 16 rs0 SEC Apr 3 08:37:49.426

指标说明

指标名 说明
inserts 每秒插入数
query 每秒查询数
update 每秒更新数
delete 每秒删除数
getmore 每秒getmore数
command 每秒命令数,涵盖了内部的一些操作
%dirty WiredTiger缓存中脏数据百分比
%used WiredTiger 正在使用的缓存百分比
flushes WiredTiger执行CheckPoint的次数
vsize 虚拟内存使用量
res 物理内存使用量
qrw 客户端读写等待队列数量,高并发时,一般队列值会升高
arw 客户端读写活跃个数
netIn 网络接收数据量
netOut 网络发送数据量
conn 当前连接数
set 所属复制集名称
repl 复制节点状态,如PRI(主节点,我这里主节点显示为SLV),SEC(从节点),ARB(仲裁节点),REC(节点正在恢复),UNK(未知状态),RTR(mongos)
time 时间戳

需要重点关注的指标
1.插入、删除、修改、查询的速率是否产生较大波动,是否超出预期。
2.qrw、arw:队列是否较高,若长时间大于0则说明此时读写速度较慢。
3.conn:连接数是否太多。
4.dirty:百分比是否较高,若持续高于10%则说明磁盘I/O存在瓶颈。
5.netIn、netOut:是否超过网络带宽阈值。
6.repl:状态是否异常,如PRI、SEC、RTR为正常,若出现REC等异常值则需要修复。

1
2
3
4
5
6
7
# 指定监控指标 -o
mongostat "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -n1 1 -o='host,insert,query,update,delete,qrw,arw,conn,dirty,repl,version'

host insert query update delete qrw arw conn dirty repl version
10.1.2.142:27017 *0 *0 *0 *0 0|0 0|0 24 0.4% SLV 7.0.7
10.1.2.26:27017 *0 *0 *0 *0 0|0 0|0 14 0.2% SEC 7.0.7
10.1.2.41:27017 *0 *0 *0 *0 0|0 0|0 16 0.4% SEC 7.0.7

mongotop: 查看数据库性能

  • mongotop命令可用于查看数据库的热点表,通过观察mongotop的输出,可以判定是哪些集合占用了大部分读写时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 监控20次,间隔1秒
mongotop "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -n 20 1

ns total read write 2024-04-03T09:16:53Z
admin.atlascli 0ms 0ms 0ms
admin.system.keys 0ms 0ms 0ms
admin.system.users 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.external_validation_keys 0ms 0ms 0ms
config.image_collection 0ms 0ms 0ms
config.queryAnalyzers 0ms 0ms 0ms
config.settings 0ms 0ms 0ms
config.shardMergeRecipients 0ms 0ms 0ms
config.shardSplitDonors 0ms 0ms 0ms

# 输出说明
ns 集合名称
total 花费在该集合上的时长
read 花费在该集合上的读操作时长
write 花费在该集合上的写操作时长

mongodump: 备份数据库

  • mongodump命令用于备份数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 备份所有库,默认输出到dump文件夹下
mongodump "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" --gzip

# 备份指定库,默认输出到dump文件夹下
mongodump "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test --gzip

# 备份指定集合
mongodump "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books --gzip -o ./books
2024-04-03T09:36:18.980+0000 writing test.books to books/test/books.bson.gz
2024-04-03T09:36:18.983+0000 done dumping test.books (50 documents)

# 参数说明
-d 指定数据库,不指定则导出全部数据库
-c 指定集合,不指定则导出全部集合
--gzip 指定压缩格式,导出的文件会被压缩为.gz格式
-o 指定备份目录,不指定则默认为当前目录下的dump文件夹

# 类似于 mongoexport ,备份数据时同样支持过滤条件
mongodump "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d test -c books --gzip -o ./books --query='{"name":"hello"}'

mongorestore: 恢复数据库

  • mongorestore命令用于恢复数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
# 恢复到相同数据库的相同集合,此时会将dump目录下的所有数据库进行恢复
mongorestore "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" --gzip ./dump

# 只恢复指定的库下的所有集合
mongorestore "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" --nsInclude="test.*" --gzip ./dump

# 只恢复指定的集合
mongorestore "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" --nsInclude="test.books" --gzip ./dump


# 参数说明
--nsInclude=test.books 指定要恢复的集合
--gzip 指定压缩格式

bsondump: 查看BSON文件内容

  • bsondump命令用于查看BSON文件内容,可以将bson格式的数据转换为json格式,方便查看。

  • 我们使用mongodump导出的数据格式为bson格式,可以使用bsondump命令将其转换为json格式。

1
2
3
4
# 如果导出的是压缩格式需要先解压缩
gunzip emp.bson.gz
# 将bson文件转换为json文件
bsondump emp.bson > emp.json

mongofiles: 文件存储

  • mongofiles命令用于文件存储,可以将文件存储到MongoDB中,然后通过mongofiles命令进行查看和删除。

  • 不过现在文件存储基本都会使用S3,很少使用mongodb了。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
# 上传
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb put shell从入门到精通.docx
# 上传后会在指定的数据库中创建两个集合:fs.files 和 fs.chunks

> db.fs.files.find()
[
{
_id: ObjectId('66120f0135b8419b3a1ca510'), # 文档ID,唯一标识
length: Long('486680'), # 文件大小
chunkSize: 261120, # 每个分片的大小
uploadDate: ISODate('2024-04-07T03:12:01.965Z'), # 上传时间
filename: 'shell从入门到精通.docx', # 文件名
metadata: {} # 元数据
}
]


> db.fs.chunks.find()
[
{
_id: ObjectId('66120f0135b8419b3a1ca512'), # 分片ID
files_id: ObjectId('66120f0135b8419b3a1ca510'), # 文档ID,对应fs.files集合中的_id
n: 1, # 分片序号
data: <Binary> # 分片数据
}
]

# 查看
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb list

# 搜索
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb search shell

# 下载
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb get shell从入门到精通.docx
# 根据id获取文件
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb get_id '{"$oid": "66120f0135b8419b3a1ca510"}'

# 删除
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb delete shell从入门到精通.docx
# 根据id删除文件
mongofiles "mongodb://user:password@10.1.2.26:27017,10.1.2.142:27017,10.1.2.41:27017/?authSource=admin&replicaSet=rs0" -d mydb delete_id '{"$oid": "66120f0135b8419b3a1ca510"}'