MongDB操作

1. 查看MongoDB使用的引擎

echo "db.serverStatus()"| mongo|grep name

2. 创建数据库

ytk:PRIMARY> use ytk

(这样就创建了一个数据库,如果什么都不操作离开的话,这个库就会被系统删除)

ytk:PRIMARY> db.getName();	#查看当前使用的数据库
> db.createCollection("bb")			#创建库
> ytk:PRIMARY> db.usr.insert({'name':'tongji','id':1});	#插入一个表名为usr的表,并添加一条数据
> ytk:PRIMARY> db.createUser({user:'mongodb',pwd:'123456',roles:["readWrite","dbAdmin"]})
#创建mongodb用户
ytk:PRIMARY> show tables;			#查看当前库下的所有表
system.indexes
usr
ytk:PRIMARY> db.usr.find();			#查看usr表下的内容
{ "_id" : ObjectId("5711aa217b35fcb3779bf827"), "name" : "ytk" }
{ "_id" : ObjectId("5711ae17ee6a1e55187a6771"), "name" : "tongji", "id" : 1 }

3. MongoDB数据库关闭操作

ytk:PRIMARY> use admin
switched to db admin
ytk:PRIMARY> db.shutdownServer()
ytk:PRIMARY> rs.status();			#查看集群节点状态
{
	"set" : "ytk",
	"date" : ISODate("2020-06-4T04:18:12.307Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.45.138:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 443,
			"optime" : Timestamp(1460777542, 4),
			"optimeDate" : ISODate("2020-06-4T03:32:22Z"),
			"electionTime" : Timestamp(1460779853, 1),
			"electionDate" : ISODate("2020-06-4T04:10:53Z"),
			"configVersion" : 1,
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "192.168.45.146:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 442,
			"optime" : Timestamp(1460777542, 4),
			"optimeDate" : ISODate("2020-06-4T03:32:22Z"),
			"lastHeartbeat" : ISODate("2020-06-4T04:18:12.059Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-4T04:18:11.474Z"),
			"pingMs" : 1,
			"configVersion" : 1
		},
		{
			"_id" : 2,
			"name" : "192.168.45.146:27018",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 442,
			"lastHeartbeat" : ISODate("2020-06-4T04:18:12.059Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-4T04:18:11.244Z"),
			"pingMs" : 1,
			"configVersion" : 1
		}
	],
	"ok" : 1
}
ytk:SECONDARY> show dbs;
2020-06-4T03:57:23.365+0800 E QUERY    Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
    at Error (<anonymous>)
    at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
    at shellHelper.show (src/mongo/shell/utils.js:630:33)
    at shellHelper (src/mongo/shell/utils.js:524:36)
    at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47

这是正常的,因为SECONDARY是不允许读写的, 在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
对于replica set 中的secondary 节点默认是不可读的。
解决办法:在主库中设置

ytk:PRIMARY> db.setSlaveOk()

4. Mongo 数据库锁相关

ytk:PRIMARY> db.fsyncLock()			#强制写入锁
{
	"info" : "now locked against writes, use db.fsyncUnlock() to unlock",
	"seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
	"ok" : 1
}
ytk:PRIMARY> db.currentOp();		#查看当前锁状态
{
	"inprog" : [ ],
	"fsyncLock" : true,
	"info" : "use db.fsyncUnlock() to terminate the fsync write/snapshot lock"
}
ytk:PRIMARY> db.fsyncUnlock()		#关闭写入锁功能
{ "ok" : 1, "info" : "unlock completed" }
ytk:PRIMARY> db.currentOp();
{ "inprog" : [ ] }					#该状态说明无锁

> db.serverStatus()["globalLock"]		#查看数据库锁状态

totalTime是数据库启动之后的总时间, 单位是micro second
lockTime为处于锁定状态的时间。 如果锁定状态的时间占总时间较大的比例的话,说明很多请求实际上是在等待锁的释放。
current queue表示等待锁的请求数量。 reader表示在等待读锁的请求数量。 writers表示等待写锁的请求数量。
active clients表示处于连接状态的client的数量。
db.serverStatus()[“locks”] 这个命令可以从一个更细的粒度查看锁的情况。

> db.channels.stats()				#查看collections状态
{ "ok" : 0, "errmsg" : "Collection [tongji.channels] not found." }

5. MongoDB备份/恢复方案
A. 使用mongoimport和mongoexport工具导入/导出数据(针对库中表)
注:这种方式对BSON(BSON是JSON的超集)数据类型不适用,对数据的准确性欠佳。
B. 使用文件系统快照备份和恢复MongoDB数据库.
C. 使用 mongodump 和 mongorestore 备份和恢复 MongoDB 数据库
D. FsyncLock锁+Mongodump/Mongoexport方式备份
我们在备份的时候可能还有数据在内存缓冲区中没有写入到磁盘,MongoDB给我们提供了fsyncLock机制就能满足我们的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值