mongodump/mongorestore
日常用的,体积小,二进制保存
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
1、全库备份mkdir /mongodb/backupmongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup2、备份world库mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/3、备份oldboy库下的log集合mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/4、压缩备份mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip
mongorestore
1、恢复world库mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world2、恢复oldguo库下的t1集合mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz3、drop表示恢复的时候把之前的集合drop掉(危险)mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
高级企业应用(—oplog)
这是replica set或者master/slave模式专用
基于时间点的快照备份,同时备份 备份过程中的oplog(默认是磁盘空间的5%),也可以手动定制
oplog路径:local -> oplog.rs
#开启选项 mongod.conf配置文件加入replication: #日志oplogSizeMB: 2048 #日志表大小replSetName: my_repl #复制集名#oplog查询use localdb.oplog.rs.find(“参数”).pretty()--参数"i": insert"u": update"d": delete"c": db cmd=====================================================================oplog的大小设置参考 在master里面执行,最少保证预计时间内有两次全备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)=====================================================================#备份mongodump --port 28018 --oplog -o /mongodb/backup#恢复mongorestore --port 28018 --oplogReplay /mongodb/backup
全量+oplog完整恢复
背景:每天0点全备,oplog恢复窗口为48小时某天,上午10点world.city 业务表被误删除。恢复思路:0、停应用2、找测试库3、恢复昨天晚上全备4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库5、将误删除表导出,恢复到生产库
模拟故障环境:1、全备数据库模拟原始数据mongo --port 28017use wofor(var i = 1 ;i < 20; i++) {db.ci.insert({a: i});}全备:rm -rf /mongodb/backup/*mongodump --port 28018 --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.ci.drop()show tables;3、备份现有的oplog.rs表mongodump --port 28018 -d local -c oplog.rs -o /mongodb/backup4、截取oplog并恢复到drop之前的位置更合理的方法:登陆到原数据库[mongod@db03 local]$ mongo --port 28018my_repl:PRIMARY> use localdb.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]$ lsoplog.rs.bson oplog.rs.metadata.json[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bsonrm -rf /mongodb/backup/local/mongorestore --port 38021 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/
分片集群的备份思路(了解)
1、你要备份什么?config servershard 节点单独进行备份2、备份有什么困难和问题(1)chunk迁移的问题人为控制在备份的时候,避开迁移的时间窗口(2)shard节点之间的数据不在同一时间点。选业务量较少的时候Ops Manager
mongoexport/mongoimport
异构平台,或跨版本用,体积较大,支持json和csv
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 oldboy -c log -o /mongodb/log.json注:备份文件的名字可以自定义,默认导出了JSON格式的数据。2. 单表备份至csv格式如果我们需要导出CSV格式的数据,则需要使用----type=csv参数:mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
mongoimport
$ mongoimport --help参数说明:-h:指明数据库宿主机的IP-u:指明数据库的用户名-p:指明数据库的密码-d:指明数据库的名字-c:指明collection的名字-f:指明要导入那些列-j, --numInsertionWorkers=<number> number of insert operations to run concurrently (并发)
1.恢复json格式表数据到log1mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json2.恢复csv格式的文件到log2(1)csv格式的文件头行,有列名字mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv(2)csv格式的文件头行,没有列名字mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f id,name,age,date --file /mongodb/log.csv--headerline:指明第一行是列名,不需要导入。
异构平台恢复
#mysql备份为Mongo格式的csv1、mysql开启安全路径vim /etc/my.cnf 加入secure-file-priv=/tmp2、重启数据库生效/etc/init.d/mysqld restart3、导出mysql的city表数据source /root/world.sqlselect * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';4、处理备份文件desc world.cityID | int(11) | NO | PRI | NULL | auto_increment || Name | char(35) | NO | | | || CountryCode | char(3) | NO | MUL | | || District | char(20) | NO | | | || Populationvim /tmp/city.csv ----> 添加第一行列名信息ID,Name,CountryCode,District,Population5、在mongodb中导入备份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-------------world共100张表,全部迁移到mongodbselect table_name ,group_concat(column_name) from columns where table_schema='world' group by table_name;select * from world.city into outfile '/tmp/world_city.csv' fields terminated by ',';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';导入:提示,使用infomation_schema.columns + information_schema.tablesmysql导出csv:select * from test_infointo outfile '/tmp/test.csv'fields terminated by ',' ------字段间以,号分隔optionally enclosed by '"' ------字段用"号括起escaped by '"' ------字段中使用的转义符为"lines terminated by '\r\n'; ------行以\r\n结束mysql导入csv:load data infile '/tmp/test.csv'into table test_infofields terminated by ','optionally enclosed by '"'escaped by '"'lines terminated by '\r\n';
