MongoDB 实战笔记 三

导出

mongoexport-dmy_mongodb-cuser-ouser.dat

导出CSV格式

mongoexport-dmy_mongodb-cuser--csv-fuid,username,age-o

user_csv.dat

-csv指要要导出为csv格式

     -f    指明需要导出哪些例

导入

mongoimport-dmy_mongodb-cuseruser.dat

导入CSV格式

mongoimport-dmy_mongodb-cuser--typecsv--headerline--file

user_csv.dat

CSV 格式良好,主流数据库都支持导出为 CSV 的格式,所以这种格式非常利于异构数据迁移

mongodump 来做 MongoDB 的库或表级别的备份,下面举例说明: 

备份my_mongodb数据库

[root@localhostbin]#./mongodump-dmy_mongodb

自动出现备份目录 dump

mongodump -d my_mongodb -o my_mongodb_dump也可以指定备份目录

恢复数据库

mongorestore -d my_mongodb my_mongodb_dump/*

删除数据库

usetest

db.dropDatabase()

服务端限制只有 192.168.1.103 这个 IP 可以访问 MongoDB 服务[root@localhost bin]# ./mongod --bind_ip 192.168.1.103

客户端访问时需要明确指定服务端的IP,否则会报错:

[root@localhostbin]#./mongo192.168.1.102

MongoDBshellversion:1.8.1

connecting to: 192.168.1.103/test

将服务端监听端口修改为 28018 [root@localhost bin]# ./mongod --bind_ip 192.168.1.103 --port 28018

端户访问时不指定端口,会连接到默认端口27017,对于本例会报错

[root@localhost bin]# ./mongo 192.168.1.102

所以当服务端指定了端口后,客户端必须要明确指定端口才可以正常访问[root@localhost bin]# ./mongo 192.168.1.102:28018

先启用系统的登录验证模块,只需在启动时指定auth参数即可,如:

[root@localhost bin]# ./mongod --auth

在 admin 库中新添一个用户 root: 

[root@localhostbin]#./mongo

MongoDBshellversion:1.8.1

connectingto:test

>db.addUser("root","111")

{

"user":"root",

"readOnly":false,

"pwd":"e54950178e2fa777b1d174e9b106b6ab"

}

> db.auth("root","111")

本地客户端连接,指定用户,结果如下: [root@localhost bin]# ./mongo -u root -p

将将将 MongoDB Windows 

先创建C:\mongo\logs\mongodb.log文件,用于存储MongoDB的日志文件,再安装系统

服务。

C:\mongo\bin>C:\mongo\bin\mongod--dbpath=c:\db--logpath=c:\mongo\lo

gs\mongodb.log --install

t1_count.js就是我们要执行的文件,里面的内容如下

[root@localhostbin]#catt1_count.js

vartotalcount=db.t1.count();

printjson('Totalcountoft1is:'+totalcount);

printjson('-----------------------');

./mongot1_count.js

MongoDBshellversion:1.8.1

connectingto:test

"Total count of t1 is :  7"

/mongo --quiet  t1_count.js  

"Totalcountoft1is:7"

"-----------------------"

[root@localhostbin]#

通过指定 quiet 参数,即可以将一些登录信息屏蔽掉,这样可以让结果更清晰

查看活动进程,便于了解系统正在做什么,以便做下一步判断

>db.currentOp();

>//等同于:db.$cmd.sys.inprog.findOne()

{inprog:[{"opid":18,"op":"query","ns":"mydb.votes",

"query":"{score:1.0}","inLock":1}

]

}

:

Opid:操作进程号

Op:操作类型(查询,更新等)

Ns:命名空间,指操作的是哪个对象

Query:如果操作类型是查询的话,这里将显示具体的查询内容

lockType:  锁的类型,指明是读锁还是写锁

DBA都会毫不留情的杀掉这个罪魁祸首的

进程,下面将是这操作

>db.killOp(1234/*opid*/)

> //  等同于: db.$cmd.sys.killop.findOne({op:1234})

在字段age上创建索引,1(升序);-1(降序)

>db.t3.ensureIndex({age:1})

> db.t3.getIndexes();

当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定

“backgroud:true”即可。

> db.t3.ensureIndex({age:1} , {backgroud:true})

索引可以任何类型的字段,甚至文档

db.factories.insert({name:"wwl",addr:{city:"Beijing",state:"BJ"}});

//在addr列上创建索引

db.factories.ensureIndex( { addr : 1 } );

//下面这个查询将会用到我们刚刚建立的索引

db.factories.find({addr:{city:"Beijing",state:"BJ"}});

//但是下面这个查询将不会用到索引,因为查询的顺序跟索引建立的顺序不一样

db.factories.find( { addr: { state: "BJ" , city: "Beijing"} } );

MongoDB也是有组合索引的,下面我们将在addr.city和addr.state

上建立组合索引。当创建组合索引时,字段后面的1表示升序,-1表示降序,是用1还是

用-1主要是跟排序的时候或指定范围内查询的时候有关的。

db.factories.ensureIndex({"addr.city":1,"addr.state":1});

//下面的查询都用到了这个索引

db.factories.find({"addr.city":"Beijing","addr.state":"BJ"});

db.factories.find({"addr.city":"Beijing"});

db.factories.find().sort({"addr.city":1,"addr.state":1});

db.factories.find().sort( { "addr.city" : 1 } )

//删除t3表中的所有索引

db.t3.dropIndexes()

//删除t4表中的firstname索引

db.t4.dropIndex({firstname: 1})

执行计划  利用 explain  命令,

我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。

>db.t5.ensureIndex({name:1})

>db.t5.ensureIndex({age:1})

>db.t5.find({age:{$gt:45}},{name:1}).explain()

{

"cursor":"BtreeCursorage_1",

"nscanned":0,

"nscannedObjects":0,

"n":0,

"millis":0,

"nYields":0,

"nChunkSkips":0,

"isMultiKey":false,

"indexOnly":false,

"indexBounds":{

"age":[

[

45,

1.7976931348623157e+308

]

}

}

:

cursor:返回游标类型(BasicCursor或BtreeCursor)

nscanned:被扫描的文档数量

n:返回的文档数量

millis:耗时(毫秒)

indexBounds:  所使用的索引

启动 MongoDB 时加上–profile=级别 即可。

也可以在客户端调用db.setProfilingLevel(级别)命令来实时配置,Profiler信息保存在

system.profile中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile级别,类似如

下操作

>db.setProfilingLevel(2);

{"was":0,"slowms":100,"ok":1}

上面profile的级别可以取0,1,2三个值,他们表示的意义如下:

0–不开启

1–记录慢命令(默认为>100ms)

2 –  记录所有命令

列出执行时间长于某一限度(5ms)的Profile记录:

db.system.profile.find( { millis : { $gt : 5 } } )

db.system.profile.find().sort({$natural:-1}).limit(1)

{"ts":ISODate("2012-05-20T16:50:36.321Z"),"info":"querytest.system.profilereslen:1219

nscanned:8\nquery:{query:{},orderby:{$natural:-1.0}}nreturned:8bytes:1203","millis":

0}

>

:

ts:该命令在何时执行

info:本命令的详细信息

reslen:返回结果集的大小

nscanned:本次查询扫描的记录数

nreturned:本次查询实际返回的结果集

millis:  该命令执行耗时,以毫秒记

capped Collections 比普通 Collections 的读写效率高。Capped Collections 是高效率的 Collection

类型,它有如下特点:

1、固定大小;CappedCollections必须事先创建,并设置大小:

db.createCollection("mycoll",{capped:true,size:100000})

2、CappedCollections可以insert和update操作;不能delete操作。只能用drop()方法

删除整个Collection。

3、默认基于Insert的次序排序的。如果查询时没有排序,则总是按照insert的顺序返回。

4、FIFO。如果超过了Collection的限定大小,则用FIFO算法,新记录将替代最先insert的

记录。

此工具可以快速的查看某组运行中的MongoDB实例的统计信息

/mongostat

insertqueryupdatedelete......locked%idxmiss%qr|qwar|awconntime

*0*0*0*0......000|01|0401:19:15

*0*0*0*0......000|01|0401:19:16

*0*0*0*0......000|01|0401:19:17

:

insert:每秒插入量

query:每秒查询量

update:每秒更新量

delete:每秒删除量

locked:锁定量

qr|qw:客户端查询排队长度(读|写)

ar|aw:活跃客户端量(读|写)

conn:连接数

time:当前时间

它每秒钟刷新一次状态值,提供良好的可读性,通过这些参数可以观察到一个整体的性能情

mongodb状态查询之db.serverStatus()详解(2012-06-2016:28:09)

转载▼分类:DBA之路

--转载(收藏)

Field Example Value Explanation 

Hostte.rzw.com:27018运行实例所监听的IP与端口

version1.8.3当前实例所使用的版本

Processmongod当前实例是mongod,还是mongos

Uptime231905实例连续正常运行时间,单位秒

uptimeEstimate223083基于mongodb内部粗粒定时器的连续正常运行时间

localTimeISODate(“2011-10-13T01:47:38.773Z”)本机时间,以UTC时间为计算标准。

globalLock.totalTime231905155987自实例启动全局锁创建以来到现在多长时间,单位微秒.

globalLock.lockTime9053050自全局锁创建以来锁定总时间,单位微秒

globalLock.ratio0.0000390377262锁定的时间所占的比例(lockTime/totalTime)

globalLock.currentQueue.total0当前等待全局锁的数量

globalLock.currentQueue.readers0当前等待读锁的数量

globalLock.currentQueue.writers0当前等待写锁的数量

globalLock.activeClients.total1连接到当前实例处于活动状态的客户端数量。

globalLock.activeClients.readers1处于活动状态的客户端中有多少是在执行read操作

globalLock.activeClients.writers0处于活动状态的客户端中有多少是在执行write操作

Mem.resident6到现在总共使用的物理内存,单位是MB

Mem.virtual 17307 当前Mongodb实例使用的虚拟内存大小,单位MB,一般情况下比mem.map的值要超大一点,如果大很多很有可能发生

内存泄露,如果使用journal,大约是2倍的map值 

Mem.maped8556Mongodb使所有数据都映射到内存中,所以这个值可以看似整个数据量的值。

Mem.bits64机器位数,32位或64位

Mem.supportedtrue本机是否支持内存扩展

Connections.current2当前连接到本机处于活动状态的连接数

Connections.available19998剩余多少可供连接

extra_info.heap_usage_bytes     521152当前实例堆大小,单位bytes

extra_info.page_faults569加载磁盘内容时发生页错误的次数

indexCounters.Btree.accesses1访问索引次数

indexCounters.Btree.hits1访问索引时,索引在内存中被命中的次数

indexCounters.Btree.misses0访问索引时,索引不是在内存中被命中的次数

indexCounters.Btree.resets0索引计数器被重置的次数

indexCounters.Btree.missRatio0索引非命中率

backgroundFlushing.flushes3864实例刷新数据到磁盘的数次

backgroundFlushing.total_ms15473刷新到磁盘总共花费的时间,单位毫秒

backgroundFlushing.average_ms4.004399585921325平均每次刷新执行时间

backgroundFlushing.last_ms3最后一次刷新执行时间

backgroundFlushing.last_finishedISODate(“2011-10-13T01:46:51.184Z”)最后一次刷新完成的时间点

Cursors.totalOpen1当前游标数量

Cursors.timeOut2从实例启动到现在游标超时的总数量

Network.bytesIn4680778发送到实例的字节大小

Network.bytesOut4759827发送出去的字节大小

Repl.setNamemysetreplSet结构定义的名称

Repl.isMasterTrue当前实例是否是replSet结构中的Master节点

Repl.secondaryFalse当前实例是否是replSet结构中的secondary节点

Repl.hosts[“te.rzw.com:27018”,”te.rzw.com:27019”]replSet结构中每个节点情况

Opcounters.insert4自实例启动以来,执行insert次数

Opcounters.query181自实例启动以来,执行query次数

Opcounters.update92084自实例启动以来,执行update次数

Opcounters.delete0自实例启动以来,执行delete次数

Opcounters.getmore92816自实例启动以来,在游标执行getMore次数

Opcounters.command316自实例启动以来,执行其他操作的次数

Asserts.regular0自实例启动以来,断言正常的次数

Asserts.warn0自实例启动以来,断言警告的次数

Asserts.msg0自实例启动以来,断言内部错误的次数

Asserts.user134自实例启动以来,因用户使用造成的错误而被断言次数

Asserts.rollovers0断言被翻转的次数

writeBacksQueuedFalse在mongos中,操作被重做的次数

Dur.commits1在最近间隔,向journal文件提交的次数

Dur.journaledMB0.008192在最近间隔,journalr文件写入数据量,单位MB

Dur.writeToDataFilesMB0在最近间隔,从journal文件向数据文件写入的数据量,单位MB

Dur.commitsInWriteLock0在最近间隔中,处于写锁状态下向journal提交的次数.这种提交方式是不被推荐的

Dur.earlyCommits0在预定时间之前请求提交的次数

Dur.timeMs.dt3045Journal状态收集的频率,单位毫秒

Dur.timeMs.prepLogBuffer0向journal写数据前的准备所花费时间,单位毫秒

Dur.timeMs.writeToJournal2向journal写数据所花费时间,单位毫秒

Dur.timeMs.writeToDataFiles0在写入journal文件后向数据文件写数据花费时间,单位毫秒

Dur.timeMs.remapPrivateView0重新在内存中映射数据花费的时间

Ok 1 serverStatus操作是否被成功执行

原文地址:http://archive.cnblogs.com/a/2210339/

"host":"localhost.localdomain",

"version":"1.8.1",--服务器版本

"process":"mongod",

"uptime":3184,--启动时间(秒)

"uptimeEstimate":3174,

"localTime":ISODate("2012-05-28T11:20:22.819Z"),

"globalLock":{

"totalTime":3183918151,

"lockTime":10979,

"ratio":0.000003448267034299149,

"currentQueue":{

"total":0,--当前全部队列量

"readers":0,--读请求队列量

"writers":0--写请求队列量

},

"activeClients":{

"total":0,--当前全部客户端连接量

"readers":0,--客户端读请求量

"writers":0--客户端写请求量

}

},

"mem":{

"bits":32,--32位系统

"resident":20,--占用物量内存量

"virtual":126,--虚拟内存量

"supported":true,--是否支持扩展内存

"mapped":32

},

"connections":{

"current":1,--当前活动连接量

"available":818--剩余空闲连接量

},

……

"indexCounters":{

"btree":{

"accesses":0,--索引被访问量

"hits":0,--索引命中量

"misses":0,--索引偏差量

"resets":0,

"missRatio":0--索引偏差率(未命中率)

}

},

……

"network":{

"bytesIn":1953,--发给此服务器的数据量(单位:byte)

"bytesOut":25744,--此服务器发出的数据量(单位:byte)

"numRequests":30--发给此服务器的请求量

},

"opcounters":{

"insert":0,--插入操作的

"query":1,--查询操作的量

"update":0,--更新操作的量

"delete":0,--删除操作的量

"getmore":0,

"command":31--其它操作的量

},

……

"ok":1

}

>

(http://cache.baidu.com/c?

m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075a91e5aeef43474610123b598c9c

d409cac925f75ce786a6459db0144dc4fffdc4755d620e74de8df58b0fab465d3b9d3a39e12008c1444&p=99759a46d7c41afc57ee952149409826&

user=baidu&fm=sc&query=db%2EserverStatus%28%29%3B&qid=ac4bd6920b330747&p1=2)

链接字符串:mongodb://sa:[email protected]:27017(http://blog.csdn.net/lzy_1515/article/details/7027474)

db.stats  查看数据库状态信息。使用样例如下: 

>db.stats()

{

"db":"test",

"collections":7,--collection数量

"objects":28,--对象数量

"avgObjSize":50.57142857142857,--对象平均大小

"dataSize":1416,--数据大小

"storageSize":31744,--数据大小(含预分配空间)

"numExtents":7,--事件数量

"indexes":7,--索引数量

"indexSize":57344,--索引大小

"fileSize":50331648,--文件大小

"ok":1--本次取stats是否正常

}

>

通过这个工具,可以查看所在数据库的基本信息

mongo  admin -u root -p

Mongom=newMongo();

DBdb=m.getDB("test");//获取系统权限登陆admin再切换数据库

booleanauth=db.authenticate("root","8858".toCharArray());

//db=m.getDB("test");

Set<String>colls=db.getCollectionNames();

for(Stringstring:colls){

System.out.println(string);

}

DBCollectioncoll=db.getCollection("c4");

System.out.println(coll.count());

DBCursorcur=coll.find().limit(1000);

while(cur.hasNext())

                System.out.println(cur.next());

MongoDB  高可用可用分两种: 

1.主从复制Master-Slave:::

只需要在某一个服务启动时加上–master参数,而另一个服务加上–slave与–source参数,

即可实现同步。MongoDB的最新版本已不再推荐此方案。

2.复制集ReplicaSets:::

MongoDB在1.6版本对开发了新功能replicaset,这比之前的replication功能要强大一

些,增加了故障自动切换和自动修复成员节点,各个DB之间数据完全一致,大大降低了维

护成功。autoshard已经明确说明不支持replicationparis,建议使用replicaset,replicaset

故障切换完全自动。

设置主从服务器步骤

1。设置主服务器(10.166.112.109)

mongod --master  --dbpath=d:\db --logpath=d:\db\logs\mongodb.log --auth --install

启动 net start mongodb

2。设置从服务器mongod --slave --source 10.166.112.109  --dbpath=e:\db --logpath=e:\db\logs\mongodb.log --auth --install

启动 net start mongodb

如果发现主从不同步,从上手动同步db.runCommand({"resync":1})

状态查询db.runCommand({"isMaster":1})  #主还是从

在丛库上查询主库地址

>uselocal;

switchedtodblocal

>db.sources.find();

{ "_id" : ObjectId("4e9105515d704346c8796407"), "host" :"10.166.112.109:27001", "source" : "main", "syncedTo" : { "t" :

1318155992000,"i" : 1 } }

#查看各Collection状态db.printCollectionStats();

#查看主从复制状态db.printReplicationInfo();

需认证的主从处理:mongod  --port 27017 --dbpath /data/mongodb/dbs/master --logpath /data/mongodb/dbs/master/master.log --fork --master -

-authmongod  --port 27018 --dbpath /data/mongodb/dbs/slave  --logpath /data/mongodb/dbs/slave/slave.log --fork --slave --

source localhost:27017 --auth

无需认证的主从处理:

mongod--port27017--dbpath/data/mongodb/dbs/master--master

mongod --port 27018 --dbpath /data/mongodb/dbs/slave --slave --source localhost:27017

主从设备同步 例子2

mongod--master--dbpathdata/m1-port10001

mongod--slave--sourcelocalhost:10001--dbpathdata/s1-port10101

mongod --slave --source localhost:10001 --dbpath data/s2 -port 10102 

客户端连接:

mongo-port10001

mongo-port10101

mongo -port 10102 

Mongodb的全面总结

MongoDB语法与现有关系型数据库SQL语法比较

MongoDB语法                                  MySql语法

db.test.find({'name':'foobar'})<==> select * from test where name='foobar'

db.test.find()                            <==> select *from test

db.test.find({'ID':10}).count()<==> select count(*) from test where ID=10

db.test.find().skip(10).limit(20)<==> select * from test limit 10,20

db.test.find({'ID':{$in:[25,35,45]}})<==> select * from test where ID in (25,35,45)

db.test.find().sort({'ID':-1})  <==> select * from test order by IDdesc

db.test.distinct('name',{'ID':{$lt:20}})  <==> select distinct(name) from testwhere ID<20

db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:

{msum:0}})  <==> select name,sum(marks) from testgroup by name

db.test.find('this.ID<20',{name:1})  <==> select name from test whereID<20

db.test.insert({'name':'foobar','age':25})<==>insertinto test ('name','age') values('foobar',25)

db.test.remove({})                        <==> delete * from test

db.test.remove({'age':20})            <==> delete test where age=20

db.test.remove({'age':{$lt:20}})   <==> elete test where age<20

db.test.remove({'age':{$lte:20}})  <==> delete test where age<=20

db.test.remove({'age':{$gt:20}})  <==> delete test where age>20

db.test.remove({'age':{$gte:20}})<==> delete test where age>=20

db.test.remove({'age':{$ne:20}})  <==> delete test where age!=20

db.test.update({'name':'foobar'},{$set:{'age':36}})<==> update test set age=36 where name='foobar'

db.test.update({'name':'foobar'},{$inc:{'age':3}})<==> update test set age=age+3 where name='foobar'

(http://blog.csdn.net/jakenson/article/details/7060431)

相关推荐