mongodump/mongorestore

日常用的,体积小,二进制保存

mongodump

  1. $ mongodump --help
  2. 参数说明:
  3. -h:指明数据库宿主机的IP
  4. -u:指明数据库的用户名
  5. -p:指明数据库的密码
  6. -d:指明数据库的名字
  7. -c:指明collection的名字
  8. -o:指明到要导出的文件名
  9. -q:指明导出数据的过滤条件
  10. -j, --numParallelCollections= number of collections to dump in parallel (4 by default)
  11. --oplog 备份的同时备份oplog
  1. 1、全库备份
  2. mkdir /mongodb/backup
  3. mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
  4. 2、备份world
  5. mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/
  6. 3、备份oldboy库下的log集合
  7. mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/
  8. 4、压缩备份
  9. mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip

mongorestore

  1. 1、恢复world
  2. mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
  3. 2、恢复oldguo库下的t1集合
  4. mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz
  5. 3drop表示恢复的时候把之前的集合drop掉(危险)
  6. mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy

高级企业应用(—oplog)

这是replica set或者master/slave模式专用

基于时间点的快照备份,同时备份 备份过程中的oplog(默认是磁盘空间的5%),也可以手动定制

oplog路径:local -> oplog.rs

  1. #开启选项 mongod.conf配置文件加入
  2. replication: #日志
  3. oplogSizeMB: 2048 #日志表大小
  4. replSetName: my_repl #复制集名
  5. #oplog查询
  6. use local
  7. db.oplog.rs.find(“参数”).pretty()
  8. --参数
  9. "i": insert
  10. "u": update
  11. "d": delete
  12. "c": db cmd
  13. =====================================================================
  14. oplog的大小设置参考 master里面执行,最少保证预计时间内有两次全备
  15. test:PRIMARY> rs.printReplicationInfo()
  16. configured oplog size: 1561.5615234375MB <--集合大小
  17. log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
  18. oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
  19. oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
  20. now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)
  21. =====================================================================
  22. #备份
  23. mongodump --port 28018 --oplog -o /mongodb/backup
  24. #恢复
  25. mongorestore --port 28018 --oplogReplay /mongodb/backup

全量+oplog完整恢复

  1. 背景:每天0点全备,oplog恢复窗口为48小时
  2. 某天,上午10world.city 业务表被误删除。
  3. 恢复思路:
  4. 0、停应用
  5. 2、找测试库
  6. 3、恢复昨天晚上全备
  7. 4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库
  8. 5、将误删除表导出,恢复到生产库
  1. 模拟故障环境:
  2. 1、全备数据库
  3. 模拟原始数据
  4. mongo --port 28017
  5. use wo
  6. for(var i = 1 ;i < 20; i++) {
  7. db.ci.insert({a: i});
  8. }
  9. 全备:
  10. rm -rf /mongodb/backup/*
  11. mongodump --port 28018 --oplog -o /mongodb/backup
  12. --oplog功能:在备份同时,将备份过程中产生的日志进行备份
  13. 文件必须存放在/mongodb/backup下,自动命令为oplog.bson
  14. 再次模拟数据
  15. db.ci1.insert({id:1})
  16. db.ci2.insert({id:2})
  17. 2、上午10点:删除wo库下的ci表
  18. 10:00时刻,误删除
  19. db.ci.drop()
  20. show tables;
  21. 3、备份现有的oplog.rs表
  22. mongodump --port 28018 -d local -c oplog.rs -o /mongodb/backup
  23. 4、截取oplog并恢复到drop之前的位置
  24. 更合理的方法:登陆到原数据库
  25. [mongod@db03 local]$ mongo --port 28018
  26. my_repl:PRIMARY> use local
  27. db.oplog.rs.find({op:"c"}).pretty();
  28. {
  29. "ts" : Timestamp(1553659908, 1),
  30. "t" : NumberLong(2),
  31. "h" : NumberLong("-7439981700218302504"),
  32. "v" : 2,
  33. "op" : "c",
  34. "ns" : "wo.$cmd",
  35. "ui" : UUID("db70fa45-edde-4945-ade3-747224745725"),
  36. "wall" : ISODate("2019-03-27T04:11:48.890Z"),
  37. "o" : {
  38. "drop" : "ci"
  39. }
  40. }
  41. 获取到oplog误删除时间点位置:
  42. "ts" : Timestamp(1553659908, 1)
  43. 5、恢复备份+应用oplog
  44. [mongod@db03 backup]$ cd /mongodb/backup/local/
  45. [mongod@db03 local]$ ls
  46. oplog.rs.bson oplog.rs.metadata.json
  47. [mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson
  48. rm -rf /mongodb/backup/local/
  49. mongorestore --port 38021 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/

分片集群的备份思路(了解)

  1. 1、你要备份什么?
  2. config server
  3. shard 节点
  4. 单独进行备份
  5. 2、备份有什么困难和问题
  6. 1chunk迁移的问题
  7. 人为控制在备份的时候,避开迁移的时间窗口
  8. 2shard节点之间的数据不在同一时间点。
  9. 选业务量较少的时候
  10. Ops Manager

mongoexport/mongoimport

异构平台,或跨版本用,体积较大,支持json和csv

mongoexport

  1. $ mongoexport --help
  2. 参数说明:
  3. -h:指明数据库宿主机的IP
  4. -u:指明数据库的用户名
  5. -p:指明数据库的密码
  6. -d:指明数据库的名字
  7. -c:指明collection的名字
  8. -f:指明要导出那些列
  9. -o:指明到要导出的文件名
  10. -q:指明导出数据的过滤条件
  11. --authenticationDatabase admin
  1. 1.单表备份至json格式
  2. mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
  3. 注:备份文件的名字可以自定义,默认导出了JSON格式的数据。
  4. 2. 单表备份至csv格式
  5. 如果我们需要导出CSV格式的数据,则需要使用----type=csv参数:
  6. mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv

mongoimport

  1. $ mongoimport --help
  2. 参数说明:
  3. -h:指明数据库宿主机的IP
  4. -u:指明数据库的用户名
  5. -p:指明数据库的密码
  6. -d:指明数据库的名字
  7. -c:指明collection的名字
  8. -f:指明要导入那些列
  9. -j, --numInsertionWorkers=<number> number of insert operations to run concurrently (并发)
  1. 1.恢复json格式表数据到log1
  2. mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
  3. 2.恢复csv格式的文件到log2
  4. 1csv格式的文件头行,有列名字
  5. mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv
  6. 2csv格式的文件头行,没有列名字
  7. mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f id,name,age,date --file /mongodb/log.csv
  8. --headerline:指明第一行是列名,不需要导入。

异构平台恢复

  1. #mysql备份为Mongo格式的csv
  2. 1mysql开启安全路径
  3. vim /etc/my.cnf 加入
  4. secure-file-priv=/tmp
  5. 2、重启数据库生效
  6. /etc/init.d/mysqld restart
  7. 3、导出mysqlcity表数据
  8. source /root/world.sql
  9. select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
  10. 4、处理备份文件
  11. desc world.city
  12. ID | int(11) | NO | PRI | NULL | auto_increment |
  13. | Name | char(35) | NO | | | |
  14. | CountryCode | char(3) | NO | MUL | | |
  15. | District | char(20) | NO | | | |
  16. | Population
  17. vim /tmp/city.csv ----> 添加第一行列名信息
  18. ID,Name,CountryCode,District,Population
  19. 5、在mongodb中导入备份
  20. mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city --type=csv -f ID,Name,CountryCode,District,Population --file /tmp/city1.csv -j 4
  21. -------------
  22. world100张表,全部迁移到mongodb
  23. select table_name ,group_concat(column_name) from columns where table_schema='world' group by table_name;
  24. select * from world.city into outfile '/tmp/world_city.csv' fields terminated by ',';
  25. select concat("select * from ",table_schema,".",table_name ," into outfile '/tmp/",table_schema,"_",table_name,".csv' fields terminated by ',';")
  26. from information_schema.tables where table_schema ='world';
  27. 导入:
  28. 提示,使用infomation_schema.columns + information_schema.tables
  29. mysql导出csv
  30. select * from test_info
  31. into outfile '/tmp/test.csv'
  32. fields terminated by ','    ------字段间以,号分隔
  33. optionally enclosed by '"'   ------字段用"号括起
  34. escaped by '"'        ------字段中使用的转义符为"
  35. lines terminated by '\r\n';  ------行以\r\n结束
  36. mysql导入csv:
  37. load data infile '/tmp/test.csv'
  38. into table test_info
  39. fields terminated by ','
  40. optionally enclosed by '"'
  41. escaped by '"'
  42. lines terminated by '\r\n';