文章目录

  • 第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 身份验证

  • adminlocal 是两个特殊的数据库,它们中的用户可对任何数据库进行操作(可被看作超级用户)
  • 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 有以下可选参数

  1. unique:boolean,创建唯一索引,以便在索引键值与索引中的现有值匹配的情况下,集合将不接受文档的插入或更新
  2. name:string,未指定则串联索引字段的名称和排序顺序
  3. partialFilterExpression:document,指定索引仅引用与过滤器表达式匹配的文档
  4. sparse:boolean,默认值为false,指定为稀疏索引
  5. expireAfterSeconds:integer,以秒为单位,控制MongoDB在这个集合中保留文档的时间,仅适用于TTL索引
  6. 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,忽略一些检查,以便进行更快但不太彻底的检查