暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB备份及恢复

IT那活儿 2023-07-31
418

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


备份工具介绍
1. mongoexport/mongoimport备份表,备份格式为json、csv,可读性搞,易还原

2. mongodump/ mongorestore备份数据库,备份格式为bson、gzip,可读性不高,还原数据时遇到过和json兼容性问题,不建议使用。


mongoexport&mongoimport

1. 导出工具mongoexport

1.1 mongoexport参数说明

  • -h:指明数据库宿主机的IP
  • --host:如果是集群环境建议使用,例如:--host="my_repl/10.0.0.10:28017,10.0.0.10:28018,10.0.0.10:28019"
  • -u:指明数据库的用户名
  • -p:指明数据库的密码
  • -d:指明数据库的名字
  • -c:指明collection的名字
  • -f:指明要导出哪些列
  • -o:指明到要导出的文件名
  • -q:指明导出数据的过滤条件
  • --authenticationDatabase:保存用户凭据的数据库

1.2 单表备份为json格式

准备数据:
for(i=0;i<1000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6})}
备份数据为json格式:
mongoexport -uroot -proot123456 --port 28017 --
authenticationDatabase admin -d test -c log -o /mongodb/backup/log.json

1.3 单表备份至csv格式

mongoexport -uroot -proot123456 --port 28017 --
authenticationDatabase admin -d test -c log --type=csv -f
uid,name,age -o /mongodb/backup/log.csv

2. 导入工具mongoimport

2.1 mongoimport参数说明

  • -h:指明数据库宿主机的IP
  • -u:指明数据库的用户名
  • -p:指明数据库的密码
  • -d:指明数据库的名字
  • -c:指明collection的名字
  • -f:指明要导入哪些列
  • -j , --numInsertionWorkers=<number>:要同时运行的插入操作数
  • --type:指定导入格式
  • --headerline:使用输入源中的第一行作为字段列表(仅CSV和TSV)

2.2 恢复json格式表数据到log

mongoimport -uroot -proot123456 --port 28017 --
authenticationDatabase admin -d test -c log /mongodb/backup/log.json

2.3 恢复csv格式的文件到log

方法一:csv格式的文件头行,有列名字
mongoimport -uroot -proot123456 --port 28017 --
authenticationDatabase admin -d test -c log --type=csv --headerline --file  /mongodb/backup/log.csv

方法二:csv格式的文件头行,没有列名字
mongoimport -uroot -proot123456 --port 28017 --
authenticationDatabase admin -d test -c log --type=csv -f id,name,age --file  /mongodb/backup/log.csv

2.4 异步架构迁移:MySQL2MongoDB

1)mysql开启安全路径
vim /etc/my.cnf
secure-file-priv=/tmp secure-file-priv=/tmp
/etc/init.d/mysqld restart

2)导出mysql的city表数据
select * from world.city into outfile '/tmp/city.csv' fields terminated by ',';
3)处理备份文件
mysql> use information_schema
mysql> desc COLUMNS;
mysql> select TABLE_SCHEMA,TABLE_NAME,group_concat(COLUMN_NAME) from COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='city';

4)在mongodb导入数据

mongoimport -uroot -proot123 --port 27017 --
authenticationDatabase admin -d world -c city --type=csv -f
ID,Name,CountryCode,District,Population --file /tmp/city1.csv


mongodump&mongorestore

mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。
但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,
则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

1. 备份工具mongodump

1.1 mongodump参数说明

  • -h:指明数据库宿主机的IP
  • -u:指明数据库的用户名
  • -p:指明数据库的密码
  • -d:指明数据库的名字
  • -c:指明collection的名字
  • -o:指明到要导出的文件名
  • -q:指明导出数据的过滤条件
  • -j , --numParallelCollections:要并行转储的集合数(默认为4)
  • --oplog:备份的同时备份oplog
  • --gzip:压缩备份
  • --drop:恢复数据前先进行删除
  • --oplog:使用oplog获取时间点快照

1.2 全库备份

1)普通备份
mongodump -uroot -proot123456 --port 28018 --
authenticationDatabase admin -o /mongodb/backup

2)压缩备份
mongodump -uroot -proot123456 --port 28018 --
authenticationDatabase admin -o /mongodb/backup/ --gzip

1.3 单库备份

1)普通备份
mongodump -uroot -proot123456 --port 28018 --
authenticationDatabase admin -d test -o /mongodb/backup/

2)压缩备份
mongodump -uroot -proot123456 --port 28018 --
authenticationDatabase admin -d test -o /mongodb/backup/ --gzip

1.4 单表备份

1)普通备份
mongodump -uroot -proot123456 --port 28018 --authenticationDatabase 
admin -d test -c log -o /mongodb/backup/

2)压缩备份
mongodump -uroot -proot123456 --port 28018 --authenticationDatabase 
admin -d test -c log -o /mongodb/backup/ --gzip

2. 恢复工具mongorestore

1)恢复test库
mongorestore -uroot -proot123456 --port 28018 --authenticationDatabase 
admin -d test /mongodb/backup/test

2)恢复test库下的log集合
mongorestore -uroot -proot123456 --port 28018 --authenticationDatabase 
admin -d test -c log --gzip /mongodb/backup.bak/oldboy/log.bson.gz

3. mongodump和mongorestore高级应用(--oplog)

3.1 oplog的说明

在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%,只在复制集环境中存在,可以通过--oplogSizeMB参数修改。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。其覆盖范围被称作oplog时间窗口。
需要注意的是,因为oplog是一个定容集合,所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
1)想要查看当前的oplog时间窗口预计值,可以使用以下命令
my_repl:PRIMARY> use local
my_repl:PRIMARY> db.oplog.rs.find().pretty()
{
"ts" : Timestamp(1657440633, 1),
"h" : NumberLong(0),
"v" : 2,
"op" : "n",
"ns" : "",
"wall" : ISODate("2022-07-10T08:10:33.825Z"),
"o" : {
"msg" : "initiating set"
  }
    }

以上op字段代表的是:

  • "i": insert
  • "u": update
  • "d": delete
  • "c": db cmd代表表及索引的增删改查等操作
2)也可以查看oplog的大小,以及对应的覆盖时间
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)

3.2 mongorestore结合oplog日志截取进行恢复

1)模拟数据,并进行全备
[mongod@db01 ~]$ mongo -uroot -proot123456 --port 28018 admin
use test
for(var i = 1 ;i < 2; i++)
{
   db.b.insert({id:i});
}

mongodump -uroot -proot123456 --port 28018 --
authenticationDatabase admin --oplog -o /mongodb/backup

2)模拟增量数据
db.b.insert({id:2})
db.b.insert({id:3})

3)模拟误删除表操作
db.b.drop()
show tables;

4)备份现有oplog
mongodump -uroot -proot123456 --port 28018 --authenticationDatabase admin 
-d local -c oplog.rs -o /mongodb/backup

5)截取oplog并恢复到drop之前的位置
my_repl:PRIMARY> use local
my_repl:PRIMARY> db.oplog.rs.find({op:"c"}).pretty();
{
"ts" : Timestamp(1657519679, 1),
"t" : NumberLong(3),
"h" : NumberLong(0),
"v" : 2,
"op" : "c",
"ns" : "test.$cmd",
"ui" : UUID("2d290e84-8e61-4baf-ad05-3a57361f13e5"),
"o2" : {
"numRecords" : 19
  },
"wall" : ISODate("2022-07-11T06:00:21.531Z"),
"o" : {
"drop" : "zhang"
    }
  }

6)恢复备份+oplog
cd /mongodb/backup/local/
\cp oplog.rs.bson ../oplog.bson
cd ..
rm -rf /mongodb/backup/local/
mongorestore -uroot -proot123456 --port 28018 --
authenticationDatabase admin --oplogReplay --oplogLimit
"1657519679:1" /mongodb/backup


END


本文作者:张学衡(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论