转载

MongoDB 数据库管理(不定时更新)

之前的几篇文章大致说了副本集的搭建、副本集的管理,现在说下MongoDB数据库的管理。

一:查看服务器状态: db.serverStatus()

zjy:PRIMARY> db.serverStatus() {  "host" : "zhoujinyi",  "version" : "3.0.4",  "process" : "mongod",  "pid" : NumberLong(3939),  "uptime" : 149427,  "uptimeMillis" : NumberLong(149427393),  "uptimeEstimate" : 140539,  "localTime" : ISODate("2015-07-01T14:06:12.922Z"),  "asserts" : {   "regular" : 0,   "warning" : 0,   "msg" : 0,   "user" : 30,   "rollovers" : 0  },  "backgroundFlushing" : {   "flushes" : 2490,   "total_ms" : 10410,   "average_ms" : 4.180722891566265,   "last_ms" : 10,   "last_finished" : ISODate("2015-07-01T14:05:47.284Z")  },  "connections" : {   "current" : 7,   "available" : 43,   "totalCreated" : NumberLong(10016)  }, ... ...  "network" : {   "bytesIn" : 23165291,   "bytesOut" : 25295567,   "numRequests" : 209093  },  "opcounters" : {   "insert" : 9,   "query" : 53,   "update" : 9,   "delete" : 0,   "getmore" : 59219,   "command" : 149822  },  "opcountersRepl" : {   "insert" : 0,   "query" : 0,   "update" : 0,   "delete" : 0,   "getmore" : 0,   "command" : 0  },  "repl" : {   "setName" : "zjy",   "setVersion" : 31303,   "ismaster" : true,   "secondary" : false,   "hosts" : [    "127.0.0.1:27017",    "127.0.0.1:27018",    "127.0.0.1:27019"   ],   "primary" : "127.0.0.1:27017",   "me" : "127.0.0.1:27017",   "electionId" : ObjectId("5592be327c7062c30c3bff24"),   "rbid" : 652411007  },  "storageEngine" : {   "name" : "mmapv1"  },  "writeBacksQueued" : false,  "mem" : {   "bits" : 64,   "resident" : 130,   "virtual" : 9710,   "supported" : true,   "mapped" : 4574,   "mappedWithJournal" : 9148  }, ... ...  "ok" : 1 } 

通过上面看到MongoDB的版本、后台刷写情况、副本集情况、操作数量情况、进出网络情况、连接数情况和内存情况。

其中内存相关字段的含义是:单位是M

mapped:映射到内存的数据大小

visze:占用的虚拟内存大小

res:实际使用的内存大小

在上面的结果中,virtual是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则virtual和mapped大致相当。

也可以通过mongostat来查看:

root@zhoujinyi:~# mongostat insert query update delete getmore command flushes mapped vsize    res faults qr|qw ar|aw netIn netOut conn set repl     time     *0    *0     *0     *0       1     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  262b    11k    7 zjy  PRI 10:23:13     *0    *0     *0     *0       0     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  215b    11k    7 zjy  PRI 10:23:14     *0    *0     *0     *0       0     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  215b    11k    7 zjy  PRI 10:23:15

二:查看数据库/表状态:db.stats()/db.coll.stats()

zjy:PRIMARY> db.stats() {  "db" : "test",  "collections" : 7,  "objects" : 36,  "avgObjSize" : 417.1111111111111,  "dataSize" : 15016,   #数据文件大小。  "storageSize" : 1093632, #存储空间大小:datasize+集合两端预留的未使用空间。  "numExtents" : 7,  "indexes" : 4,  "indexSize" : 32704,  "fileSize" : 67108864, #物理文件大小:包括预分配  "nsSizeMB" : 16,  "extentFreeList" : {   "num" : 0,   "totalSize" : 0  },  "dataFileVersion" : {   "major" : 4,   "minor" : 22  },  "ok" : 1 } 

通过上面看到数据库的名称,集合(表)数量,索引数量、大小,数据文件大小,存储空间大小和物理文件大小。

三,查看当前Query执行情况: db.currentOP():

zjy:PRIMARY> db.currentOP() {  "inprog" : [   {    "desc" : "conn4732",   #可与日志信息联系起来    "threadId" : "0x33903c0",    "connectionId" : 4732, #连接ID    "opid" : 221672,    #操作标识,可以用这个ID来终止该操作:db.killOP(opid)    "active" : true,    #表示线程是否在运行    "secs_running" : 4, #执行的时间    "microsecs_running" : NumberLong(4999899),    "op" : "getmore",   #操作类型:插入、删除、更新、查询    "ns" : "local.oplog.rs", #操作的集合    "query" : {     "ts" : {      "$gte" : Timestamp(1435674461, 1)     }    },    "client" : "127.0.0.1:52101",     "numYields" : 0, #表示该操作交出锁,而使其他操作得以运行。    "locks" : {   #锁信息    },    "waitingForLock" : false,    "lockStats" : {     "Global" : {      "acquireCount" : {       "r" : NumberLong(10)      }     },     "MMAPV1Journal" : {      "acquireCount" : {       "r" : NumberLong(5)      }     },     "Database" : {      "acquireCount" : {       "r" : NumberLong(5)      }     },     "oplog" : {      "acquireCount" : {       "R" : NumberLong(5)      }     }    }   }
...
...

通过上面看到当前执行的进程,类似MySQL的show processlist。可以添加过滤条件:

zjy:PRIMARY> db.currentOP({"ns":"test"})

四:监控MongoDB各个状态:mongotop、mongostat

root@zhoujinyi:~# mongotop     #查看那个几个最繁忙                      ns    total    read    write    2015-07-01T11:24:43-04:00                     abc      0ms     0ms      0ms                                              abc.AOE      0ms     0ms      0ms                                              abc.aoe      0ms     0ms      0ms                                   abc.system.indexes      0ms     0ms      0ms                                        abc.system.js      0ms     0ms      0ms                                abc.system.namespaces      0ms     0ms      0ms                                             abc.test      0ms     0ms      0ms                                 admin.system.indexes      0ms     0ms      0ms                              admin.system.namespaces      0ms     0ms      0ms                                   admin.system.roles   
root@zhoujinyi:~# mongostat insert query update delete getmore command flushes mapped vsize    res faults qr|qw ar|aw netIn netOut conn set repl     time     *0    *0     *0     *0       0     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  215b    11k    7 zjy  PRI 11:26:21     *0    *0     *0     *0       0     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  215b    11k    7 zjy  PRI 11:26:22     *0    *0     *0     *0       0     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  215b    11k    7 zjy  PRI 11:26:23     *0    *0     *0     *0       1     2|0       0   4.5G  9.5G 133.0M      0   0|0   0|0  262b    11k    7 zjy  PRI 11:26:24

上面insert、query、update、delete、getmore、command 每种对应操作的发生次数。

flushes:表示刷写到磁盘的次数。 mapped:表示映射到内存的数量,约等于数据目录大小。 vsize:表示正在使用的虚拟内存大小,通常为数据目录的2倍。(一次用于映射,一次用于日志系统) res:表示正在使用的内存大小。 qr|qw:表示读写操作队列大小,即有多少读写操作被阻塞,等待进行处理。 ar|aw:表示活动客户端的数量,即正在进行读写操作的客户端。 netId:表示通过网络传输进来的字节数。 netou:t表示通过网络传输出的字节数。 Conn:表示服务器打开的连接数。 time:表示统计的时间。

五:日志分割, db.adminCommand({"logRotate":1})

zjy:PRIMARY> db.adminCommand({"logRotate":1}) { "ok" : 1 }

类似MySQL的flush log。

六:

正文到此结束
Loading...