mongodb 日常维护

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}),

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

时间: 2024-10-25 23:39:36

mongodb 日常维护的相关文章

MongoDB之基本操作与日常维护

MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的数据库列表 show users 显示用户 use <db_name> 切换当前数据库 db.help() 显示数据库操作命令 show.collections 显示当前数据库中的集合 db.foo.help() 显示集合操作命令,foo是当前数据库下的集合 db.foo.find() 对当前数据

MongoDB日常保养

它引入了程序来进行维护管理工具 MongoDB的日常维护包含使用配置文件,设置訪问控制.Shell交互,系统监控和管理,数据库日常备份和恢复 启动和停止MongoDB 启动后能够通过数据库的IP加port号訪问Web形式数据库. 配置文件 通过使用拂去配置文件的方式启动数据库实例.在bin目录下创建并编辑mongodb.config(名字能够任意) 事例加上 dbpath =/data/db/ 启动时加上 --f 參数,而且指向配置文件就可以. 使用Daemon方式启动 为什么我们使用Daemo

MHA 日常维护命令集

MHA 日常维护命令集 1.查看ssh登陆是否成功 masterha_check_ssh --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf 2.查看复制是否建立好 masterha_check_repl --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf 3.启动mha noh

Nginx日常维护操作(3)

一.简明nginx常用命令 1. 启动 Nginx /sbin/nginx service nginx start 2. 停止 Nginx /sbin/nginx -s stop /sbin/nginx -s quit -s都是采用向 Nginx 发送信号的方式. 3. Nginx 重载配置 /sbin/nginx -s reload 上述是采用向 Nginx 发送信号的方式,或者使用service nginx reload 4. 指定配置文件 /sbin/nginx -c /usr/local

mha日常维护命令

mha日常维护命令 http://m.blog.chinaunix.net/uid-28437434-id-3959021.html?/13033.shtml 1.查看ssh登陆是否成功masterha_check_ssh --conf=/etc/masterha/app1.cnf 2.查看复制是否建立好masterha_check_repl --conf=/etc/masterha/app1.cnf 3.启动mhanohup masterha_manager --conf=/etc/maste

数据库日常维护-CheckList_01历史Agent Job执行情况检查

检查Agent Job中日常维护作业或业务作业是否成功,如每天的备份.碎片整理.索引维护.历史备份文件清除等,可利用SSMS工具,通过CDC下面设置好的DB Server List,运行下面脚本一次,便可以查询完成所有JOB历史运行情况. --SQL -- 参数定义 DECLARE @PreviousDate datetime DECLARE @Year VARCHAR(4) DECLARE @Month VARCHAR(2) DECLARE @MonthPre VARCHAR(2) DECLA

联想教育应用使用说明(7.6版本)——第3章 联想教育应用的日常维护与使用

第3章联想教育应用的日常维护与使用 注意: 1.建议机房管理员不要开放Windows的administrator权限给使用者,以避免使用者破坏联想服务分区. 2.建议机房管理员在计算机正常使用过程中,通过CMOS设置屏蔽硬盘以外的可启动设备,并设置BIOS密码,以免使用者破坏联想服务分区. 3.被保护分区的可用空间就是该分区的可用缓存区,请您确保有足够缓存区以保证软件的正常运行.硬盘保护驱动程序安装完成后,在Windows下将提供给您一个缓存区状态监控工具,您可以随时查看,必要时进行清理. 在图

第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护

本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/28904503第三篇--第二部分--第四文 配置SQL Server镜像--非域环境:http://blog.csdn.net/dba_huangzj/article/details/27652857 在搭建的过程中,可能你会遇到比较多的问题,下面介绍一些常见的问题及解决方案,另外把主要精力放到对

WAS日常维护中的重启时机——总结

本笔记会不断更新,用来记录一下在WAS日常维护中的重启时机问题. 在做WAS的维护过程中,生产环境要求最大可能的不要有中断,所以重启的时机其实是一个非常值得记住的东西,有的时候因为没有重启或者重启的java进程不正确而导致大量的时间浪费也是非常正常的.谨以此文记录一下我个人的经验总结: JDBC: 1)创建数据源.数据Provider的时候:一定需要重启! 如果创建的时候选择的scope是Cell,那就需要重启DMGR:如果scope是Node,那就需要重启对应的Nodeagent:如果scop