mongodb相关文档地址
下载地址:
http://www.mongoing.com/
文档地址:
docs.mongodb.com
mongoing.com
http://www.mongodb.org.cn/manual/
MongoDB Compass可视化管理工具
https://www.mongodb.com/download-center/compass
1. MongoDB简介
DBMS
数据
程序:指令+数据
https://db-engines.com/en/ranking
1. NoSQL是什么?
NoSQL=Not Only SQL
1998年Carlo Strozzi首次提出(不提供SQL功能的关系型数据库)
2009年Eric Evans再次提出NoSQL概念
NoSQL、Relational Database相铺相成
2. NoSQL数据库四大家族
-
列存储:Hbase
-
键值(Key-Value)存储:Redis
-
图像存储:Neo4J
-
文档存储:MongoDB
3. NoSQL的优势
-
高可扩展性
-
分布式计算
-
没有复杂的关系
-
低成本
-
架构灵活
半结构化数据
4. MongoDB的哲学
5. 关系与非关系模型
关系模型
非关系模型
6. MongoDB与RDBMS的区别
MongoDB与RDBMS最大的区别在于:没有固定的行列组织数据结构
7. MongoDB数据存储格式
文档型
–JSON
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON数据库语句可以容易被解析
Web 应用大量使用
NAME-VALUE 配对,例如:
{
product: “car”,
brand: “Benz”,
color: “blue” }
8. BSON
二进制的JSON,JSON文档的二进制编码存储格式
BSON有JSON没有的Date和BinData
MongoDB中document以BSON形式存放
db.meeting.insert({meeting:“SHOUG June”,Date:“2015-06-15”});
9. 灵活的数据格式
- **文档里嵌入了文档 **
{
_id: ObjectID("1"),
username: “Silence”,
regDate: “10-10-2015”,
scores: {
math: "80",
english: "200"
}
}
- ** 一个KEY对应一个数组 **
{
_id: ObjectID("1"),
username: “Silence”,
regDate: “10-10-2015”,
scores: {
math: "80",
english: "200"
}
Attr:[“a1”,”a2”]
}
10. MongoDB的优势
开源
MongoDB是开源产品
On GitHub
Licensed under the AGPL
起源& 赞助by MongoDB公司
提供商业版licenses 许可
11. 支持多种存储引擎
12. 存储引擎比较
13. MongoDB体系结构
跨平台
–Linux、Unix、Mac、Windows
–整体架构相同
MongoDB Server
–实例、数据库及其对应关系
数据逻辑结构
–文档、集合、数据库
数据存储
–元数据、实际数据
14. 数据逻辑结构
- ** 层次关系 **
-
文档(document) ------ 行
-
集合(collection) ---- 表
-
数据库(database) — 库
- ** 层次关系图**
15. MongoDB与RDBMS数据结构逻辑对比
16. 应用场景
网站数据
缓存
大尺寸、低价值的数据
高伸缩性的场景
用于对象及JSON数据的存储
17. MongoDB用户案例
18. 互联网典型应用
19. MongoDB 商业价值
安装配置
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/
- ** 安装准备**
–准备Redhat或Centos6.2以上系统
–关闭iptables&Senlinux
–配置IP地址和hosts解析
–关闭hugepage大页内存
–创建mongodb所需用户
–创建所需目录,并授权
关闭大页内存
root用户下
在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
useradd mongod
echo 123456 |passwd --stdin mongod
mkdir /mongodb/{bin,data,log,conf} -p
cd /root/mongodb-linux-x86_64-rhel62-3.2.16/bin
cp * /mongodb/bin
(4)设置目录结构权限
chown -R mongod:mongod /mongodb
(5)设置用户环境变量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
- ** 启动mongodb**
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
- ** 登录mongodb**
mongo
mongo 10.0.0.51/admin
- ** 配置文件**
vim /mongodb/conf/mongod.conf
dbpath=/mongodb/data
logpath=/mongodb/log/mongodb.log
port=27017
logappend=true
fork=true
- ** 带配置文件启动**
mongod -f /mongodb/conf/mongod.conf
- ** 关闭**
mongod -f /mongodb/conf/mongod.conf --shutdown
或者登陆到mongodb中,use到admin库下
use admin;
admin> db.shutdownServer()
或
admin> db.adminCommand({shutdown:1})
yml配置文件
https://docs.mongodb.com/manual/reference/configuration-options/
简易配置文件(yml)
/mongodb/conf/mongo.conf
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/data/"
processManagement:
fork: true
net:
port: 27017
bindIp: 10.0.0.51,127.0.0.1
mongodb 使用systemd管理
cat > /etc/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
- ** 数据操作语言crud**
https://docs.mongodb.com/v3.2/tutorial/getting-started/
- ** help**
help
db.help() help on db methods
db.mycoll.help() help on collection methods
sh.help() sharding helpers
rs.help() replica set helpers
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use <db_name> set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x set default number of items to display on shell
exit quit the mongo shell
- ** 查看版本**
db.version()
db. 数据库和数据库对象管理
rs. 复制集有关
sh. 集群有关
show
- ** 库**
db.help();
- ** 查看所有库**
show dbs;
- ** 进入库**
use 库名;
可以use 不存在的库
- ** 查看当前所在库**
db
db.getName();
- ** 删除test数据库**
test> show dbs
local 0.000GB
test 0.000GB
test> use test
switched to db test
test> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
- ** 查看当前数据库状态**
db.stats();
- ** 查看当前连接**
db.getMongo();
- ** 集合(表)**
- ** 查看集合**
show tables;
show collections;
- 创建集合
db.createCollection('t1');
- ** 查看集合**
db.t2.find();
{ "_id" : ObjectId("5ad69dd609c480f14ec7243c"), "name" : "xiaoming" }
{ "_id" : ObjectId("5ad69e0609c480f14ec7243d"), "name" : "xiaohong" }
{ "_id" : ObjectId("5ad69e0b09c480f14ec7243e"), "name" : "xiaolan" }
- ** 修改集合名**
db.t2.renameCollection('table2')
- ** 查看集合行数**
db.t3.find().count();
- ** 查询集合信息**
db.log.stats()
db.log.dataSize() //集合中数据的原始大小
db.log.totalIndexSize() //集合中索引数据的原始大小
db.log.totalSize() //集合中索引+数据压缩存储之后的大小
db.log.storageSize() //集合中数据压缩存储的大小
- ** 删除集合**
db.t1.drop()
- ** 文档**
- ** 插入文档**
db.t2.insert({name:"xiaoming"})
db.t3.insert({id:1,name:"zhangsan",age:20});
for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
- ** 查看文档**
db.t2.find({name:"xiaoming"});
db.t2.find({"_id" : ObjectId("5ad69e0b09c480f14ec7243e")})
{ "_id" : ObjectId("5ad69e0b09c480f14ec7243e"), "name" : "xiaolan" }
db.t3.insert({id:1,name:"zhangsan",age:20});
WriteResult({ "nInserted" : 1 })
db.t3.insert({id:2,name:"lisi",age:30});
WriteResult({ "nInserted" : 1 })
db.t3.find({id:2});
{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }
db.t3.find({name:"lisi"});
{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }
db.t3.find({age:30});
{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }
- ** 删除行**
db.log.remove({uid:1})
删除所有行
db.log.remove({})
- ** 去重**
db.log.distinct("name")
mongdb执行js脚本
repSetTest:PRIMARY> use tempdb
switched to db tempdb
repSetTest:PRIMARY> load("find.js")
用户管理
创建超级管理员
管理所有数据库
- 1、先use admin;
- 2,roles中的db必须是admin;
- 3、创建完用户后必须在登录时就指定验证数据库为admin
- 4、配置完成用户后要在配置文件中打开验证功能
**role:root, readWrite,read **
配置文件
security:
authorization: enabled
或者
auth=1
创建用户
db.createUser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
use admin
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
验证用户
db.auth('root','root123')
用户认证登录
mongo -uroot -proot123 10.0.0.51/admin
- ** 自定义数据库用户**
创建app数据库的管理员:先登录到admin数据库
use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)
验证用户
db.auth('admin','admin')
- ** 查看用户**
db.system.users.find().pretty()
- ** 创建数据库读、写权限的用户**
- ** 创建一个管理zabbix库的开发用户(rw)**
use zabbix
db.createUser(
{
user: "zabbix",
pwd: "zabbix",
roles: [ "readWrite" ]
}
)
- ** 创建一个针对zabbix库只读的用户**
use zabbix
db.createUser(
{
user: "zabbix1",
pwd: "zabbix1",
roles: [ "read" ]
}
)
- ** 删除用户**
mongo -uroot -proot123 10.0.0.51/admin
use oldboy1
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.51/admin
use oldboy1
db.dropUser("app02")
复制集技术
- ** 配置文件**
conf/mongod.conf
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
#cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
- ** 配置复制集**
(1)1主2从,从库普通从库
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.52:28017
'},
{_id: 1, host: '10.0.0.52:28018
'},
{_id: 2, host: '10.0.0.52:28019
'}]
}
rs.initiate(config)
- ** 复制集测试**
my_repl:PRIMARY> db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },
... { "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },
... ] );
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
my_repl:SECONDARY> db.movies.find().pretty();
rs.slaveOk();
- 查看复制集状态
rs.status(); //查看整体复制集状态
rs.isMaster(); // 查看当前是否是主节点
rs.add(“ip:port”); // 新增从节点
rs.addArb(“ip:port”); // 新增仲裁节点
rs.remove(“ip:port”); // 删除一个节点
添加特殊节点时
1>可以在搭建过程中设置特殊节点
2>可以通过修改配置的方式将普通从节点设置为特殊节点
/找到需要改为延迟性同步的数组号/;
cfg=rs.conf()
cfg.members[N].priority=0
cfg.members[N].slaveDelay=120
cfg.members[N].hidden=true
rs.reconfig(cfg)
[2] 索引下标
cfg.members[N].arbiterOnly=true
分片集群
mongos 路由
- 提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡
config server
- 存储集群所有节点、分片数据路由信息。默认需要配置3个ConfigServer节点
mongod
存储应用数据记录。一般有多个Mongod节点,达到数据分片目的
数据分布
初始1个chunk
缺省chunk 大小:64MB
MongoDB:自动拆分& 迁移chunks
- mongos的chunk自动迁移
- ** 分片键shard key**
必须为分片collection 定义分片键
基于一个或多个列(类似一个索引)
分片键定义数据空间
想象key space 类似一条线上一个点数据
一个key range 是一条线上一段数据
我们可以按照分片键进行Range和Hash分片
- ** 分片方式**
范围(range)分片
hash分片
- ** 分片注意事项**
分片键是不可变
分片键必须有索引
分片键大小限制512bytes
分片键用于路由查询
MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)
- ** 分片集群搭建**
- ** 规划**
- ** mongos**
port 29017
dir:/mongodb/29017/conf /mongodb/29017/log /mongod/29017/data
- ** confdb**
port:29018,29019,29020
replSetName: configReplSet
clusterRole: configsvr
dir:
/mongodb/29018/conf /mongodb/29018/log /mongod/29018/data
/mongodb/29019/conf /mongodb/29019/log /mongod/29019/data
/mongodb/29020/conf /mongodb/29020/log /mongod/29020/data
- ** shard1**
port:29021,29022,29023
replSetName: sh1
clusterRole: shardsvr
dir:
/mongodb/29021/conf /mongodb/29021/log /mongod/29021/data
/mongodb/29022/conf /mongodb/29022/log /mongod/29022/data
/mongodb/29023/conf /mongodb/29023/log /mongod/29023/data
- ** shard2**
port:29024,29025,29026
replSetName: sh2
clusterRole: shardsvr
dir:
/mongodb/29024/conf /mongodb/29024/log /mongod/29024/data
/mongodb/29025/conf /mongodb/29025/log /mongod/29025/data
/mongodb/29026/conf /mongodb/29026/log /mongod/29026/data
- ** 配置节点**
mkdir -p /mongodb/2902{1..6}/{bin,conf,log,data}
- ** 配置文件**
- 29021 29022 29023
cat /mongodb/29021/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/29021/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongod/29021/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 10.0.0.52
port: 29021
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
- 29024 29025 29026
cat /mongodb/29024/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/29024/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongod/29024/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 10.0.0.52
port: 29024
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
processManagement:
fork: true
- ** 创建数据目录**
mkdir -p /mongod/2902{1..6}/data
- ** 拷贝配置文件**
cp /mongodb/29021/conf/mongodb.conf /mongodb/29022/conf/
cp /mongodb/29021/conf/mongodb.conf /mongodb/29023/conf/
cp /mongodb/29021/conf/mongodb.conf /mongodb/29024/conf/
cp /mongodb/29021/conf/mongodb.conf /mongodb/29025/conf/
cp /mongodb/29021/conf/mongodb.conf /mongodb/29026/conf/
- ** 修改配置文件**
sed 's#29021#29022#g' /mongodb/29022/conf/mongodb.conf -i
sed 's#29021#29023#g' /mongodb/29023/conf/mongodb.conf -i
sed 's#29021#29024#g' /mongodb/29024/conf/mongodb.conf -i
sed 's#29021#29025#g' /mongodb/29025/conf/mongodb.conf -i
sed 's#29021#29026#g' /mongodb/29026/conf/mongodb.conf -i
- ** 启动所有节点**
mongod -f /mongodb/29021/conf/mongodb.conf
mongod -f /mongodb/29022/conf/mongodb.conf
mongod -f /mongodb/29023/conf/mongodb.conf
mongod -f /mongodb/29024/conf/mongodb.conf
mongod -f /mongodb/29025/conf/mongodb.conf
mongod -f /mongodb/29026/conf/mongodb.conf
#停止
mongod -f /mongodb/29024/conf/mongodb.conf --shutdown
- ** shard配置复制集**
- ** sh1**
29021操作
mongo --host 10.0.0.52 --port 29021
config = {_id: 'sh1', members: [
{_id: 0, host: '10.0.0.52:29021'},
{_id: 1, host: '10.0.0.52:29022'},
{_id: 2, host: '10.0.0.52:29023',"arbiterOnly":true}]
}
rs.initiate(config)
- ** sh2**
29024操作
mongo --host 10.0.0.52 --port 29024
config = {_id: 'sh2', members: [
{_id: 0, host: '10.0.0.52:29024'},
{_id: 1, host: '10.0.0.52:29025'},
{_id: 2, host: '10.0.0.52:29026',"arbiterOnly":true}]
}
rs.initiate(config)
- ** config节点配置**
mkdir -p /mongodb/290{18..20}/{conf,log,data}
- ** 配置文件 (29018 29019 29020)**
/mongodb/29018/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/29018/log/mongodb.conf
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/29018/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 10.0.0.52
port: 29018
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
cp /mongodb/29018/conf/mongodb.conf /mongodb/29019/conf/
cp /mongodb/29018/conf/mongodb.conf /mongodb/29020/conf/
sed 's#29018#29019#g' /mongodb/29019/conf/mongodb.conf -i
sed 's#29018#29020#g' /mongodb/29020/conf/mongodb.conf -i
- ** 启动config节点,并配置复制集**
启动
mongod -f /mongodb/29018/conf/mongodb.conf
mongod -f /mongodb/29019/conf/mongodb.conf
mongod -f /mongodb/29020/conf/mongodb.conf
登录
mongo --host 10.0.0.52 --port 29018
配置复制集
config = {_id: 'configReplSet', members: [
{_id: 0, host: '10.0.0.52:29018'},
{_id: 1, host: '10.0.0.52:29019'},
{_id: 2, host: '10.0.0.52:29020'}]
}
rs.initiate(config)
- ** mongos节点配置**
mkdir -p /mongodb/29017/{conf,log,data}
- ** 配置文件**
cat /mongodb/29017/conf/mongos.conf
systemLog:
destination: file
path: /mongodb/29017/log/mongos.log
logAppend: true
net:
bindIp: 10.0.0.52
port: 29017
sharding:
configDB: configReplSet/10.0.0.52:29018,10.0.0.52:29019,10.0.0.52:29020
processManagement:
fork: true
- ** 启动mongos**
mongos -f /mongodb/29017/conf/mongos.conf
- 分片集群操作
- 连接到mongs的admin数据库
mongo 10.0.0.52:29017/admin
- ** 添加分片**
db.runCommand( { addshard : "sh1/10.0.0.52:29021,10.0.0.52:29022,10.0.0.52:29023",name:"shard1"} )
db.runCommand( { addshard : "sh2/10.0.0.52:29024,10.0.0.52:29025,10.0.0.52:29026",name:"shard2"} )
- ** 列出分片**
db.runCommand( { listshards : 1 } )
- ** 整体状态查看**
sh.status();
- ** +++++++++++++++扩展**
1、激活数据库分片功能
admin> ( { enablesharding : "数据库名称" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )
2、指定分片建对集合分片
eg:范围片键
–创建索引
admin> db.vast.ensureIndex( { id: 1 } )
admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
3、集合分片验证
admin> use test
test> for(i=0;i<2000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()
3、分片键
–范围片键
admin> sh.shardCollection("数据库名称.集合名称",key : {分片键: 1} )
或
admin> db.runCommand( { shardcollection : "数据库名称.集合名称",key : {分片键: 1} } )
eg:
admin > sh.shardCollection("test.vast",key : {id: 1} )
或
admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
–哈希片键
admin > sh.shardCollection( "数据库名.集合名", { 片键: "hashed" } )
eg:
创建哈希索引
admin> db.vast.ensureIndex( { a: "hashed" } )
admin > sh.shardCollection( "test.vast", { a: "hashed" } )
4、判断是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
5、列出所有分片信息
admin> db.runCommand({ listshards : 1})
6、列出开启分片的数据库
admin> use config
config> db.databases.find( { "partitioned": true } )
config> db.databases.find() //列出所有数据库分片情况
7、查看分片的片键
config> db.collections.find()
{
"_id" : "test.vast",
"lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
"lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
"dropped" : false,
"key" : {
"id" : 1
},
"unique" : false
}
8、查看分片的详细信息
admin> db.printShardingStatus()
或
admin> sh.status()
9、删除分片节点
sh.getBalancerState()
mongos> db.runCommand( { removeShard: "shard2" } )
10、blancer操作
mongos> sh.stopBalancer()
mongos> sh.startBalancer()
自定义 自动平衡进行的时间段
// connect to mongos
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "00:00", stop : "5:00" } } }, true )
关于集合的balance
关闭某个集合的balance
sh.disableBalancing("students.grades")
打开某个集合的balance
sh.enableBalancing("students.grades")
确定某个集合的balance是开启或者关闭
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
备份恢复
https://www.mongodb.com/try/download/database-tools
备份工具
- mongoexport / mongoimport json 或 csv
1、异构平台迁移 mysql <—> mongodb
2、同平台,跨大版本:mongodb 2 ----> mongodb 3
- mongodump / mongorestore bson
日常备份恢复
mongoexport / mongoimport
mongoexport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin
创建数据
use oldguo
for(i=0;i<200;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.vast.find()
- ** 导出**
mongoexport -h 10.0.0.51:29021 -uroot -proot123 --authenticationDatabase admin -d app -c vast -o /backup/mongodb/vast.json
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast -o /mongodb/vast.json
- ** json格式**
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast -o /backup/mongodb/vast.json
- ** csv格式**
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast --type=csv -f id,name -o /backup/mongodb/vast.csv
- ** 导入**
- ** json格式**
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast --drop /backup/mongodb/vast.json
- ** csv格式**
mongoimport -uroot -proot123 --port 27017 -uroot -proot123 --authenticationDatabase admin -d app -c vast --drop -f id,name --type=csv --headerline --file=/backup/mongodb/vast.csv
mysql导出csv
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city --type=csv -f ID,Name,CountryCode,District,Population --file /tmp/city1.csv
#备份单表
mongoexport --host x.x.x.x --port 27017 -uadmin -pxxx --authenticationDatabase admin -d 库 -c 表 -o 指定备份文件名
#恢复单表
mongoimport --host x.x.x.x --port 27017 -uadmin -pxxx --authenticationDatabase admin -d 库 -c 表 --file 指定备份文件名
mongodump和mongorestore
介绍
-
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。
-
但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,
-
则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。
mongodump用法
$ mongodump --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
-j, --numParallelCollections= number of collections to dump in parallel (4 by default)
--oplog 备份的同时备份oplog
全库备份
mkdir /mongodb/backup
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
备份oldguo库
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/
备份oldguo库下的vast集合
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c vast -o /mongodb/backup/
压缩备份
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/ --gzip
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c vast -o /mongodb/backup/ --gzip
恢复world库
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world /mongodb/backup/world
恢复oldguo库下的vast集合
[mongod@db03 oldboy]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast --gzip /mongodb/backup.bak/oldboy/log1.bson.gz
drop表示恢复的时候把之前的集合drop掉(危险)
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
mongodump和mongorestore高级企业应用(–oplog)
注意:这是replica set或者master/slave模式专用
–oplog
use oplog for taking a point-in-time snapshot
oplog介绍
在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过–oplogSizeMB参数修改).
位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
想要查看当前的oplog时间窗口预计值,可以使用以下命令:
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
use local
db.oplog.rs.find().pretty()
"ts" : Timestamp(1553597844, 1),
"op" : "n"
"o" :
"i": insert
"u": update
"d": delete
"c": db cmd
test:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)
oplog企业级应用
(1)实现热备,在备份时使用–oplog选项
注:为了演示效果我们在备份过程,模拟数据插入
(2)准备测试数据
use oldboy
for(var i = 1 ;i < 100; i++) {
db.foo.insert({a:i});
}
my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()
oplog 配合mongodump实现热备
mongodump --port 28017 --oplog -o /mongodb/backup
作用介绍:–oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来
恢复
mongorestore --port 28017 --oplogReplay /mongodb/backup
oplog高级应用
背景:每天0点全备,oplog恢复窗口为48小时
某天,上午10点world.city 业务表被误删除。
恢复思路:
0、停应用
2、找测试库
3、恢复昨天晚上全备
4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库
5、将误删除表导出,恢复到生产库
恢复步骤:
模拟故障环境:
1、全备数据库
模拟原始数据
mongo --port 28017
use wo
for(var i = 1 ;i < 20; i++) {
db.ci.insert({a: i});
}
全备:
mongodump --port 28017 --oplog -o /mongodb/backup
–oplog功能:在备份同时,将备份过程中产生的日志进行备份
文件必须存放在/mongodb/backup下,自动命令为oplog.bson
再次模拟数据
db.ci1.insert({id:1})
db.ci2.insert({id:2})
2、上午10点:删除wo库下的ci表
10:00时刻,误删除
db.ci1.drop()
show tables;
3、备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/backup
4、截取oplog并恢复到drop之前的位置
更合理的方法:登陆到原数据库
mongo --port 28017
my_repl:PRIMARY> use local
db.oplog.rs.find({op:"c"}).pretty();
{
"ts" : Timestamp(1553659908, 1),
"t" : NumberLong(2),
"h" : NumberLong("-7439981700218302504"),
"v" : 2,
"op" : "c",
"ns" : "wo.$cmd",
"ui" : UUID("db70fa45-edde-4945-ade3-747224745725"),
"wall" : ISODate("2019-03-27T04:11:48.890Z"),
"o" : {
"drop" : "ci"
}
}
获取到oplog误删除时间点位置:
“ts” : Timestamp(1553659908, 1)
5、恢复备份+应用oplog
[mongod@db03 backup]$ cd /mongodb/backup/local/
[mongod@db03 local]$ ls
oplog.rs.bson oplog.rs.metadata.json
[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson
rm -rf /mongodb/backup/local/
mongorestore --port 28017 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/