zoukankan      html  css  js  c++  java
  • 010.MongoDB备份恢复

    一 MongoDB备份

    1.1 备份概述

    mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
    mongodump备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的。在获取快照后,服务器还会有数据写入,为了保证备份的安全,可以利用fsync锁使服务器数据暂时写入缓存中。
    mongodb备份恢复方式通常有以下三种:
    1. 文件快照方式
    2. 复制数据文件方式
    3. 使用mongodump和mongorestore方式

    1.2 文件快照方式

    此方式相对简单,需要系统文件支持快照和mongod必须启用journal。可以在任何时刻创建快照。
    恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。

    1.3 复制数据文件方式

    直接拷贝数据目录下的一切文件,但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。
      1 > db.fsyncLock()		#锁定,将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。
      2 # cp -R /data/db/* /backup	#拷贝数据文件到备份目录下
      3 > db.fsyncUnlock()		#文件复制完成后,对数据库进行解锁,允许写操作
     
    注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。
    恢复时,确保mongod没有运行,清空数据目录,将备份的数据拷贝到数据目录下,然后启动mongod
      1 # cp -R /backup/* /data/db/
      2 # mongod -f mongod.conf
     

    1.4 mongodump数据备份

    在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。
    mongodump命令可以通过参数指定导出的数据量级转存的服务器。
    语法格式:
      1 > mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径
    参数解释:
    参数
    全称
    默认值
    参考释义
     
    --help
     
    查看mongodump命令的使用帮助
     
    --version
     
    返回mongodump的版本号
    -h
    --host <hostname><:port>
    localhost:27017
    指定mongod要连接的主机名及端口号
    -u
    --username <username>
     
    指定用于向开启认证的MongoDB数据库的用户名,与--password和--authenticationDatabase结合使用。
    -p
    --password <password>
     
    指定用于向使用认证的MongoDB数据库的密码,与--username和 --authenticationDatabase选项结合使用。
    -d
    --db <database>
     
    指定要备份的数据库。如果不指定,mongodump会将此实例中的所有数据库备份。
    -c
    --collection <collection>
     
    指定要备份的集合。如果不指定,则会将指定数据库或实例中的所有集合备份。
     
    --gzip
     
    压缩输出,如果mongodump指定导出到目录,则该选项会将每个文件都压缩,并添加.gz后缀;
    如果mongodump指定导出到文档或标准输出流,则该选项会压缩到文档或输出流中。
    -o
    --out <path>
     
    指定导出数据的目录路径,如不指定,则mongodump默认将文件输出到dump所在的工作目录中。该选项不能和--archive一起使用
    提示:
    如果没有用户谁,可以去掉-u和-p;
    如果导出本机的数据库,可以去掉-h;
    如果是默认端口,可以去掉--port;
    如果想导出所有数据库,可以去掉-d。
    fsyncLock与mongodump不能一起使用,如果数据库被锁定了,mongodump将永远挂起。使用mongodump备份比较慢。通常mongodump用来备份单个数据库、集合、子集合。

    1.5 mongorestore数据恢复

    在Mongodb中我们使用mongorestore命令来恢复MongoDB数据。该命令可以从指定目录恢复相应数据。
    语法格式:
      1 > mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 <path> --dir 文件存在路径
    参数解释:
    参数
    全称
    默认值
    参考释义
     
    --help
     
    查看mongorestore命令的使用帮助
     
    --version
     
    返回mongorestore的版本号
    -h
    --host <hostname><:port>
    localhost:27017
    指定mongod要连接的主机名及端口号
    -u
    --username <username>
     
    指定用于向开启认证的MongoDB数据库的用户名,与--password和--authenticationDatabase结合使用。
    -p
    --password <password>
     
    指定用于向使用认证的MongoDB数据库的密码,与--username和 --authenticationDatabase选项结合使用。
    -d
    --db <database>
     
    指定需要恢复的数据库实例。可以和备份时的数据库名称不一样。
    -c
    --collection <collection>
     
    指定要备份的集合。如果不指定,则会将指定数据库或实例中的所有集合备份。
     
    <path>
     
    mongorestore 最后的一个参数,设置备份数据实例所在位置。
     
    --dir <path>
     
    指定备份数据所在的目录路径。
     
    --drop
     
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,备份后至恢复操作中间时间段添加修改的数据都会被删除,慎用!
    注意:不能同时指定 <path> 和 --dir 选项。

    二 mongodump备份实例

    2.1 模拟插入数据

      1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
      2 > use admin
      3 > db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
      4 > db.grantRolesToUser( "admin",[{ role: "restore",db:"admin" }])
      5 > db.grantRolesToUser( "admin",[{ role: "backup",db:"admin" }])
      6 > use mydb
      7 > for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
     

    2.2 备份所有数据

      1 [root@client ~]# mongodump --host 172.24.8.71 -u admin -p admin -o allbackup/

    2.3 备份指定数据

      1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -u admin -p admin -o mydbbackup/ --authenticationDatabase admin

    2.4 备份指定集合

      1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -c user -u admin -p admin -o usercobackup/ --authenticationDatabase admin
    提示:严格来说,备份只需要读权限即可。

    三 mongorestore还原实例

    3.1 恢复所有数据库

      1 [root@client ~]# mongorestore --host 172.24.8.71 -u admin -p admin --dir allbackup/

    3.2 恢复指定数据

      1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -u admin -p admin --dir mydbbackup/mydb/ --authenticationDatabase admin

    3.3 恢复指定集合

      1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -c user -u admin -p admin --dir usercobackup/mydb/user.bson --authenticationDatabase admin
    提示:严格来说,恢复只需要读写权限即可。

    四 mongoexport导出

    4.1 mongoexport导出

    参数
    全称
    默认值
    参考释义
     
    --help
     
    查看mongoexport命令的使用帮助
     
    --version
     
    返回mongoexport的版本号
    -h
    --host <hostname><:port>
    localhost:27017
    指定mongod要连接的主机名及端口号
    -u
    --username <username>
     
    指定用于向开启认证的MongoDB数据库的用户名,与--password和--authenticationDatabase结合使用。
    -p
    --password <password>
     
    指定用于向使用认证的MongoDB数据库的密码,与--username和 --authenticationDatabase选项结合使用。
    -d
    --db <database>
     
    指定需要导出的数据库实例。
    -c
    --collection <collection>
     
    指定要导出的集合。
    -f
    --fields <field1[,field2]>
     
    指定导出时只导出一个或多个字段,导出多个时,需要使用逗号分隔;
    -q
    --query <JSON>
     
    提供查询文档作为导出数据源
     
    --type<string>
    json
    指定要导出的文件类型,可选值:json,csv
    -o
    --out <file>
     
    指定要导出的文件路径(含文件名),如果不指定,则会导出为标准输出(例如stdout)

    4.2 导出指定数据库集合

      1 [root@client ~]# mongoexport --host 172.24.8.71 -d mydb -c user -u admin -p admin -o allexport/myuser.json --authenticationDatabase admin

    五 mongoimport导入

    5.1 mongoimport导出

    参数
    全称
    可选值
    参考释义
     
    --help
     
    查看mongoimport命令的使用帮助
     
    --version
     
    返回mongoimport的版本号
    -h
    --host <hostname><:port>
    localhost:27017(默认值)
    指定mongod要连接的主机名及端口号
    -u
    --username <username>
     
    指定用于向开启认证的MongoDB数据库的用户名,与--password和--authenticationDatabase结合使用。
    -p
    --password <password>
     
    指定用于向使用认证的MongoDB数据库的密码,与--username和 --authenticationDatabase选项结合使用。
    -d
    --db <database>
     
    指定需要导入的数据库实例。
    -c
    --collection <collection>
     
    指定要导入的集合。
     
    --file <path>
     
    指定导入数据所在的目录路径。
     
    --drop
     
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
     
    --headerline
     
    使用第一行作为字段名称
     
    --ignoreBlanks
     
    忽略要导入文件中的空字段,如果不指定该参数,则默认会读取空字段并创建
     
    --type <json|csv|tsv>
    json(默认值),csv,tsv
    要导入的文件类型,另外支持tsv
     
    --mode <insert|upsert|merge>
    insert(插入),
    upsert(替换数据库中的文档),
    merge(合并)
    指定导入过程中,如何应对数据库文档与导入文件中的文档匹配
    (默认会使用_id字段对比)的情况

    5.2 导入指定数据库集合

      1 [root@client ~]# mongoimport --host 172.24.8.71 -d mydb -c user -u admin -p admin --file allexport/myuser.json --authenticationDatabase admin

    六 复制集和分片备份恢复

    参考:https://blog.csdn.net/zhu_tianwei/article/details/44514673

    七 其他备份方式

    7.1 脚本备份

      1 #!/bin/sh
      2 DUMP=mongodump
      3 OUT_DIR=/data/backup/mongod/tmp		// 备份文件临时目录
      4 TAR_DIR=/data/backup/mongod		// 备份文件正式目录
      5 DATE=`date +%Y_%m_%d_%H_%M_%S`		// 备份文件将以备份时间保存
      6 DB_USER=<USER>				// 数据库操作员
      7 DB_PASS=<PASSWORD>			// 数据库操作员密码
      8 DAYS=14					// 保留最新14天的备份
      9 TAR_BAK="mongod_bak_$DATE.tar.gz"	// 备份文件命名格式
     10 cd $OUT_DIR				// 创建文件夹
     11 rm -rf $OUT_DIR/*			// 清空临时目录
     12 mkdir -p $OUT_DIR/$DATE			// 创建本次备份文件夹
     13 $DUMP -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE		// 执行备份命令
     14 tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE		// 将备份文件打包放入正式目录
     15 find $TAR_DIR/ -mtime +$DAYS -delete			// 删除14天前的旧备份
     16 chmod +x ~/crontab/mongod_bak.sh
     17 vi /etc/crontab
     18 0 2 * * * root ~/crontab/mongod_bak.sh
     
     
    参考链接:https://blog.csdn.net/zhu_tianwei/article/details/44514673
    https://brickyang.github.io/2017/03/02/Linux-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD-MongoDB/
    https://segmentfault.com/a/1190000006236494
  • 相关阅读:
    数据库访问性能优化--应用开发
    苹果终端wifi图标点亮慢和portal弹窗机制分析以及处理办法和建议
    蓝牙固件升级(OTA升级)原理设计
    C语言:内存字节对齐详解
    linux du与ls查看文件大小时的区别
    80211 组播速率及组播转单播
    视频帧、码流计算
    IEEE802.11数据帧在Linux上的抓取 80211格式转8023帧格式
    wifidog源码分析
    无线路由:关于WDS,Repeater等模式的说明
  • 原文地址:https://www.cnblogs.com/itzgr/p/11025207.html
Copyright © 2011-2022 走看看