mongodb导数
 mongodump --host $IP:$PORT -u xxx -p xxx --numParallelCollections=8 --authenticationDatabase=admin --gzip --oplog -o $MONGO_DATA


1. directory
如果指定参数directoryperdb =yes,则会每个db一个目录。其中包含该db的所有数据文件
directoryPerDB: true

> show databases;
admin         0.000GB
local         0.009GB
test       0.000GB
> exit
bye
$ls
admin        test         local            mongod.lock  sizeStorer.wt    WiredTiger.basecfg  WiredTiger.lock

mongodb
文档 document/
集合 collection/
数据库 database

2.mongdb自带监控工具
>> mongostat --host 主机名:端口号 --username=xxx --password=xxxx --authenticationDatabase=admin
insert query update delete getmore command dirty  used flushes vsize  res qrw arw net_in net_out conn      set repl                time
    *0     3     *0     *0       0     3|0  0.0% 80.0%       0  262G 201G 0|0 0|0  3.12k   51.2k  125 test222  PRI Dec 26 19:50:53.200
    *0    34     *0     *0       0     3|0  0.0% 80.0%       0  262G 201G 0|0 1|0  28.5k   58.1k  125 test222  PRI Dec 26 19:50:54.200
    *0     8     *0     *0       0     1|0  0.0% 80.0%       0  262G 201G 0|0 0|0  7.30k   54.1k  125 test222  PRI Dec 26 19:50:55.202
    *0    16     *0     *0       2     7|0  0.0% 80.0%       0  262G 201G 0|0 0|0  15.1k   57.9k  125 test222  PRI Dec 26 19:50:56.199
    *0    26     *0     *0       0     1|0  0.0% 80.0%       0  262G 201G 0|0 0|0  19.8k   54.6k  125 test222  PRI Dec 26 19:50:57.199
    *0    30     *0     *0       0     2|0  0.0% 80.0%       1  262G 201G 0|0 0|0  24.4k   57.4k  125 test222  PRI Dec 26 19:50:58.199


$ mongotop --host 主机名:端口号 -u=xxx -p=xxx --authenticationDatabase=admin
2017-12-26T19:53:12.912+0800    connected to: 主机名:端口号

                                   ns    total    read    write    2017-12-26T19:53:13+08:00
                       local.oplog.rs      1ms     1ms      0ms
                 admin.system.profile      0ms     0ms      0ms
                   admin.system.roles      0ms     0ms      0ms
                   admin.system.users      0ms     0ms      0ms
                 admin.system.version      0ms     0ms      0ms




3.mongdb投票
Hidden:不会被选举为primary,对于client application是不可见的,具有投票权
Priority:成为primary的优先值,priority越高,成为primary的可能性越高。数值范围:0—100,=0表示不可能成为primary,也不会触发election
Voting:投票的权值,=0表示该节点没有投票的权利
Arbiter:仲裁节点,具有投票权,没有复制数据

4.读写模式
primary:主节点,默认读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred:首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点
secondary:从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常
secondaryPreferred:首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点
nearest:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。
         --邻近的判断标准为client对各台匹配要求的主机进行ping,最快响应的则最近

5.复制 oplog
>   show dbs
admin       0.000GB
gcrm     1445.183GB
local      25.243GB
test     0.000GB
> use local
switched to db local
> show collections;
me
oplog.rs
replset.election
replset.minvalid
startup_log
system.profile
system.replset

> db.oplog.rs.find()
{ "ts" : Timestamp(1513290869, 119), "t" : NumberLong(0), "h" : NumberLong("-164732681870941527"), "v" : 2, "op" : "d", "ns" : "xxxx", "fromMigrate" : true, "o" : { "_id" : ObjectId("xxxx") } }
ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如老primary宕机时)新primary时,会选择ts最大的那个secondary作为新primary。
op:1字节的操作类型,例如i表示insert,d表示delete。
ns:操作所在的namespace。
o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
o2: 在执行更新操作时的条件,仅限于update时才有该属性。
其中op,可以是如下几种情形之一:
“i”: insert
“u”: update
“d”: delete
“c”: db cmd



6.查看oplog状态
> db.printReplicationInfo()
configured oplog size:   200000MB
log length start to end: 1001366secs (278.16hrs)
oplog first event time:  Fri Dec 15 2017 06:34:29 GMT+0800 (CST)
oplog last event time:   Tue Dec 26 2017 20:43:55 GMT+0800 (CST)
now:                     Tue Dec 26 2017 20:44:03 GMT+0800 (CST)

说明:oplog 使用size约为200000MB。第一个操作发生时间为Fri Dec 15 2017 06:34:29 ;最后一个操作发生时间为Tue Dec 26 2017 20:43:55 。存储了1001366秒的数据(1077.06hrs)


> db.oplog.rs.stats()

7.查看主从延迟
>   db.printSlaveReplicationInfo()
source: 10.33.57.174:24000
        syncedTo: Tue Dec 26 2017 20:53:05 GMT+0800 (CST)
        0 secs (0 hrs) behind the primary

8.查看分片状态
mongos> db.mongos.find()db.mongos.find()

mongos> db.stats()db.stats()

--mongodb分区
mongos> db.databases.find()db.databases.find()


9.分片
--mongodbs缩减集群容量
1) 确认是否为database的primary shard,是,则需移除
use admin;
db.runCommand({movePrimary:"xx",to:"xxx"})
2) 设置balancer为true
use admin;
sh.setBalancerState(true)
3) 移除分片
use admin;
db.runCommand({removeShard:"s3"})

--DATABASE设置分片
设置:
use admin;
sh.enableSharding(“zydb”);
检查:
use config;
db.databases.find( { "partitioned": true } )
或
use zydb;
db.stats()

10. mongoDB数据块均衡
检查balancer设置:sh.getBalancerState()
激活balancer:sh.setBalancerState(true)
禁止balancer:sh.setBalancerState(false)

检查当前balancer是否正在均衡:
use config;
db.locks.find( { _id : "balancer" } ).pretty()
        State:2—正在进行均衡;

11.WT内存
db.serverStatus():serverStatus 命令,或外壳程序中的 db.serverStatus() 返回数据库状态的总览,具体包括磁盘使用状况、 内存使用状况、 连接、 日志和可用的索引。此命令迅速返回,并不会影响 MongoDB 性能
db.Stats():Stats 命令,或外壳程序中的 db.stats() 返回一份针对存储使用情况和数据卷的文档。 dbStats 显示了存储的使用量、包含在数据库中的数据的总量以及对象、集合和索引计数器。
db.getLastError():getLastError 命令,查看最近的错误。

mongoDB内存使用情况
db.serverStatus().men

mongostat --port <xxx> -u<xxx> <password>
若操作不在内存中进行,fault不是0

12.mongodb日常操作
db.addUser('test','test',true) 添加用户,readonly--false/true
db.addUser('test','test222') 改密码
db.system.remove({user:"test"})或者db.removeUser("test") 删除用户
use admin  超级用户
db.auth('test','test')  用户授权
db.system.user.find()   查看用户列表
show users              查看所有用户
db.prntCollectionStats() 查看各集合状态
db.printReplicationInfo() 查看主从状态
show dbs
db     查看当前database
show collections  查看当前db下的collections

13.日常命令
table/collection
column/fields


db.dropDatabase() 删除数据库
db.user.insert({user_id: "abc123", age: 55, status: "A"}) 隐士创建collection

alter table users add join_date datetime;
db.users.update({ }, {$set: {join_date: new Date()}, {multi: true}})

alter table users drop column join_date;
db.user.update({ }, {$unset: {join_date: ""}}, {multi: true})

create index id_user_id_asc on users(user_id);
db.user.ensureIndex({user_id: 1})

create index id_user_id_asc_age_desc on user(user_id,age DESC);
db.user.ensureIndex({user_id: 1, age: -1})

drop table users;
db.users.drop()

insert into users(user_id, age, status) values ("bcd001", 45,"A")
db.user.insert({user_id: "bcd001", age: 45, status: "A"})

select * from users;
db.user.find()

select id, user_id, status from users;
db.users.find({ }, {user_id: 1, status: 1})

select user_id,status from users
db.user.find({ }, {user_id: 1, status: 1, _id: 0})

select * from users where status = "A";
db.user.find({status: "A"})

select user_id,status from users where status = "A";
db.users.find({status: "A"}, {user_id: 1,status: 1, _id: 0})

select * from users where status != "A";
db.users.find({status: {$ne: "A"}})

select * from users where status = "A" and age = 50;
db.users.find({status: "A", age: 50})

select * from users where status = "A" or age = 50;
db.users.find({$or: [{status: "A"}, {age: 50}]})

select * from users where age > 25;
db.users.find({age: {$gt: 25}})

select * from users where age < 25;
db.users.find({age: {$lt: 25}})

select * from users where age > 25 and age <=50;
db.users.find({age: {$gt: 25, $lte: 50}})

select * from users where user_id like "%bc%";
db.users.find({user_id: /bc/})

select * from user where user_id like "bc%";
db.users.find({user_id: /^bc/})

select * from users where status = "A" order by user_id asc;
db.users.find({status: "A"}).sort({user_id: 1})

select * from users where status="A" order by user_id desc;
db.users.find({status:"A"}).sort({user_id: -1})

select count(*) from users;
db.users.count() 或者db.users.find.count()

select count(user_id) from users;
db.users.count({user_id: {$exist: true}})或者db.users.find({user_id: {$exists: true}}).count()

select count(*) from users where age > 30;
db.users.count({age: {$gt:30}})或者db.user.find({age: {$gt: 30}}).count()

select distinct(status) from users;
db.users.distinct("status")

select * from users limit 1;
db.users.findOne()或者 db.users.find().limit(1)

select * from users limit 5 skip 10;
db.users.find().limit(5).skip(10)

explain select * from users where status = "A";
db.users.find({status: "A"}).explain()

update users set status = "C" where age > 25;
db.users.update({age: {$gt: 25}}, {$set: {status:"C"}}, {multi: true})

update users set age = age + 3 where status = "A";
db.users.update({status: "A"}, {$inc: {age: 3}}, {multi:true})

delete from users where status = "D";
db.users.remove({status: "D"})

delete from users;
db.users.remove()

truncate table users;
db.users.remove()

13.当前操作
db. currentOp():查看当前数据库上的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。
重要参数说明:
opid:操作进程号
op:操作类型(query,update...)
ns:命名空间(namespace),即操作对象
query:显示操作的具体内容
lockType:锁类型,表明是写锁or读锁

db. killOp(opid):kill当前数据上的操作,以opid为标识

14.慢查询
db.getProfilingStatus():查看当前profiling status

-----慢查询日志的常用属性说明
>db.system.profile.find()

重要参数说明:
op:操作类型,有insert、query、update、remove、getmore、command
ns : 操作的集合
ts :命令在何时执行
info :命令的详细信息
reslen: 返回结果集的大小
nscanned:本次查询扫描的记录数
nreturned: 本次查询实际返回的结果集
mills:该命令的执行耗时(单位:毫秒)
query : 查询语句
ntoreturn : 返回的记录数
ntoskip :skip()方法指定的跳跃数
nscanned : 扫描数量
keyUpdates : 索引更新的数量,改变一个索引键带有一个小的性能开销,因为数据库必须删除旧的key,并插入一个新的key到B-树索引
lockStats :锁信息,R:全局读锁;W:全局写锁;r:特定数据库的读锁;w:特定数据库的写锁
timeLockedMicros : 锁
timeAcquiringMicros :锁等待
responseLength: 结果字节长度
millis: 消耗的时间(毫秒)
ts : 语句执行的时间
client :链接ip或则主机
allUsers ,user:用户
scanAndOrder:是一个布尔值,是True当一个查询不能使用的文件的顺序在索引中的排序返回结果:MongoDB中必须将其接收到的文件从一个游标后的文件进行排序。如果scanAndOrder是False,MongoDB的可使用这些文件的顺序索引返回排序的结果。
moved:更新操作在磁盘上移动一个或多个文件到新的位置。表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引更新,会使得这样的操作比较慢.
nupdated:更新文档的数目
getmore:这是一个getmore 操作,getmore通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取的。
如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,要考虑通过加索引来优化记录定位了。
responseLength 如果过大,说明返回的结果集太大了,这时要看是否只需要必要的字段。

----常用查询
---返回最近的10条记录
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()
---返回所有的操作,除command类型
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()
--返回特定集合
db.system.profile.find( { ns : 'mydb.test' } ).pretty()
---返回大于500毫秒的慢操作
db.system.profile.find( { millis : { $gt : 500 } } ).pretty()
---返回特定的时间范围内的慢查询信息
db.system.profile.find( { ts : { $gt : new ISODate("2015-06-09T03:00:00Z") , $lt : new ISODate("2015-06-09T03:40:00Z") } } ).pretty()
--返回特定时间,特定用户,按照消耗时间排序
db.system.profile.find( { ts : { $gt : new ISODate("2015-06-09T03:00:00Z") , $lt : new ISODate("2015-06-09T03:40:00Z") } }, { user : “ucms@ucms” } ).sort( { millis : -1 } )

 

03-18 09:12