文章目录
- 第17章 了解应用的动态
- 1 了解正在进行的操作
- 2 使用系统分析器
- 3 计算空间消耗
- 第18章 数据管理
- 1 身份验证
- 2 建立和删除索引
- 3 预热数据
- 4 压缩数据
- 5 移动集合
- 第19章 持久性
- 1 日志系统
- 2 MongoDB 无法保证的事项
- 3 检验数据损坏
第17章 了解应用的动态
1 了解正在进行的操作
- 查看正在进行的操作:
db.currentOp( )
db.currentOp( )
可以添加过滤条件,可对任何字段进行查询- 输出信息包含一些重要字段
- opid:操作的唯一标识符,可用来终止一个操作
- active:布尔值,表示操作是否正在进行
- secs_running:操作已执行时间
- op:操作类型,增删改差
- desc:该值可与日志信息联系起来
- locks:使用锁类型
- waitingForLock:是否在等待其它操作交出锁而处于阻塞状态
- numYeilds:该操作交出锁使其它操作得以运行的次数
- 终止操作的执行
db.killOp(opid)
- 只有交出锁的进程才能被终止
2 使用系统分析器
- 默认情况,系统分析器是关闭的
- 开启级别为n的系统分析器:
db.setProfilingLevel(n[, ms])
- n为2,记录所有内容
- n为1,只记录耗时过长(默认超过100ms)的操作
- 第二个参数可以指定耗时过长的时长标准
- n为0时可关闭分析器
- 可通过
dbgetProfilingLevel( )
查看分析级别
3 计算空间消耗
- 文档:
Object.bsonsize( document)
函数返回文档所占用的空间大小(字节数目) - 集合:
db.collection.stats()
函数返回集合的相关信息
ns
:命名空间count
:集合中文档数目size
:集合中所有文档所占字节数avgObjSize
:文档平均大小storageSize
:集合总大小,包括文档间隔和索引信息以及集合两端预留的未使用空间nindexes
:集合中索引的数量
- 数据库:
db.stats()
返回数据库的相关信息
> db.stats()
{
"db" : "test", // 数据库名称
"collections" : 4, // 集合数
"views" : 0, // 视图数
"objects" : 101001, // 所有集合包含的文档总数
"avgObjSize" : 86.7298541598598, // 文档平均大小(字节)
"dataSize" : 8759802,// 数据库中保存的未压缩数据的总大小
"storageSize" : 2678784, // 数据库中分配给集合用于文档存储的空间总量(删除或收缩文档该值不变,不包含索引大小)
"numExtents" : 0,
"indexes" : 7, // 索引总数
"indexSize" : 3342336, // 所有索引的大小
"scaleFactor" : 1, // 比例因子
"fsUsedSize" : 161089204224, // ongoDB存储数据的文件系统上正在使用的磁盘空间总大小
"fsTotalSize" : 254050406400, // MongoDB存储数据的文件系统上所有磁盘容量的总大小
"ok" : 1
}
第18章 数据管理
1 身份验证
-
admin
和local
是两个特殊的数据库,它们中的用户可对任何数据库进行操作(可被看作超级用户) - admin用户可以对任何数据库进行读写操作,能执行一些命令,如:listDatanases 和 shutdown
- 不能在本地数据库上创建用户
- db.createUser(userDocument):为数据库创建新用户
- userDocument 形式
{
user: "<name>", // 新用户名
pwd: passwordPrompt(), // 提示输入密码或自定义纯文本密码
customData: { <any information> }, // 可选,存储任何与用户相关的数据
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
], // 数组,授予用户的角色。 可以指定一个空数组[]来创建没有角色的用户
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
], // 可选,数组,服务器对创建的用户强制执行的身份验证限制
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ], // 可选,数组,指定创建非用户凭据的特定的(SCRAM)机制
passwordDigestor: "<server(default)|client>" // 可选,字符串,指示是服务器还是客户端解析密码
}
db.changeUserPassword("accountUser", passwordPrompt())
:更新用户密码db.dropUser(username)
:删除数据库用户db.auth( <username>, <password> | passwordPrompt() )
:允许用户从外壳程序内对数据库进行身份验证- 在连接mongo shell时,您可以使用mongo shell的命令行选项指定身份验证凭据:
mongo --username “myTestDBUser” --password --authenticationDatabase test --authenticationMechanism SCRAM-SHA-256
2 建立和删除索引
- 在独立服务器上建立索引:
db.collection.createIndex(keys, options)
或db.collection.createIndexes([keyPatterns, ]options)
options 有以下可选参数
- unique:boolean,创建唯一索引,以便在索引键值与索引中的现有值匹配的情况下,集合将不接受文档的插入或更新
- name:string,未指定则串联索引字段的名称和排序顺序
- partialFilterExpression:document,指定索引仅引用与过滤器表达式匹配的文档
- sparse:boolean,默认值为false,指定为稀疏索引
- expireAfterSeconds:integer,以秒为单位,控制MongoDB在这个集合中保留文档的时间,仅适用于TTL索引
- storageEngine:document,允许用户在创建索引时基于每个索引配置存储引擎
- 在副本集上建立索引
- 关闭一个备份节点,将其作为独立的节点启动
- 在该服务器建立索引,从新加入副本集
- 对每个备份节点执行相同操作
- 主节点中建立索引
- 关闭主节点,执行前四步骤
- 在分片集群上建立索引
- 步骤同在副本集上建立索引,需要在每个分片上分别建立
- 删除索引
db.collection.dropIndex([index])
:不能删除 _ id 字段的默认索引db.collection.dropIndexes( [idx1, idx2, ...] )
:删除所有或指定非_id索引
- 注意内存溢出
3 预热数据
- 重启机器或启动新的机器,会耗费一段时间来将所需数据从磁盘载入内存
- 有几种方式可在服务器上线前将数据载入内存:
- 将数据库移至内存:使用 Unix 的 dd 工具,在启动mongod前载入数据文件
- 将集合移至内存
- 自定义预热
4 压缩数据
5 移动集合
db.collection.renameCollection(target[, dropTarget])
- 重命名集合
- 无法在数据库之间移动集合
- 不适用于分片集合和视图
- 要在数据库间移动集合,必须进行转储和恢复操作或手动复集合中的文档插入到新的数据库
- 预分配数据文件
第19章 持久性
1 日志系统
- 参考WiredTiger Storage Engine 和 Journaling
2 MongoDB 无法保证的事项
- 持久性是指操作被提交后可持久不存在数据库中的保证
- 硬件或文件系统发生故障时,MongoDB 无法保证操作的持久性
3 检验数据损坏
db.collection.validate(<option>)
:验证集合,该方法扫描集合数据和索引以获取正确性并返回结果option
:可选,默认false
db.myCollection.validate( )
db.myCollection.validate( true )
db.myCollection.validate( { full: true } )
- true,执行更彻底的检查
- false,忽略一些检查,以便进行更快但不太彻底的检查