MongoDB数据备份&导入导出&同步

Nobody / 2024-11-07 / 原文

mongodump & mongorestore

单库备份

## -o 输出目录
mongodump --host 127.0.0.1 --port 27032 -u xxx -p xxx --db test2 --oplog -o ./test2

全库备份

--oplog只能在副本集中使用,因为副本集初始化的时候生成oplog,单实例使用--oplog会报错

mongodump --host 127.0.0.1 --port 27030 -u user1 -p user1 --authenticationDatabase admin  --oplog -o ./test07

全量备份的时候且使用--oplog的时候,会有一个bson文件,里面存了时间戳。可用于增量备份。需要使用bsondump命令查看该文件的时间戳。

bsondump testOp2/oplog.bson

全库恢复

## 可以增加参数 --drop,将已存在的库删除再重新创建
mongorestore --host 127.0.0.1 --port 27039 -u user1 -p user1 --authenticationDatabase admin  --oplogReplay ./testOp2

增量恢复

先增量备份,查看上次全量备份的bson文件中的时间戳,然后从local库中的oplog.rs集合中通过指定时间戳备份增量数据,再根据导出的增量备份文件进行增量恢复。

增量备份

mongodump --host localhost --port 27032 -d local -c oplog.rs --query '{"ts":{"$gt": {"$timestamp":{"t":1729245309, "i":1}}}}' -o ./op

增量恢复

mongorestore --host 127.0.0.1 --port 27039 --oplogReplay op/local/oplog.rs.bson 

mongoexport & mongoinport

单库单表备份

mongoexport --host 127.0.0.1 --port 27030 -u user1 -p user1 --authenticationDatabase admin  -d test2 -c test2 -o ./testexport01.json

导出为csv格式

## --type 指定导出数据类型
## -f 表示字段名称
mongoexport --host 127.0.0.1 --port 27030 -u user1 -p user1 --authenticationDatabase admin  -d test2 -c test2 --type=csv -f _id,name -o ./testexportcsv.csv

mongodump和mongoexport的区别

格式

  • mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式

  • mongodump/mongorestore 导入/导出的是BSON格式

体积

JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。

跨版本

  • 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。

  • 当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。

  • 跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)

索引

JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

库和集合导出的数量

  • mongoexport不支持普通导出单个db的所有的collection,一次只能导出一个collection

  • mongodump支持普通导出单个db的所有的collection

应用场景

mongoexport/mongoimport

1、异构平台迁移 mysql <---> mongodb

2、同平台,跨大版本:mongodb2.x ---> mongodb3.x

mongodump/mongorestore

日常备份恢复时使用.

MongoShake数据同步

安装及配置

下载地址:https://github.com/alibaba/MongoShake/releases
下载编译好的.tgz那个文件

配置文件:collector.conf

  • 注意修改源地址和目的地址

  • 监听端口是否被占用

  • 配置日志地址

启动:

./collector -conf=collector.conf 

停止:

通过stop.sh停止mongoshake,需要传入mongoshake.pid的位置作为参数,存放在配置的log.dir目录下。

./stop.sh /data/dba/yanhao/test/mongoshake.pid

参数:

## 同步模式,all表示全量+增量同步,full表示全量同步,incr表示增量同步
sync_mode

## checkpoint的存储地址,不设置默认会存到mongo源端的mongoshake库的ckpt_default集合中
## 如果是第一次使用incr模式,则会从checkpoint.start_position的时间点同步oplog
checkpoint.storage.url

测试

  • 源副本集
主:127.0.0.1:27032
从:127.0.0.1:27030
  • 目标MongoDB
127.0.0.1:27039
  • 修改配置参数
## 默认的端口被占用了,修改成其他的
incr_sync.http_port = 27040
mongo_urls = mongodb://user1:user1@127.0.0.1:27032,127.0.0.1:27030
tunnel.address = mongodb://127.0.0.1:27039
log.dir = /data/dba/yanhao/test
## 全量+增量
sync_mode = all
目标:

源:

源副本集的时间戳:

监控mongoshake状态

## curl -s ip:端口
##  python -m json.tool 是输出更清晰
curl -s http://127.0.0.1:27040
curl -s http://127.0.0.1:27040/worker | python -m json.tool
## mongoshake-stat 脚本用于实时输出mongoshake的状态,包括:
logs_get/sec每秒获取的oplog数量。
logs_repl/sec每秒执行重放操作的oplog数量。
logs_success/sec每秒成功执行重放操作的oplog数量。
lsn.time最后发送oplog的时间。
lsn_ack.time目标端确认写入的时间。
lsn_ckpt.timeCheckPoint持久化的时间。
now.time当前时间。
replset源数据库的副本集名称。



./mongoshake-stat --port=9100
  1. https://www.modb.pro/db/49590

  2. Mongoshake https://github.com/alibaba/MongoShake/wiki

  3. 参数配置https://github.com/alibaba/MongoShake/wiki/%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E