Mongodb 维护

1.查看服务器线程运行状态

db.currentOp():查看mongodb当前各个线程的状态,相当于mysql中的show full  processlist,当服务器运行很慢的时候,可以首先执行下这个命令,可以看下服务器当前的状态,如果发现有异常的线程,可以直接使用db.killOp()将线程干掉,虽然这种比较暴力但不失为临时解决问题的一种绝好方法。

以下是db.currentOp()字段名的解释;

{

"opid" : 789193,  #  此操作id

"active" : true,   # 状态(running/sleep)

"secs_running" : 3,  #操作运行的时间,在active=false时不显示

"op" : "getmore", #操作行为(insert/update/remove)

"ns" : "local.oplog.rs",  # 集合名称

"query" : {     # 具体的操作语句

},

"client" : "10.0.26.90:55312",  #连接db的客户端ip

"desc" : "conn34681",   #数据库连接描述

"threadId" : "0x7f24b8793700", # 线程id

"connectionId" : 34681,  # 数据库连接id

"waitingForLock" : false, # 是否正在等待锁

"numYields" : 0,  # 查询暂停的次数

"lockStats" : {  # 锁的状态

"timeLockedMicros" : {  # 持有锁的时间(ms)

"r" : NumberLong(81),

"w" : NumberLong(0)

},

"timeAcquiringMicros" : {  #等待锁的时间(ms)

"r" : NumberLong(8),

"w" : NumberLong(0)

}

}

}

当发现secs_running这个字段的值较大并且严重阻塞了系统其它线程运行的时候可以先把使用db.killOp(opid)将其kill掉,然后针对这个链接执行的query进行优化。

在一个正在运行的mongodb服务器内部是有很多链接,直接执行db.currentOp()会将所有链接的信息都打印出来,这不便于找出有问题的链接,所以必须都db.currentOp()输出的信息做处理.

以下是一些信息处理脚本

找出运行时间超过200ms的链接信息

db.currentOp(true).inprog.forEach(function(doc){if(doc.active==true &&doc.secs_running>200 ){printjson(doc)}})

如果只需要打出这些链接的某个字段可以直接用print

db.currentOp(true).inprog.forEach(function(doc){if(doc.active==true &&doc.secs_running>200 ){printjson(doc.opid)}})

2.查看对象大小

查看文档大小: Object.bsonsize(db.users.findOne())

注意这里只能查看单个文档文档大小,无法查看多个文档大小累计和

rs0:PRIMARY> Object.bsonsize(db.traderecords.find().limit(1))

493

rs0:PRIMARY> Object.bsonsize({id:"邓旺dwchaoyue"})

29

查看集合的信息db.collection.stats()

rs0:PRIMARY> db.users.stats()

{

"ns" : "gow.users",

"count" : 3561,

"size" : 854640,

"avgObjSize" : 240,

"storageSize" : 2793472,

"numExtents" : 5,

"nindexes" : 2,

"lastExtentSize" : 2097152,

"paddingFactor" : 1,

"systemFlags" : 1,

"userFlags" : 1,

"totalIndexSize" : 310688,

"indexSizes" : {

"_id_" : 122640,

"name_1" : 188048

},

"ok" : 1

}

"ns"      #集合名称

"count"   # 文档总数

"size"    # 集合中数据占用空间大小,不包括索引,单位为字节

该发小和db.collection.dataSize()得到的大小一样。

"avgObjSize" # 平均对像占用的空间大小

"storageSize"#给整个集合分配的存储空间,当删除集合中的文档时,这个值不会降代。

"numExtents" # 连续分配的数据块

"nindexes" #索引个数,每个集合至少有一个 _id 索引。

"lastExtentSize" # 最近分配的块的大小

"paddingFactor"

"systemFlags"

"userFlags"

"totalIndexSize" # 所有索引大小总和

"indexSizes":#列出集合的所有字段

查看数据库的信息:db.stats()

rs0:PRIMARY> db.stats()

{

"db" : "gow",   # db名称

"collections" : 23,  # 集合个数

"objects" : 569152, # 文档总数

"avgObjSize" : 935.8604801529293, #文档的平均大小

"dataSize" : 532646864,   # 所有数据的总大小

"storageSize" : 652820480,  # db占用的磁盘空间大小

"numExtents" : 92,     # 连续分配的数据块

"indexes" : 34,       # 索引个数

"indexSize" : 62832560,  # 索引大小

"fileSize" : 1006632960,  #预分配给数据库的文件大小

"nsSizeMB" : 16,

"dataFileVersion" : {

"major" : 4,

"minor" : 5

},

"extentFreeList" : {

"num" : 8,

"totalSize" : 22142976

},

"ok" : 1

}

3.数据预热

Mongodb访问磁盘中的数据要比访问内存中的数据慢得多,而且mongodb的内存是依靠

操作自身管理的,不想mysql中中的innodb,存储引擎,还需要管理自己的内存调配.

因此事先将磁盘中的数据加载到内存中可以大大提高mongodb的性能。

1.将数据库/数据目录移至内存:

for file in /data/db/brains.*

do

dd if=$file of=/dev/null

done

当要加载的数据大于内存大小的,之前加载的数据可能会挤兑出内存,所以有的时候将整个数据目录加载到数据库中意义并不是很大,

如果出现这个情况可以只将访问比较频繁的集合加载到内存中

db.runCommand({touch:"traderecords",data:true,index:true})

rs0:PRIMARY> db.runCommand({touch:"traderecords",data:true,index:true})

{

"data" : {

"numRanges" : 3,

"millis" : 91

},

"indexes" : {

"num" : 1,

"numRanges" : 1,

"millis" : 182

},

"ok" : 1

}

集合加载成功。

4.压缩数据:db.runCommand(compact:"collectionName",paddingFactor:1.5)

不会减少mongomongodb占用的空间大小,但可以使mongo不再需要分配新的空间

如果要收回压缩后的空间可以运行修复语句

db.repairDatabase()

5日志切换:db.adminCommand({"logRotate":1})

当mongodb运行一段时间后,log文件会变得很大,操作一个日志文件是相当痛苦的,为了避免大日子文件的产生,可以在低峰时段运行每天运行一次db.adminCommand({"logRotate":1}),

使其自动切换日志文件。每天生成一个日志文件。

转载于:https://blog.51cto.com/dwchaoyue/1622321

mongodb 日常维护相关推荐

  1. MongoDB——MongoDB的日常维护

    MongoDB的日常维护和复制集 日常维护 备份与回复管理 导入导出 备份与恢复 克隆(克隆集合) 安全管理 监控 进程管理 授权启动 日常维护 MongoDB日常维护主要包括数据库的备份恢复.安全管 ...

  2. PHP系统管理mongodb,MongoDB的日常维护管理

    主要介绍了日常运行维护的管理工具 MongoDB的日常维护包括使用配置文件,设置访问控制,Shell交互,系统监控和管理,数据库日常备份和恢复 启动和停止MongoDB 启动后可以通过数据库的IP加端 ...

  3. MongoDB的日常维护管理

    主要介绍了日常运行维护的管理工具 MongoDB的日常维护包括使用配置文件,设置访问控制,Shell交互,系统监控和管理,数据库日常备份和恢复 启动和停止MongoDB 启动后可以通过数据库的IP加端 ...

  4. MySQL Cluster 日常维护

    在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...

  5. 邮件服务器 Postfix+ Cyrus-SASL+cyrus-IMAPD+日常维护

    一,安装Postfix postfix-2.6.5.tar.gz postfix-2.6.5-vda-ng.patch.gz 二,rpm包安装Cyrus-SASL+cyrus-IMAPD 三,Post ...

  6. AIX 操作系统日常维护须知

    AIX 操作系统日常维护须知目 录1. AIX 常用命令简介2. 文档编辑命令3. 如何查看系统出错信息4. 文件系统的操作5. 如何为系统做备份一.AIX 常用命令简介 1. 关机shutdown ...

  7. 企业网络推广专员浅析企业网络推广日常维护要做好

    每个企业网站在运营优化期间都需要做好网站日常维护工作,对于站长来说网站维护工作常常伴随着一些专业技术性较强的问题需要解决,如果企业客户仅仅想要从性价比上强调维护,选择费用低廉的维护公司没有任何价值可言 ...

  8. MQ日常维护操作手册

    假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...

  9. 物理Data Guard的日常维护

    2019独角兽企业重金招聘Python工程师标准>>> 物理Data Guard的日常维护 [日期:2017-01-17] 来源:Linux社区  作者:zydev [字体:大 中 ...

最新文章

  1. 用 Python 帮运营妹纸快速搞定 Excel 文档
  2. C语言——常见的字符串函数+内存操作函数的介绍及实现
  3. 【JDK】JDK源码分析-HashMap(1)
  4. bzoj1934: [Shoi2007]Vote 善意的投票(最小割)
  5. 1个超强的软件工具箱!100+个电脑必备工具,随意使用!盘姬
  6. Excel怎么快速制作二维码图片?
  7. 核磁共振设备工作过程人体温度监控中应用的光纤温度传感器
  8. Smbus host controller not enabled Assuming drive cache : write through
  9. 嵌入式学习的几种线路图
  10. Unity中镜像图片显示
  11. Introducing Swift(Swift介绍及其API)
  12. busybox的init
  13. 163邮箱自动化登录实现模块化【2】
  14. StatusBarUtil 状态栏工具类(实现沉浸式状态栏/变色状态栏)
  15. 现在的微博营销方案具备哪些特点呢?
  16. 南京工业互联网产业联盟成立
  17. 关于 基础连接已经关闭:接收时发生意外错误
  18. 【CSS练习】IT修真院--练习3-简单界面
  19. 风控建模三:变量筛选原则
  20. 天下武功,唯快不破 | OptiPlex 7070仅售3339元,戴尔小企业官网秒杀大战等你来参战!...

热门文章

  1. Android P2P语音通话实现(思路探讨)
  2. 在线JSON美化格式化工具
  3. 在线文本转2-36任意进制工具
  4. RabbitMQ学习总结(一)——基础概念详细介绍
  5. linux互传文件nc命令
  6. 网络基础四 DNS DHCP 路由 FTP
  7. 使用Dockerfile构建自己的etcd镜像
  8. Linux-rhel6.4 编译安装PHP,Nginx与php连接
  9. 测试-关于Unity获取子层级内容的几种接口(Transform FindChild, Component GetComponentInChildren,...)...
  10. [oracle 10g]命令行启动ORACLE服务及顺序