查看指令
test:登录时默认存在的库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库
查看数据库命令
show databases/show dbs
show tables/show collections
use admin
db/select database()
插入命令
1.插入单条
db.user_info.insert({"name":"SATA","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"HU","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"GANG","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"MA","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"YI","age":28,"ad":"北京市朝阳区","sex":"待定"})
2.插入多条
db.inventory.insertMany([
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);
查询命令
1.查询一条
db.user_info.findOne()
2.查询所有
db.user_info.find()
3.查询符合条件
db.user_info.find({"age":28})
select * from user_info where age = 28;
4.查询嵌套的条件
db.inventory.find( { "size.uom": "in" } )
db.inventory.find(
{
"size.uom": "in"
}
)
5.逻辑查询:and
db.inventory.find( { "size.uom": "cm" ,"status" : "A"} )
db.inventory.find(
{
"size.uom": "cm" ,
"status" : "A"
}
)
6.逻辑查询 或
db.inventory.find(
{
$or:[
{status:"D"},
{qty:{$lt:30}}
]
}
)
7.逻辑查询+或+and+正则表达式
db.inventory.find({status:"A",$or[{qty{$lt:30}},{item:/^p/}]})
db.inventory.find(
{
status: "A",
$or: [
{ qty: { $lt: 30 } },
{ item: /^p/ }
]
}
)
更新数据
1.更改匹配条件的单条数据
db.inventory.find({ "item" : "paper" })
db.inventory.updateOne{ "item" : "paper" },{$set: { "size.uom" : "cm", "status" : "P" }})
db.inventory.updateOne(
{ "item" : "paper" },
{
$set: {
"size.uom" : "cm",
"status" : "P"
}
}
)
2.更改匹配条件的多条数据
db.inventory.find({ "qty" : { $lt: 50 } })
db.inventory.updateMany(
{ "qty" : { $lt: 50 } },
{
$set:
{
"size.uom" : "mm",
"status": "P"
}
}
)
3.添加字段
db.user_info.find({ "age" : 27})
db.user_info.updateMany(
{ "age" : 27},
{
$set:
{
"pet" : "cat"
}
}
)
索引
1.查看执行计划
db.user_info.find({"age":{ $lt: 30 }})
db.user_info.find({"age":{ $lt: 30 }}).explain()
2.创建索引
db.user_info.createIndex({ age: 1 },{background: true})
参数说明:
age:1 表示对age字段作为索引的字段,1表示排序规则为升序,-1表示为降序
background 表示放在后台创建,不影响读写
3.查看索引
db.user_info.getIndexes()
4.再次查看执行计划
db.user_info.find({"age":{ $lt: 30 }}).explain()
关键词
"stage" : "IXSCAN"
"indexName" : "age_1"
5.删除索引
db.user_info.dropIndex("age_1")
索引类型
COLLSCAN - 表示查询的字段并没有建立索引,所以查询的时候会使用全表扫描
IXSCAN – 表示使用索引来找出对应的文档
删除
1.先查找需要删除的数据
db.inventory.find({"status":"P"})
2.删除单条
db.inventory.deleteOne({"status":"P"})
3.删除多个
db.inventory.deleteMany({"status":"P"})
4.删除索引
db.user_info.dropIndex("age_1")
4.删除集合
show dbs
db
show tables
db.inventory.drop()
5.删除库
show dbs
db
db.dropDatabase()
mongo工具
0.命令介绍
mongod #启动命令
mongo #登录命令
mongodump #备份导出,全备压缩
mongorestore #恢复
mongoexport #备份,数据可读json
mongoimport #恢复
mongostat #查看mongo运行状态
mongotop #查看mongo运行状态
mongos #集群分片命令
1.mongostat
各字段解释说明:
insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)
dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
used: 仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比
flushes:
For WiredTiger引擎:指checkpoint的触发次数在一个轮询间隔期间
For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数
注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res: 物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存。
qr: 客户端等待从MongoDB实例读数据的队列长度
qw:客户端等待从MongoDB实例写入数据的队列长度
ar: 执行读操作的活跃客户端数量
aw: 执行写操作的活客户端数量
注:如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
netIn:MongoDB实例的网络进流量
netOut:MongoDB实例的网络出流量
注:此两项字段表名网络带宽压力,一般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections,阿里工程师建议在5000以下,基本满足多数场景
创建用户和角色
0.与用户相关的命令
db.auth() 将用户验证到数据库。
db.changeUserPassword() 更改现有用户的密码。
db.createUser() 创建一个新用户。
db.dropUser() 删除单个用户。
db.dropAllUsers() 删除与数据库关联的所有用户。
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.removeUser() 已过时。从数据库中删除用户。
db.revokeRolesFromUser() 从用户中删除角色。
db.updateUser() 更新用户数据。
1.创建管理用户
mongo db01:27017
use admin
db.createUser(
{
user: "admin",
pwd: "123456",
roles:[
{
role: "root",
db:"admin"
}
]
}
)
2.查看创建的用户
db.getUsers()
3.配置文件添加权限认证参数
security:
authorization: enabled
4.重启mongo
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
mongod -f /opt/mongo_27017/conf/mongodb.conf
5.使用admin用户登录
mongo db01:27017 -uadmin -p --authenticationDatabase admin
6.创建其他用户
use test
db.createUser(
{
user: "mysun",
pwd: "123456",
roles: [ { role: "readWrite", db: "write" },
{ role: "read", db: "read" } ]
}
)
7.创建测试数据
use write
db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.write.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})
use read
db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.read.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})
8.退出admin,使用mysun用户登录
mongo db01:27017 -umysun -p --authenticationDatabase test
use write
db.write.find()
db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
use read
db.read.find()
db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
9.修改用户权限
use test
db.updateUser(
'mysun',
{
pwd: "123456",
roles: [ { role: "readWrite", db: "write" },
{ role: "readWrite", db: "read" } ,
{ role: "readWrite", db: "test" }
]
}
)
10.删除用户
db.getUsers()
db.dropUser('mysun')
mongo副本集配置
1.创建节点目录和数据目录
systemctl stop mongod
mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid}
mkdir -p /data/mongo_2801{7,8,9}
2.创建配置文件
cat >/opt/mongo_28017/conf/mongo_28017.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_28017/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_28017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_28017/pid/mongod.pid
net:
port: 28017
bindIp: 127.0.0.1,10.0.0.114
replication:
oplogSizeMB: 1024
replSetName: dba
EOF
3.复制配置文件到其他节点
cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28018/conf/mongo_28018.conf
cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28019/conf/mongo_28019.conf
4.替换端口号
sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongo_28018.conf
sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongo_28019.conf
5.启动所有节点
mongod -f /opt/mongo_28017/conf/mongo_28017.conf
mongod -f /opt/mongo_28018/conf/mongo_28018.conf
mongod -f /opt/mongo_28019/conf/mongo_28019.conf
6.初始化集群
config = {
_id : "dba",
members : [
{_id : 0, host : "db01:28017"},
{_id : 1, host : "db01:28018"},
{_id : 2, host : "db01:28019"},
]}
rs.initiate(config)
7.插入数据
db.inventory.insertMany( [
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);
8.副本节点登录查看数据
rs.slaveOk()
use test
db.inventory.find()
9.设置副本可读
方法1:临时生效
rs.slaveOk()
方法2:写入启动文件
echo "rs.slaveOk()" > ~/.mongorc.js
副本集权重调整
0.模拟故障转移
mongod -f /opt/mongo_28017/conf/mongo_28017.conf --shutdown
mongod -f /opt/mongo_28017/conf/mongo_28017.conf
1.查看当前副本集配置
rs.conf()
2.设置权重
config=rs.conf()
config.members[0].priority=100
rs.reconfig(config)
3.恢复成默认的权重
config=rs.conf()
config.members[0].priority=1
rs.reconfig(config)
4.主节点主动降级
rs.stepDown()
增加新的节点和删除旧的节点
1.创建新节点并启动
mkdir -p /opt/mongo_28010/{conf,log,pid}
mkdir -p /data/mongo_28010
cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28010/conf/mongo_28010.conf
sed -i 's#28017#28010#g' /opt/mongo_28010/conf/mongo_28010.conf
mongod -f /opt/mongo_28010/conf/mongo_28010.conf
mongo db01:28010
2.集群添加节点
mongo db01:28017
use admin
rs.add("db01:28010")
3.新节点查看信息
mongo db01:28010
3.删除节点
rs.remove("db01:28010")
rs.remove("db01:28011")
仲裁节点
1.不存储数据也不处理数据
2.只负责投票
3.永远不会抢占master角色
4.不消耗太多资源
1.创建新节点并启动
mkdir -p /opt/mongo_28011/{conf,log,pid}
mkdir -p /data/mongo_28011
cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28011/conf/mongo_28011.conf
sed -i 's#28017#28011#g' /opt/mongo_28011/conf/mongo_28011.conf
mongod -f /opt/mongo_28011/conf/mongo_28011.conf
mongo db01:28011
2.将仲裁节点加入集群
rs.addArb("db01:28010")
mongo备份与恢复
1.工具介绍
mongoexport/mongoimport
mongodump/mongorestore
2.应用场景
异构平台迁移mysql <---> mongodb
同平台,跨大版本:mongodb 2 ----> mongodb 3
mongoexport/mongoimport:json csv
日常备份恢复时使用.
mongodump/mongorestore
3.导出工具mongoexport
单表备份
mongoexport --port 27017 -d test -c inventory -o /data/inventory.json
单表备份至csv格式
mongoexport --port 27017 -d test -c user_info --type=csv -f name,age,ad -o /data/user_info.csv
4.恢复
mongoimport --port 27017 -d test -c inventory /data/inventory.json
mongoimport --port 27017 -d test -c user_info --type=csv --headerline --file /data/user_info.csv
mysql配置文件添加安全目录
secure-file-priv=/tmp
5.mysql数据迁移到mongo
select * from world.city into outfile '/tmp/city.csv' fields terminated by ',';
编辑csv文件,添加列名
ID,Name,CountryCode,District,Population
mongoimport --port 27017 -d world -c city --type=csv --headerline --file /data/city.csv
mongoexport --port 27017 -d world -c city -o /data/city.json
6.导出与恢复
mongodump --port 27017 -o /data/backup
mongorestore --port 27017 -d world /data/backup/world/ --drop
mongorestore --port 27017 /data/backup/ --drop
oplog介绍
1.oplog是什么?
oplog即操作记录,是副本集成员特有的集合,默认为固定大小。
他是副本集之间同步数据的关键设计。
应用端对数据的增加,删除,修改操作都会被记录在这个集合中。
2.oplog的运作
在配置副本集时,若未指定Oplog大小,则Oplog默认为数据文件所在硬盘容量的5%,但默认大小不会超过50G
若自定义大小则不受限制,只需要在配置文件里使用oplogSizeMB参数即可
注意:此参数仅在集群未初始化前配置有效,一旦Oplog创建完集合,则再修改参数也无效
所以需要提前规划好数据写入的并发程度,如果设置的过小,可能导致还未同步到副本节点,oplog就已经满了
3.oplog的内容
oplog的内容会被记录在数据节点的local数据库中一个叫做oplog.rs的mongodb原生集合中。
操作命令:
use local
db.oplog.rs.findOne()
内容解释:
ts: 操作时间
h: 全局唯一标示
v: oplog版本
op: 操作类型
i: 插入
u: 更新
d: 删除
c: 执行指令
ns: 操作对象(集合)
o: 操作的内容
4.oplog的初始化
如果是新增副本集,或者同步延迟太久,同步源的oplog领先太多,则会进行初始化
在初始化时,节点会从另一个副本成员进行完整的数据复制,包含整个数据文件及oplog的复制
5.oplog的同步
节点在同步时,会对比自身与其他节点的状态,从而选择数据比自己更完整的节点作为数据源进行同步。
6.查看oplog信息
rs.printReplicationInfo()
模拟误删除步骤:
准备测试数据
use backup
db.backup.insertMany( [
{ "id": 1},
{ "id": 2},
{ "id": 3},
]);
全备环境
rm -rf /data/backup/*
mongodump --port 28017 --oplog -o /data/backup
增加新数据
mongo db01:28017
use backup
db.backup.insertMany( [
{ "id": 4},
{ "id": 5},
{ "id": 6},
]);
模拟删除集合
mongo db01:28017
use backup
db.backup.drop()
备份oplog
mongodump --port 28017 -d local -c oplog.rs -o /data/backup
查找误操作时间点
use local
db.oplog.rs.find({ns:"backup.$cmd"}).pretty();
找到时间点信息
"ts" : Timestamp(1575023546, 1),
恢复数据
cd /data/backup/local/
cp oplog.rs.bson ../oplog.bson
rm -rf /data/backup/local/
mongorestore --port 28010 --oplogReplay --oplogLimit "1577259776:1" --drop /data/backup/











网友评论