万万哇 发表于 2025-10-30 08:19:24

MongoDB:记一次数据迁移履历

目次
任务场景
任务分析
任务过程
mongodump/mongorestore
compass工具
任务总结
技能深入

任务场景

        项目现场由于汗青遗留题目,有两套MongoDB数据库架构,且版本不同等。如今必要将一些MongoDB聚集从低版本数据库迁移到高版本数据库。项目标具体场景信息如下:
项目环境项目信息低版本数据库3.4.6版本高版本数据库5.0.24版本低版本数据库架构双分片高版本数据库架构三副本必要迁移的MongoDB聚集总数目25total_size做大的聚集50Gtotal_size > 1G的聚集数目5200M < total_size < 1G的聚集数目4大聚集索引环境大聚集索引数目较多 任务分析

        所谓迁移,着实本质上就是将数据从一个地方完备的放到另一个地方,而且要能用;也就是数据导出、再导入,导入后还要能用。
        MongoDB数据迁移的本领有很多:ETL工具,MongoDB的mongodump/mongorestore、mongoexport/mongoimport、compass工具等。
方法扼要分析阐明ETL工具(kettle) 1、可以创建索引;
2、迁移过程可追溯;
3、聚集名称、字段名有开辟堕落的风险;
4、大聚集不得当全量一次性同步,必要分批次增量同步已往;
mongodump/mongorestore 1、迁移会保存索引和元数据;
2、得当全量备份迁移;
3、对于大聚集导出导入服从较高;
4、会受限于网络速率
mongoexport/mongoimport 1、导出的文件可以是json、csv,可读性较高;
2、得当小数据量迁移
3、不会保存索引和元数据;
4、迁移服从较低;
compass工具 1、导出的文件可以是json、csv,可读性较高;
2、不必要写下令,不必要开辟;
3、得当小数据量迁移;
4、不会保存索引和元数据;
5、迁移服从较低;
        针对此次迁移任务场景,聚集数目25个,大聚集9个,小聚集16个,且大聚集索引数目较多,小聚集索引很少。
        以是计分别两批去迁移:
(1)针对200M以下的16个小聚集,接纳compass工具举行迁移;
(2)针对200M以上的9个大聚集,接纳mongodump/mongorestore工具举行迁移;
        (1)compass工具迁移小聚集
        compass的导出导入非常简单,动动手操纵下图形界面即可;而且小聚集索引较少,手动创建索引也不会泯灭太多时间。
        (2)mongodump/mongorestore工具迁移大聚集
        大聚集迁移要思量两个题目,导出导入服从、索引创建题目。mongodump/mongorestore对于大聚集的迁移服从好坏常高的,且可以开启并发参数加速导入导出速率;而且mongodump/mongorestore工具可以主动创建索引,办理了索引多且大的负责题目。
任务过程

        无论是利用何种迁移方式,除非是添加副本成员去同步数据,都必要先将聚集对应的业务停息再举行迁移,否则就有漏数据的风险。
mongodump/mongorestore

        由于项目现场的两套MongoDB数据库的版本及database-tools版本不同等,以是只能先利用mongodump导出聚集的二进制bosn文件,然后将文件传输到目标数据库服务器上,末了利用mongorestore举行规复。这次任务也验证了低版本(3.4.6)的mongodump导出的二进制文件,利用高版本的mongorestore(100.5.2)可以对其举行规复导入。
1、mongodump导出目标聚集


[*]mongodump下令直接在Linux的下令行下实行,不可以在mongo-shell中实行
[*]代码块中的 “ \ ” 符号是换行符,克制一行下令写的太长导致可读性变差
[*]--uri:数据库的毗连字符串,必要严格按照语法格式中给出的例子去写
[*]--collection:必要导出的聚集
[*]--numParallelCollections:开启并发数,开启后可以加速速率,但这个参数比力吃CPU
[*]--out:导出的文件的输出路径
//语法格式
mongodump \
--uri="mongodb://用户名:密码@源IP:27017/mydb" \
--collection=mycollection \
--numParallelCollections 4 \
--out=./mydb_backup

//实际操作
mongodump \
--uri="mongodb://zqd:123456@192.168.0.34:27017/TEST" \
--collection=ETL_MODEL\
--numParallelCollections 4 \
--out=/mongodb/backup         mongodump实行乐成后,会在备份目次,也就是代码块中的/mongodb/backup目次下天生两份文件:数据文件、元数据文件。数据文件中存储了聚集的行数据,元数据文件中包罗聚集的索引信息、聚集选项、其他元信息等,这两份文件都是规复数据时所须要的。
https://i-blog.csdnimg.cn/direct/498173922ff84a6ea70b7c285851b991.png
2、文件传输
        文件导出乐成后,必要将文件传输到目标服务器上,可以利用scp下令,这个步调就比力查验网速了。我在做的时间,50G的文件,传输了20分钟。
scp -r /mongodb/backup/TEST root@192.168.0.202:/mongodb/backup 3、mongorestore导入目标聚集


[*]代码块中的 “ \ ” 符号是换行符,克制一行下令写的太长导致可读性变差
[*]--uri:数据库的毗连字符串,必要严格按照语法格式中给出的例子去写
[*]--collection:必要导入的聚集
[*]--numParallelCollections:开启并发数,开启后可以加速速率,但这个参数比力吃CPU
[*]--drop:若目标聚集已存在,先删除旧数据
[*]/mongodb/backup/TEST/ETL_MODEL.bson:需导入的bson文件绝对路径
//语法格式
mongorestore \
--uri="mongodb://用户名:密码@目标IP:27017/mydb" \
--collection=mycollection \
--numParallelCollections 4 \
--drop \# 可选:若目标集合已存在,先删除旧数据
/目标路径/mydb_backup/mydb/mycollection.bson

//实际操作
mongorestore \
--uri="mongodb://zqd:123456@192.168.0.202:27017/TEST" \
--collection=ETL_MODEL \
--numParallelCollections 4 \
--drop /mongodb/backup/TEST/ETL_MODEL.bson         固然mongodump导出的文件有数据文件、元数据文件两个,但是在利用mongorestore导入时,只必要指定命据文件即可,mongorestore会主动读取元数据文件信息用来重构索引;这也是为什么元数据文件必要和数据文件在同一目次下。
        下图是乐成规复导入的一个例子:
https://i-blog.csdnimg.cn/direct/20f5e1f360f2416d84f0a24eba033887.png
compass工具

1、compass导出
        形貌导出导入过程之前,发起是将必要导出的聚集同一全部导出后,放入同一个目次,导入的时间直接来这个目次找文件,如许不轻易堕落,且服从更高。
        compass选择导出按钮点击,在导出时不要选择“Export Full Collection”;要选择字段举行导出,选择字段时,将_id字段勾选去掉,否则会影响导入。
https://i-blog.csdnimg.cn/direct/25d89a81bc184cd9a81f9243b5ee1b09.png
https://i-blog.csdnimg.cn/direct/5a73734a993e48b1ac8734659c44a5b4.png
2、compass导入
选择Import Data即可导入刚刚导出的json大概csv文件。
https://i-blog.csdnimg.cn/direct/53849667adf140f8a19b821ea319163d.png
任务总结

        这次MongoDB数据迁移任务做完,有两个可以提炼出的的履历是
(1)假如必要迁移的聚集数目不多,就完全可以手动操纵。
(2)对于小聚集,手工操纵的话,compass工具要比mongoexport/mongoimport服从更高。
(3)对于大聚集,手工操纵的话,肯定要选用mongodump/mongorestore工具
(4)写个shell脚本模板,后续再有雷同场景的迁移,只必要改下聚集名称的参数值即可,也不须要再手工操纵了。
技能深入

        mongodump/mongorestore用于MongoDB数据的迁移好坏常高效的,且功能强盛,值得再深入探究一下。下面会从其版本厘革、下载、设置、直接迁移、导出内容、索引重构、多个聚集这几个方面再深入形貌一下。
        至于全库备份迁移,这里就不扩展了,由于也不得当本篇文章的讨论方向。而且MongoDB作为分布式数据库,存储一样寻常都好坏常大的,动不动都是10个T以上,全库备份和规复的时间本钱都非常高。在不思量异地备份的条件下,真实的项目上着实很少有真的去做备份和规复。根本都是三副本架构,坏了一台,立刻由其他两台接受,然后再去修复坏掉的那台数据库。
1、版本厘革
        mongodump/mongorestore在MongoDB数据库4.4版本之前是在安装摆设数据库时自带的工具,但是在4.4版本之后,必要独立安装MongoDB Command Line Database Tools才华利用。
2、工具下载
从MongoDB4.4版本之后,mongodump/mongorestore必要独立安装,其安装包可以从官网下载,下载地点:MongoDB数据库工具下载地点
https://i-blog.csdnimg.cn/direct/5cc09b8616094d319cea71ba90a155f2.png
3、安装设置
        安装很简单,把下载的MongoDB Command Line Database Tools压缩包上传到数据库服务器上,然后解压即可。
https://i-blog.csdnimg.cn/direct/61566fdaad9b43a7a5d6a4b6ba05a7d4.png
         但是解压后,不能立纵然用;必要将其bin目次添加到环境变量中(记得修改完source环境变量文件)。
https://i-blog.csdnimg.cn/direct/6e7c05c4be784021917c4b603ed74066.png
4、直接迁移
        直接迁移的意思是指,不再先导出到本地,不再占用本地存储空间;mongodump/mongorestore可以将聚集从源数据库直接迁移到目标数据库。
        代码块中的 “ | ” 就雷同于迁移的管道,“ | ” 前后的下令与mongodump、mongorestore单独利用时的用法没有差异。
mongodump --uri="mongodb://zqd:123456@192.168.0.34:27017/TESTZQD" --collection=TEST \
| mongorestore --uri="mongodb://zqd:123456@192.168.0.202:27017/TESTZQD" --drop         但是,这种直接迁移的操纵有一个条件条件:必要mongodump/mongorestore的版本同等;这里的同等指的是源数据库服务器上的工具版本和目标数据库服务器版本保持同等。假如不同等的话,可以通过降级大概升级将两方版本更新成同等后,即可举行迁移。
        回首文章前文的迁移,并没有举行mongodump/mongorestore版本更新。是由于项目环境中的源数据库版本是3.4.6,目标数据库版本是5.0.24,版本跨度太大,实验后发现无法再举行版本同一。而4.4版本之后的数据库,应该都可以通过利用雷同版本的MongoDB Command Line Database Tools举行直接迁移。
5、mongodump导出内容
数据文件
文件以 .bson 末了,存储聚会集的文档(行数据)
元数据文件
文件以 .metadata.json 末了,存储聚会集的设置信息,包罗索引信息、聚集选项(固定聚集巨细、验证规则)、其他元信息(UUID、创建时间)
6、重修索引
        利用mongorestore规复聚集时,会在数据文件导入完成后,根据元数据文件中的索引界说,举行索引重修,大的索引重修会比力慢,我的履历是一个聚会集有8个索引,共7个G的索引巨细,重修耗时20min。
        利用mongorestore规复聚集时,假如想先导入数据再手动创建索引,也可以禁用索引重修。可以在利用mongorestore工具时,参加代码块中参数。但不发起这么做,手工创建索引耗时且贫苦。
mongorestore --noIndexRestore --uri="..." /备份路径         在重修索引时,必要确保mongorestore的版本高于源数据库版本,由于源数据库版本假如过高,大概会有些新特性,导致旧版本的mongorestore无法辨认。
7、mongodump导出多个聚集 
        我在利用mongodump做聚集导出的时间,就在想一个题目:假如一个个导出,稍显贫苦。但是就几个聚集,又懒得写shell脚本。mongodump就不能同时指定多个聚集举行导出吗?
        着实还真行,但有版本限定。MongoDB4.4版本以上的数据库,可以通过指定多个--collection参数同时导出多个聚集。但是4.4版本以下的数据库,就不支持如许操纵了。
        而且尚有个操纵可以导出多个聚集——导出整个数据库。但这个就有点大炮打蚊子的意思了,没须要。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MongoDB:记一次数据迁移履历