MongoDB学习笔记

==============================MongoDB学习笔记=================================
###MongoDB特点
性能、高可用性(副本集,自身带有)、水平可扩展性、支持多种引擎

###MongoDB安装部署
1. 下载
https://www.mongodb.com/download-center/community
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
2. 数据目录、安装目录创建
mkdir /opt/mongo_27017/{conf,logs,pid} -p
mkdir /data/mongo_27017 -p
3. 解压
tar xf mongodb-linux-x86_64-3.6.13.tgz -C /usr/local/
ln -s mongodb-linux-x86_64-3.6.13 mongodb
4. 配置文件准备
cat>/opt/mongo_27017/conf/mongodb.conf<<EOF
systemLog:
destination: file #Mongodb 日志输出的目的地,指定一个 file 或者 syslog,如果指定 file,必须指定
logAppend: true #当实例重启时,不创建新的日志文件,在老的日志文件末尾继续添加
path: /opt/mongo_27017/logs/mongodb.log #日志路径
storage:
journal: #回滚日志
enabled: true
dbPath: /data/mongo_27017 #数据存储目录
directoryPerDB: true #认 false,不适用 inmemory engine
wiredTiger:
engineConfig:
cacheSizeGB: 1 #将用于所有数据缓存的最大小
directoryForIndexes: true #认 false 索引集合 storage.dbPath 存储在数据单独子目录
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement: #使用处理系统守护进程的控制处理
fork: true #后台运行
pidFilePath: /opt/mongo_27017/pid/mongod.pid #创建 pid 文件
net:
port: 27017 #监听端口
bindIp: 127.0.0.1,10.0.0.51 #绑定 ip
EOF
5. 启动(初始化)
/usr/local/mongodb/bin/mongod -f /opt/mongo_27017/conf/monogdb.conf
或mongod --dbpath=/opt/mongo_27017/data --logpath=/opt/mongo_27017/logs/mongodb.log --port=27017 --logappend --fork
6. 检查
ps -ef|grep mongo
netstat -lntup|grep 27017
7. 添加环境变量
echo 'PATH=$PATH:/usr/local/mongodb/bin' >> /etc/profile
8. 创建hosts解析(可不做)#用于登陆时可以用主机名登陆,不用ip
cat > /etc/hosts <<EOF
10.0.1.51 db01
EOF
9. 设置systemctl启动方式
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 /opt/mongo_27017/conf/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /opt/mongo_27017/conf/mongodb.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
10. 登陆mongodb
mongo localhost:27017
11. mongodb的关闭
方式一:
mongo localhost:27017
use admin
db.shutdownServer()
方式二:
mongod -f /opt/mongo_27017/conf/monogdb.conf --shutdown
12. 警告优化
#普通用户登陆
useradd mongo
echo '123456'|passwd --stdin mongo
chown -R mongo:mongo /opt/
chown -R mongo:mongo /data/
切换到普通用户启动,登陆。
注:在进行更改之前需要关闭mongodb,切换到普通用户再启动,否则导致启动新生成文件为root用户所有,普通用户无法启动。
#关闭大内存页
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
echo never > /sys/kernel/mm/transparent_hugepage/enabled #临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/defrag #临时关闭
---永久关闭---
vim /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# required-Start: $local_fs
# required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: disable Linux transparent huge pages
# Description: disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO

case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag
re='^[0-1]+$'
if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi
unset re
unset thp_path
;;
esac
------------------------------------------
chmod 755 /etc/init.d/disable-transparent-hugepages #授权
chkconfig --add disable-transparent-hugepages #加入开机自启
chkconfig --list|grep disable
#内存问题
mongodb对内存要求很高,如果提示内存警告信息,则提高内存或者配置文件将缓存大小调小
grep "cacheSizeGB" /opt/mongo_27017/conf/monogdb.conf
cacheSizeGB: 1
#访问安全
配置文件中开启安全认证
security:
authorization: enabled

###mongodb库说明
test:登录认存在的库
admin 库:系统预留库,MongoDB 系统管理库
local 库:本地预留库,存储关键日志
config 库:MongoDB 配置信息库

###mongodb基本操作命令
show databases/show dbs #查看所有数据库
show tables/show collections #查看库中所有集(表)
use admin #移动到库中
db #查看当前库
db.help() 显示数据库方法的帮助。
db.<collection>.help() 显示收集方法的帮助, <collection>可以是现有的集合或不存在的集合的名称
show dbs 打印服务器上所有数据库的列表。
use <db> 将当前数据库切换到<db>。该 mongoshell 变量 db 被设置为当前数据库
show collections 打印当前数据库的所有集合的列表
show users 打印当前数据库用户列表。
show roles 打印用于当前数据库用户定义和内置的所有角色的列表。
show profile 打印需要 1 毫秒或更多的五个最近的操作。有关详细信息,请参阅数据库分析器上的文档。
show databases 打印所有可用数据库的列表。
load() 执行一个 JavaScript 文件
db.dropDatabase() 删库
db.createCollection('a') 创建集
rs.[TAB][TAB] 复制集相关
rs.help() 复制集命令帮助
sh.[TAB][TAB] 分片集群相关
sh.help() 分片命令帮助
##数据插入
https://docs.mongodb.com/guides/server/read_queries/
db.集合名.insert({key:value数据})
#db.test.insert({"name":"zwd","age":27,"ad":"北京市朝阳区"})
db.集合名。insertOne({key:value数据}) #单行插入
#db.test.insertOne({"name":"zwd","age":28,"ad":"北京市朝阳区"}) #与普通插入的差别在于有insertid号记录
db.集合名.insertMany({key:value,key:value},{key:value,key:value}) #多行插入
#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" }
]);
#循环插入数据
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}
##数据查询
db.集合名.find() #查询所有数据
db.集合名.findOne() #查询单条数据,未指定则认第一条
db.集合名.find({key:value}) #指定查询内容
#db.inventory.find( { status: "D" } )
db.集合名.find({"key.key1":value}) #嵌入式查询
#db.inventory.find( { "size.uom": "in" } )
db.集合名.find({key:value,key:value}) #and查询
#db.inventory.find( { status: "A", qty: { $lt: 30 } } ) #$lt小于等于30
db.集合名.find($or:{key:value,key:value}) #or查询
#db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
db.集合名.find({key:value,key:/正则匹配/}) #正则查询
#db.inventory.find( {status: "A",$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]} )
db.集合名.find({key:value}).pretty() #以标准的json格式显示数据
#db.log.find({uid:999}).pretty()
##数据修改(更新)
db.库名.updateOne({key:value}匹配需要修改的集,{$set{key:value,key:value}修改内容,$currentDate:{"lastModified":true}记录更改时间}) #更改单个文档
#db.inventory.updateOne(
{ "item" : "paper" }, // specifies the document to update
{
$set: { "size.uom" : "cm", "status" : "P" },
$currentDate: { "lastModified": true }
}
)
db.库名.updateMany({key:value}匹配需要修改的集,{$set{key:value,key:value}修改内容(条件),$currentDate:{"lastModified":true}记录更改时间}) #更改多个文档,通过条件范围
#db.inventory.updateMany(
{ "qty" : { $lt: 50 } }, // specifies the documents to update
{
$set: { "size.uom" : "cm", "status": "P" },
$currentDate : { "lastModified": true }
}
)
##数据删除
https://docs.mongodb.com/guides/server/delete/
db.集合名.deleteOne({key:value}) #删除单个数据,多个的话认第一个
#db.inventory.deleteOne(
{ "status": "D" } // specifies the document to delete
)
db.集合名.deleteMany({key:value}) #删除匹配到的所有数据
#db.inventory.deleteMany(
{ "status" : "P" } // specifies the documents to delete
)
##索引创建
db.test.find({"age":{ $lt: 30 }}).explain() #查看语句的执行计划,COLLSCAN全扫描不走索引,IXSCAN索引扫描
db.people.createIndex({zipcode:1},{background:true}) #为数据创建索引
db.test.getIndexes() #查看索引情况
db.test.dropIndex({ age: 1 } ) #索引删除

###mongodb工具
https://docs.mongodb.com/manual/reference/program/
1. Mongod 是 Mongodb 系统的主要守护进程,它处理数据请求,管理数据访问,并执行后台 管理操作。启动进程指定配置文件,控制数据库的行为
2. mongos 对于“ MongoDBShard”,是用于处理来自应用层的查询的 MongoDB 分片配置的路由服务,并确 定此数据在分片集群中的位置, 以完成这些操作。从应用程序的角度来看,一个 mongos 实例与任何其他 MongoDB 实例的行为相同。
3. Mongostat 实用程序可以快速概览当前正在运行的 mongod 或 mongos 实例的状态。mongostat 在功能上 类似于 UNIX / Linux 文件系统实用程序 vmstat,但提供有关的数据 mongod 和 mongos 实例
4. Mongotop 提供了一种跟踪 MongoDB 实例读取和写入数据的时间量的方法。 mongotop 提供每个收集级别 的统计信息。认情况下,mongotop 每秒返回一次值
5. Mongooplog 是一个简单的工具,可以从远程服务器的复制 oplog 轮询操作,并将其应用于本地服务器。此功 能支持某些类型的实时迁移,这些迁移要求源服务器保持联机并在整个迁移过程中运行。通常,此命令将采用以下 形式:

###用户权限管理
##操作命令(操作时use到相应库再进行操作)
db.auth() 将用户验证到数据库
db.changeUserPassword() 更改现有用户的密码。
db.createuser() 创建一个新用户
db.dropUser() 删除单个用户
db.dropAllUsers() 删除数据库关联的所有用户
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.removeUser() 已过时。从数据库删除用户
db.revokeRolesFromUser() 从用户删除角色。
db.updateUser() 更新用户数据
##注意
验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库
2. 登录时,必须明确指定验证库才能登录
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录数据库,不进行use,认的验证库是test,不是我们生产建议的.
5. 从3.6 版本开始,不添加bindIp参数,认不让远程登录,只能本地管理员登录
##用户创建
#基本语法
use admin
db.createuser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
#基本语法说明:
user:用户名
pwd:密码
roles:
role:角色名
db:作用对象
role:root, readWrite,read
验证数据库
mongo -u oldboy -p 123 10.0.0.53/oldboy
#实例
注:创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongo
use admin
db.createuser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
#配置文件配置开启认证
security: #认证
authorization: enabled #启用或者禁用基于角色的访问控制来管理每个用户数据库资源和操作的访问 enabled 或者 disables
注:更改配置文件需要重启
#查看用户
db.getUsers()
#登陆之后进行密码验证
mongo localhost:27017
use test
db.auth("root","root123")
#登陆直接进行认证
例:mongo db01:27017 -u root -p root123 --authenticationDatabase admin #admin为验证库 #配置了hosts解析可以直接用主机名,否则用ip
例:mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
#多库不同权限实例
use test
db.createuser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "test2" } ]
}
)
注:test库有读写权限,对test2库只有读的权限

###副本集搭建
https://docs.mongodb.com/manual/tutorial/deploy-replica-set/
##原理:基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) paxosMysqL MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。
##搭建流程
注:搭建之前需要配置文件中配置副本集相关配置
replication:
oplogSizeMB: 2048 #相当与MysqL中的binlog日志
replSetName: my_repl #副本集名称,下面构建需要,且必须与此保持一致(_id: 'my_repl')
#普通RS搭建一主两从
略,见附件
#1主1从1个arbiter
略,见附件
#特殊从节点
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
搭建:见附件
##副本集其他操作命令
rs.conf() #查看副本集各成员状态属性
rs.status() #副本集状态查询
rs.stepDown() #副本集角色切换(不要人为随便操作),单位为秒
rs.freeze(300) #锁定从库。使其不会转变为主库,单位为秒
rs.slaveOk() #设置副本集从节点可读,在副本集从节点上执行(从节点上查看主节点更新的数据,不使用这个命令,认为不可读)
rs.printSlaveReplicationInfo() #查看副本集从节点,监控主从延时情况
rs.isMaster() #查看当前是否为主节点
rs.remove("ip:port") #删除一个节点
rs.add("ip:port") #新增从节点
rs.addArb("ip:port") #新增仲裁节点
cfg=rs.conf() #开启一个配置
rs.reconfig(cfg) #保存配置
##延时节点,通常会配合hidden(隐藏)
#设置
cfg=rs.conf()
cfg.members[2].priority=0 #数字2为节点顺序位置从0开始,不是id号
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)
#取消配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
##权重调节
登陆主节点
config = rs.conf()
config.members[0].priority=100
rs.reconfig(config)
注:调节权重后会进行重先选主,再次调节需要移到最新的主节点设置权重,需要比前面那个高
##主动降权
rs.stepDown()
注:使用此操作之后,主节点将会变成从节点,并开始重先选主

###分片集群
##原理和结构:
mongos:sharded cluster的访问入口,充当着数据进入后路由的功能,将数据依照配置分到不同的分片上。
config server:mongos本身不持久化数据,sharded cluster所有的元数据都会存储到config server上。
shard:用户数据会分散到各个shard上。
注:mongos启动以后会从config server加载元数据,开始提供服务,将用户请求正确路由到对应的shard上。
#两个分片方式:
范围分片:
集合是根据字段来进行分片。根据字段的范围不同将一个集合的数据存储在不同的分片中。
在同一个Shard上,每个Shard可以存储很多个chunk,chunk存储在哪个shard的信息会存储在Config server中,mongos也会根据各个shard上的chunk的数量自动负载均衡。
范围分片适合满足在一定范围内的查找,例如查找X的值在【100-200】之间的数据,mongo 路由根据Config server中存储的元数据,可以直接定位到指定的shard的Chunk中
缺点:如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力
hash分片:
Hash分片是根据用户的shard key计算hash值(64bit整型),根据hash值按照『范围分片』的策略将文档分布到不同的chunk
优点:Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,
缺点:但不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。
#合理选择
选择shard key时,要根据业务的需求及『范围分片』和『Hash分片』2种方式的优缺点合理选择,要根据字段的实际原因对数据进行分片,否则会产生过大的Chunk
#详细说明
Mongos:Mongos作为Sharded cluster的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。
查询请求:查询请求不包含shard key,则必须将查询分发到所有的shard,然后合并查询结果返回给客户端。查询请求包含shard key,则直接根据shard key计算出需要查询的chunk,向对应的shard发送查询请求
1. 写请求
写操作必须包含shard key,mongos根据shard key算出文档应该存储到哪个chunk,然后将写请求发送到chunk所在的shard。
2. 更新/删除请求
更新、删除请求的查询条件必须包含shard key或者_id,如果是包含shard key,则直接路由到指定的chunk,如果只包含_id,则需将请求发送至所有的shard。
3. 其他
config server:
1. config database
Config server存储Sharded cluster的所有元数据,所有的元数据都存储在config数据库
Config Server可部署为一个独立的复制集,极大的方便了Sharded cluster的运维管理。
2. config.shards
config.shards集合存储各个Shard的信息,可通过addShard、removeShard命令来动态的从Sharded cluster里增加或移除shard
3. config.databases
config.databases集合存储所有数据库的信息,包括DB是否开启分片,primary shard信息,对于数据库内没有开启分片的集合,所有的数据都会存储在数据库的primary shard上。
4. config.colletions
数据分片是针对集合维度的,某个数据库开启分片功能后,如果需要让其中的集合分片存储,则需调用shardCollection命令来针对集合开启分片。
5. config.chunks
集合分片开启后,认会创建一个新的chunk,shard key取值[minKey, maxKey]内的文档(即所有的文档)都会存储到这个chunk。当使用Hash分片策略时,也可以预先创建多个chunk,以减少chunk的迁移。
6. config.settings
config.settings集合里主要存储sharded cluster的配置信息,比如chunk size,是否开启balancer等
7. config.tags
主要存储sharding cluster标签(tag)相关的
8. config.changelog
主要存储sharding cluster里的所有变更操作,比如balancer迁移chunk的动作就会记录到changelog里
9. config.mongos
存储当前集群所有mongos的信息
10. config.locks
存储锁相关的信息,对某个集合进行操作时,比如moveChunk,需要先获取锁,避免多个mongos同时迁移同一个集合的chunk。
##构建
见附件

###mongodb备份与恢复
##工具
mongoexport/mongoimport **
mongodump/mongorestore *****
##区别
mongoexport/mongoimport 格式可以为json和csv(Excel格式)
1、异构平台迁移 MysqL <---> mongodb
2、同平台,跨大版本:mongodb 2 ----> mongodb 3
mongodump/mongorestore 物理形式备份,支持在线状态备份
日常备份恢复时使用.
##mongoexport导出工具
$ mongoexport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件
-q:指明导出数据的过滤条件
--authenticationDatabase admin
1. 单表备份为json格式:
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d old1 -c log -o /mongodb/log.json
注:备份文件的名字可以自定义认导出了JSON格式的数据。
2. 单表备份为csv格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
注:--type为指定备份格式
##mongoimport导入工具
$ mongoimport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
-j, --numInsertionWorkers=<number> number of insert operations to run concurrently
1. json格式数据恢复
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d old1 -c log1 /mongodb/log.json
2. csv格式数据恢复
方式一:csv格式的文件头行,有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d old1 -c log2 --type=csv --headerline --file /mongodb/log.csv
方式二:csv格式的文件头行,没有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d old2 -c log3 --type=csv -f id,name,age,date --file /mongodb/log.csv
注:--headerline:指明第一行是列名,不需要导入。
##异构平台迁移案例
1. 目标:将MysqL数据库数据导出,导入到mongodb
2. MysqL配置文件配置
vim /etc/my.cnf --->添加以下配置
secure-file-priv=/tmp
3. 重启数据库
/etc/init.d/MysqLd restart
4. 导出MysqL中city表数据
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
5. 处理导出文件
vim /tmp/city.csv
在首行添加该表对应的字段信息:ID,Name,CountryCode,district,Population
6. mongodb中导入备份
#若前面没有在文件首行添加字段,采用此种方式
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city --type=csv -f ID,Name,CountryCode,district,Population --file /tmp/city1.csv
#若前面对文件进行了手动添加,则:
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city --type=csv --headerline --file /tmp/city1.csv
7. mongodb中查看
use world
db.city.find() #显示20行
8. 导出一个库中的所有表
select table_name ,group_concat(column_name) from columns where table_schema='world' group by table_name; #查看库中的所有字段名
select concat("select * from ",table_schema,".",table_name ," into outfile '/tmp/",table_schema,"_",table_name,".csv' fields terminated by ',';")
from information_schema.tables where table_schema ='world'; #导出world库中的所有表,格式为csv
注:使用infomation_schema.columns + information_schema.tables
说明:fields terminated by ','表示导出的数据字段之间用逗号分隔,相似的还有
fields terminated by ','    ------字段间以,号分隔
optionally enclosed by '"'   ------字段用"号括起
escaped by '"'        ------字段中使用的转义符为"
lines terminated by '\r\n';  ------行以\r\n结束
##mongodump说明
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。
但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,
则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。
$ 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
##mongodump和mongorestore基本使用
#全库备份
mkdir /mongodb/backup
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
#备份单库
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/
#备份库下的指定集
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d old1 -c log -o /mongodb/backup/
#压缩备份
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d old2 -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
#恢复库
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
#恢复库下的集
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz
#恢复之前先把之前的集合drop掉(危险)
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d old1 --drop /mongodb/backup/old1

###mongodump和mongorestore高级企业应用(--oplog)
说明:--oplog,这是replica set或者master/slave模式专用
#oplog介绍
在replica set中oplog是一个定容集合(capped collection),它的认大小是磁盘空间的5%(可以通过--oplogSizeMB参数修改
位于local库的db.oplog.rs,其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。当空间用完时新记录自动覆盖最老的记录,其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
查看当前的oplog时间窗口预计值,可以使用以下命令:
use local
db.oplog.rs.find().pretty()
注:在倒数第四行含有hrs字样,预计窗口覆盖时间

###oplog企业级应用
见附件

###升级
1.首先确保是副本集状态
2.先关闭 1 个副本节点
3.检测数据是否可以升级
4.升级副本节点的可执行文件
5.更新配置文件
6.启动升级后的副本节点
7.确保集群工作正常
8.滚动升级其他副本节点
9.最后主节点降级
10.确保集群 可用
11.关闭降级的老的主节点
12.升级老的主节点
13.重新加入集

相关文章

MongoTemplate 是Spring Data MongoDB 中的一个核心类,为 S...
笔者今天要分享的是一个项目重构过程中如何将数据库选型由原...
mongodb/mongoTemplate.upsert批量插入更新数据的实现
进入官网下载官网安装点击next勾选同意,点击next点击custom...
头歌 MongoDB实验——数据库基本操作
期末考试复习总结