1.用户管理
????????MMongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全, 需创建数据库用户。
? ? ? ? 权限说明:
read
| 允许用户读取指定数据库? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | readWrite |
允许用户读写指定数据库
|
dbAdmin
|
允许用户在指定数据库中执行管理函数,如索引创建、删除,查看,统计或访问system.profile.
|
userAdmin
|
允许用户向
system.users
集合写入,可以找指定数据库里创建、删除和管理用户.
|
clusterAdmin
|
只在
admin
数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
|
readAnyDatabase
|
只在
admin
数据库中可用,赋予用户所有数据库的读权限
|
readWriteAnyDatabase
|
只在
admin
数据库中可用,赋予用户所有数据库的读写权限
|
userAdminAnyDatabase
|
只在
admin
数据库中可用,赋予用户所有数据库的
userAdmin
权限
|
dbAdminAnyDatabase
|
只在
admin
数据库中可用,赋予用户所有数据库的
dbAdmin
权限
|
root
|
只在
admin
数据库中可用。超级账号,超级权限
|
创建用户:
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
语法说明
user
字段:用户的名字
;
pwd
字段:用户的密码
;
cusomData
字段:为任意内容,例如可以为用户全名介绍
;
roles
字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles
字段:可以指定内置角色和用户定义的角色
创建管理员用户:
进入管理数据库
> use admin
创建管理用户,
root
权限
db.createUser(
{
????????user: "root",
????????pwd: "root",
????????roles: [ { role: "root", db: "admin" } ]
????????}
?)
注意:
创建管理员角色用户的时候,必须到
admin
下创建。
删除的时候也要到相应的库下操作。
查看创建完用户后的
collections
;
????????> show tables;
查看创建的管理员用户
????????> show users
验证用户是否能用
????????> db.auth("root","root")
用户创建完成后在配置文件中开启用户验证
????????cat >>/etc/mongod.conf<<-'EOF'
????????security:
????????authorization: enabled
????????EOF
重启服务
????????systemctl restart mongod
登陆测试,注意登陆时选择
admin
数据库
注意:用户在哪个数据库下创建的,最后加上什么库。
方法一:命令行中进行登陆
????????[mongod@MongoDB ~]$ mongo -uroot -proot admin
方法二:在数据库中进行登陆验证:
????????> use admin
????????switched to db admin
????????> db.auth("root","root")
按生产需求创建用户:
?
创建对某库的只读用户 ,在test
库创建只读用户
test
myRS:PRIMARY> db.createUser(
... {user: "test",pwd: "test",roles: [{ role: "read", db: "test"}]})
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}
myRS:PRIMARY> db.auth("test","test")
1
myRS:PRIMARY> show users;
{
"_id" : "test.test",
"userId" : UUID("bdd7783e-9cfc-43b5-9e38-3497cfeb71fa"),
"user" : "test",
"db" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
myRS:PRIMARY>
登录
test
用户,并测试是否只读
????????show collections;
????????db.createCollection('b')
创建某库的读写用户:
创建
test1
用户,权限为读写
db.createUser(
????????{
????????user: "test1",
????????pwd: "test1",
????????roles: [ { role: "readWrite", db: "test" } ]
????????}
)
查看并测试用户
????????show users;
????????db.auth("test1","test1")
创建对多库不同权限的用户
创建对app为读写权限,对test库为只读权限的用户
use app
db.createUser(
????????{
????????user: "app",
????????pwd: "app",
????????roles: [ { role: "readWrite", db: "app" },
????????{ role: "read", db: "test" } ]
????????}
)
查看并测试用户
????????show users
????????db.auth("app","app")
删除用户:
删除app用户:先登录到admin数据库
????????mongo -uroot –proot 127.0.0.1/admin
进入app库删除app用户
????????use app
????????db.dropUser("app")
自定义数据库:
创建app数据库的管理员:先登录到admin数据库
use app
db.createUser(
????????{
????????user: "admin",
????????pwd: "admin",
????????roles: [ { role: "dbAdmin", db: "app" } ]
????????}
)
创建app数据库读写权限的用户并具有clusterAdmin权限:
use app
db.createUser(
????????{
????????user: "app04",
????????pwd: "app04",
????????roles: [ { role: "readWrite", db: "app" },
????????{ role: "clusterAdmin", db: "admin" } ]
????????}
)
2.数据导出
?mongoexport:
? ? ? ? -d:指定要导出的数据库;
? ? ? ? -c:指定要导出的表;
? ? ? ? -o:指定导出后的文件名;
[root@master ~]# mongoexport -d db1 -c student -o stu,dat
2022-09-15T13:40:47.577+0800 connected to: mongodb://localhost/
2022-09-15T13:40:47.593+0800 exported 7 records
[root@master ~]# cat stu.dat
{"_id":{"$oid":"6329da7c5e81be318ba81363"},"id":1.0,"name":"张三","sex":"男","age":18.0}
{"_id":{"$oid":"6329dae25e81be318ba81364"},"id":2.0,"name":"李四","sex":"女","age":19.0}
{"_id":{"$oid":"6329dd545e81be318ba81365"},"id":3.0,"name":"王五","sex":"男","age":19.0}
{"_id":{"$oid":"6329dee05e81be318ba81366"},"id":4.0,"name":"赵六","sex":"男","age":21.0}
{"_id":{"$oid":"6329e2445e81be318ba81367"},"id":6.0,"name":"孙八","sex":"男","age":21.0,"address":{"province":"Hebei","city":"tangshan"}}
{"_id":{"$oid":"6329e2445e81be318ba81368"},"id":7.0,"name":"侯九","sex":"男","age":20.0,"address":{"province":"beijing","city":"gugong"}}
{"_id":{"$oid":"6329e2445e81be318ba81369"},"id":8.0,"name":"熊十","sex":"女","age":21.0,"address":{"province":"xian","city":"changan"}}
[root@master ~]#
#:也可以导出部分列:csv格式,不指定type默认是json格式;-f 表示的是字段;
[root@master ~]# mongoexport -d db1 -c student --type=csv -f id,name,age -o student.dat
2022-09-15T13:50:49.461+0800 connected to: mongodb://localhost/
2022-09-15T13:50:49.468+0800 exported 7 records
[root@master ~]# cat student.dat
id,name,age
1,张三,18
2,李四,19
3,王五,19
4,赵六,21
6,孙八,21
7,侯九,20
8,熊十,21
[root@master ~]#
#:更详细的用法可以 mongoexport --help来查看;
3.数据导入
mongoimport:
导入
JSON
数据:
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "sex" : "男", "age" : 18 }
{ "id" : 2, "name" : "李四", "sex" : "女", "age" : 19 }
{ "id" : 3, "name" : "王五", "sex" : "男", "age" : 19 }
{ "id" : 4, "name" : "赵六", "sex" : "男", "age" : 21 }
{ "id" : 6, "name" : "孙八", "sex" : "男", "age" : 21, "address" : { "province" : "Hebei", "city" : "tangshan" } }
{ "id" : 7, "name" : "侯九", "sex" : "男", "age" : 20, "address" : { "province" : "beijing", "city" : "gugong" } }
{ "id" : 8, "name" : "熊十", "sex" : "女", "age" : 21, "address" : { "province" : "xian", "city" : "changan" } }
myRS:PRIMARY> db.student.drop();
true
myRS:PRIMARY> db.student.find({},{_id:0})
myRS:PRIMARY>
[root@master ~]# mongoimport -d db1 -c student stu.dat
2022-09-15T14:00:35.655+0800 connected to: mongodb://localhost/
2022-09-15T14:00:35.680+0800 7 document(s) imported successfully. 0 document(s) failed to import.
[root@master ~]#
myRS:PRIMARY> use db1
switched to db db1
myRS:PRIMARY>
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "sex" : "男", "age" : 18 }
{ "id" : 2, "name" : "李四", "sex" : "女", "age" : 19 }
{ "id" : 3, "name" : "王五", "sex" : "男", "age" : 19 }
{ "id" : 4, "name" : "赵六", "sex" : "男", "age" : 21 }
{ "id" : 6, "name" : "孙八", "sex" : "男", "age" : 21, "address" : { "province" : "Hebei", "city" : "tangshan" } }
{ "id" : 7, "name" : "侯九", "sex" : "男", "age" : 20, "address" : { "province" : "beijing", "city" : "gugong" } }
{ "id" : 8, "name" : "熊十", "sex" : "女", "age" : 21, "address" : { "province" : "xian", "city" : "changan" } }
myRS:PRIMARY>
导入csv格式数据:?只能导入部分数据;
????????-type 指明要导入的文件格式
????????-headerline 批明不导入第一行,因为第一行是列名
????????-file 指明要导入的文件路径
myRS:PRIMARY> db.student.drop();
true
myRS:PRIMARY> exit
bye
[root@master ~]# mongoimport -d db1 -c student --type=csv --headerline --file student.dat
2022-09-15T14:05:20.853+0800 connected to: mongodb://localhost/
2022-09-15T14:05:20.867+0800 7 document(s) imported successfully. 0 document(s) failed to import.
[root@master ~]# mongo
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "age" : 18 }
{ "id" : 2, "name" : "李四", "age" : 19 }
{ "id" : 3, "name" : "王五", "age" : 19 }
{ "id" : 4, "name" : "赵六", "age" : 21 }
{ "id" : 6, "name" : "孙八", "age" : 21 }
{ "id" : 7, "name" : "侯九", "age" : 20 }
{ "id" : 8, "name" : "熊十", "age" : 21 }
myRS:PRIMARY>
?4.数据备份
逻辑备份
mongodump:
????????可以用 mongodump
来做
MongoDB
的库或表级别的备份,例如
备份db1
数据库;
[root@master ~]# mongodump -d db1
2022-09-15T14:14:49.682+0800 writing db1.student to dump/db1/student.bson
2022-09-15T14:14:49.693+0800 writing db1.score to dump/db1/score.bson
2022-09-15T14:14:49.697+0800 done dumping db1.score (0 documents)
2022-09-15T14:14:49.697+0800 done dumping db1.student (7 documents)
// 此时会在当前目录下创建一个 dump 目录,用于存放备份出来的文件
[root@master ~]# ls
anaconda-ks.cfg mha4mysql-node-0.58-0.el7.centos.noarch.rpm redis-6.2.7.tar.gz student.dat
dump mysql80-community-release-el7-5.noarch.rpm stu.dat
[root@master ~]# cd dump/
[root@master dump]# ls
db1
[root@master dump]# cd db1/
[root@master db1]# ls
score.bson score.metadata.json student.bson student.metadata.json
[root@master db1]# cat student.
student.bson student.metadata.json
[root@master db1]#
其他参数:
????????-h:
MongoDB
所在服务器地址,如
127.0.0.1;
也可以指定端口号:
127.0.0.1:27017
????????--port:端口号。
????????-d: 需要备份的数据库实例,例如,
test
。
????????-c: 需要备份的集合 。
????????-o: 备份数据的存放位置 。
????????-u: 用户名 。
????????-P: 密码。
????????--gzip: 压缩 。
????????--oplog: point in time 恢复用,只支持全库备份 。
????????--authenticationDatabase: 认证库 。
????????--dumpDbUsersAndRoles dump 用户和角色 ,只有在单库备份时才需要这么做。
????????--archive=dbname.gz: 3.2 版本新增,不能和
-o
同时使用 。
归档备份为
l
个文件,但不能和
-o
同时使用。
备份表:
[root@master ~]# mongodump -d db1 -c student -o mon_dump
2022-09-15T14:20:23.379+0800 writing db1.student to mon_dump/db1/student.bson
2022-09-15T14:20:23.379+0800 done dumping db1.student (7 documents)
[root@master ~]# ls
anaconda-ks.cfg mon_dump redis-6.2.7.tar.gz student.dat
mha4mysql-node-0.58-0.el7.centos.noarch.rpm mysql80-community-release-el7-5.noarch.rpm stu.dat
[root@master ~]# cd mon_dump/
[root@master mon_dump]# ls
db1
[root@master mon_dump]# cd db1/
[root@master db1]# ls
student.bson student.metadata.json
[root@master db1]#
全库备份:
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -o /home/mongod/backup/full
备份test库
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/
备份test库下的vast集合
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/
压缩备份库
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/ --gzip
压缩备份单表
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/ --gzip
5.数据恢复
mongorestore
与
mongoimport
参数类似:
全库备份中恢复单库(基于之前的全库备份)
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/full/test/
恢复test库
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/backup/test/
恢复test库下的vast集合
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast /home/mongod/backup/test/vast.bson
--drop参数实践恢复
# 恢复单库 mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/test/
# 恢复单表 mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast --drop /home/mongod/backup/test/vast.bson
mongoexport/mongoimport
与
mongodump/mongorestore
的对比:
1. mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导
出的是BSON格式。
2. JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。
3. 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用
mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行
跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分
时候是的)。
4. JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信
息。使用时应该注意。
6.MongoDB监控
为什么要监控?
????????监控及时获得应用的运行状态信息,在问题出现时及时发现。
监控什么?
????????CPU、内存、磁盘
I/O
、应用程序(
MongoDB
)、进程监控(
ps -aux
)、错误日志监控;
(1):MongoDB集群监控方式:
db.serverStatus()
查看实例运行状态(内存使用、锁、用户连接等信息)
通过比对前后快照进行性能分析
"connections" # 当前连接到本机处于活动状态的连接数
"activeClients" # 连接到当前实例处于活动状态的客户端数量
"locks" # 锁相关参数
"opcounters" # 启动之后的参数
"opcountersRepl" # 复制想关
"storageEngine" # 查看数据库的存储引擎
"mem" # 内存相关
(2):状态
db.stats()
"db" : "test" ,表示当前是针对"test"这个数据库的描述。想要查看其他数据库,可以先运行$ use databasename(e.g $use admiin).
"collections" : 3,表示当前数据库有多少个collections.可以通过运行show collections查看 当前数据库具体有哪些collection.
"objects" : 13,表示当前数据库所有collection总共有多少行数据。显示的数据是一个估计值,并不 是非常精确。
"avgObjSize" : 36,表示每行数据是大小,也是估计值,单位是bytes
"dataSize" : 468,表示当前数据库所有数据的总大小,不是指占有磁盘大小。单位是bytes
"storageSize" : 13312,表示当前数据库占有磁盘大小,单位是bytes,因为mongodb有预分配空间机 制,为了防止当有大量数据插入时对磁盘的压力,因此会事先多分配磁盘空间。
"numExtents" : 3,似乎没有什么真实意义。我弄明白之后再详细补充说明。
"indexes" : 1 ,表示system.indexes表数据行数。
"indexSize" : 8192,表示索引占有磁盘大小。单位是bytes
"fileSize" : 201326592,表示当前数据库预分配的文件大小,例如test.0,test.1,不包括 test.ns。
(3):mongostat:
????????实时数据库状态,读写、加锁、索引命中、缺页中断、读写等待队列等情况。
?
????????每秒刷新一次状态值,并能提供良好的可读性,通过这些参数可以观察到MongoDB
系统整体性能情况。
[root@master ~]# mongostat -h 192.168.188.128 --port 27017
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn set repl time
*0 *0 *0 *0 2 8|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 7.06k 56.6k 17 myRS PRI Sep 15 14:50:53.361
*0 *0 *0 *0 0 0|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 262b 49.9k 17 myRS PRI Sep 15 14:50:54.364
*0 *0 *0 *0 0 3|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 867b 51.5k 17 myRS PRI Sep 15 14:50:55.363
*0 *0 *0 *0 0 3|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 717b 51.9k 17 myRS PRI Sep 15 14:50:56.365
*0 *0 *0 *0 0 2|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 855b 50.7k 17 myRS PRI Sep 15 14:50:57.378
*0 *0 *0 *0 1 4|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 2.66k 52.3k 17 myRS PRI Sep 15 14:50:58.369
*0 *0 *0 *0 0 3|0 0.3% 0.4% 0 1.81G 87.0M 0|0 1|0 870b 51.6k 17 myRS PRI Sep 15 14:50:59.365
^C2022-09-15T14:51:00.146+0800 signal 'interrupt' received; forcefully terminating
[root@master ~]#
insert 每秒插入量
query 每秒查询量
update 每秒更新量
delete 每秒删除量
conn 当前连接数
qr|qw 客户端查询排队长度(读|写)最好为0,如果有堆积,数据库处理慢。
ar|aw 活跃客户端数量(读|写)
time 当前时间
(4):mongotop命令:
[root@master ~]# mongotop -h 192.168.188.128
2022-09-15T15:03:44.458+0800 connected to: mongodb://192.168.188.128/
ns total read write 2022-09-15T15:03:45+08:00
admin.$cmd.aggregate 0ms 0ms 0ms
admin.system.keys 0ms 0ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.users 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.image_collection 0ms 0ms 0ms
config.settings 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
db1.score 0ms 0ms 0ms
ns total read write 2022-09-15T15:03:46+08:00
admin.$cmd.aggregate 0ms 0ms 0ms
admin.system.keys 0ms 0ms 0ms
admin.system.roles 0ms 0ms 0ms
admin.system.users 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
config.image_collection 0ms 0ms 0ms
config.settings 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
db1.score 0ms 0ms 0ms
^C2022-09-15T15:03:47.148+0800 signal 'interrupt' received; forcefully terminating
[root@master ~]#
ns:数据库命名空间,后者结合了数据库名称和集合。
total:mongod在这个命令空间上花费的总时间。
read:在这个命令空间上mongod执行读操作花费的时间。
write:在这个命名空间上mongod进行写操作花费的时间。
(5):db级别的命令
db.currentOp()
查看数据库当前执行什么操作。
用于查看长时间运行进程。
通过(执行时长、操作、锁、等待锁时长)等条件过滤。
如果发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他:> db.killOp(608605)
db.setProfilingLevel()
设置server级别慢日志
打开profiling:
0:不保存
1:保存慢查询日志
2:保存所有查询日志
注意:级别是对应当前的数据库,而阈值是全局的。
查看profiling状态
查看慢查询:system.profile
关闭profiling
7.MongoDB应用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
MongoDB 应用案例
Craiglist上使用MongoDB的存档数十亿条记录。
FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。 sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。
|