mongodb日常运维
mongodb日常运维
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 } )