了解数据库运行状态
当前正在运行的操作
本文的实验平台是win7,mongodb的版本是3.4
use admin;
db.auth("user","password");
db.currentOP();
{
"inprog" : [
{
"desc" : "conn2453",
"threadId" : "8328",
"connectionId" : 2453,
"client" : "192.168.0.65:7928",
"appName" : "MongoDB Shell",
"clientMetadata" : {
"application" : {
"name" : "MongoDB Shell"
},
"driver" : {
"name" : "MongoDB Internal Client",
"version" : "3.4.0"
},
"os" : {
"type" : "Windows",
"name" : "Microsoft Windows 7",
"architecture" : "x86_64",
"version" : "6.1 SP1 (build 7601)"
}
},
"active" : true,//标识该操作是否正在运行
"opid" : 3389681, //操作的唯一标识符,kill操作参考的值
"secs_running" : 0,
"microsecs_running" : NumberLong(42),
"op" : "command", //标识操作的类型
"ns" : "admin.$cmd",
"query" : {
"currentOp" : 1
},
"numYields" : 0,
"locks" : {
},
"waitingForLock" : false,//是否在等待锁而进入堵塞状态
"lockStats" : {
}
},
{
"desc" : "WT RecordStoreThread: local.oplog.rs",
"threadId" : "3140",
"active" : true,
"opid" : 2,
"secs_running" : 1559698,
"microsecs_running" : NumberLong("1559698077772"),
"op" : "none",
"ns" : "local.oplog.rs",
"query" : {
},
"numYields" : 0,
"locks" : {
},
"waitingForLock" : false,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(1),
"w" : NumberLong(1)
},
"acquireWaitCount" : {
"w" : NumberLong(1)
},
"timeAcquiringMicros" : {
"w" : NumberLong(65827)
}
},
"Database" : {
"acquireCount" : {
"w" : NumberLong(1)
}
},
"oplog" : {
"acquireCount" : {
"w" : NumberLong(1)
}
}
}
}
],
"ok" : 1
}
db.currentOP({“ns”:"prod.user"});//还可以有筛选条件,这个一位着只记录user集合上的操作
关闭有问题的操作
db.killOp(xxx);//xxx代表opid
统计集合的信息
db.HT_EMR_IN_PRO_CONS.stats();
{
"ns" : "HTCDR.HT_EMR_IN_PRO_CONS",
"size" : 4962, //文档的大小
"count" : 7,
"avgObjSize" : 708,
"storageSize" : 36864,
"capped" : false, //不是容量有限的集合
"nindexes" : 1,//集合中索引的数量
"totalIndexSize" : 36864, //索引的大小
"indexSizes" : {
"_id_" : 36864
},
"ok" : 1.0
}
- 需要强调的是所有文档的大小并不是集合的大小,集合的大小除了包括文档的大小,还包括文档间隔 和 索引信息,storageSize这个字段甚至还包括集合两端预留的未使用空间,以便新增文档能快速插入
统计数据库信息
db.stats();
{
"db" : "HTCDR",
"collections" : 192,
"views" : 0,
"objects" : 9266202,
"avgObjSize" : 452.446976226074,
"dataSize" :4192465076.0,
"storageSize" : 1138597888.0, //实际上的库占有磁盘大小,经过压缩
"numExtents" : 0,
"indexes" : 252,
"indexSize" : 339189760.0,
"ok" : 1.0
}
关于dataSize 和 storageSize的区别:
storageSize指标等于数据库中所有数据扩展区的大小。 如果没有压缩,则此数字大于dataSize,
因为它包含尚未使用的空间和由范围内已删除或移动的文档腾出的空间。
但是,在使用WiredTiger存储引擎时,数据会在磁盘上压缩,因此比dataSize小。
我们经常还会被要求知道 mongodb的占用空间 ,通常直接 查看mongdb 的data目录(这个目录其实包含了dataSize + indexSize + data file预分配空间(不会超过2GB) + oplog + journal)所有东西之和
整理数据库的使用空间
compact 命令
对集合中的所有数据和索引进行重写和碎片整理 ,但是根据官网文档,具体的效用还取决于mongodb的底层引擎,考虑到Mongdb的 3.x版本现在是主流,我们以WiredTiger为主要参考。compact尝试减少集合中数据和索引所需的存储空间,从而向操作系统释放不需要的磁盘空间。 此操作的有效性取决于工作负载,可能不会恢复磁盘空间。
compact可能需要额外的磁盘空间才能在WiredTiger数据库上运行。
use yourdatabase;
db.runCommand({ compact : 'yourCollection' });
repair命令
通过丢无效或损坏的数据老重建数据库和索引。类似于文件系统修复命令fsck。
所以此命令主要是用于修复数据(貌似看网上不太推荐用这个命令来回收空间!)
use yourdatabase;
db.repairDatabase();