一则 MongoDB 副本集迁移实操案例
文中详细阐述了通过全量 + 增量 Oplog 的迁移方式,完成一套副本集 MongoDB 迁移的全过程。
作者:张然,DBA 数据库技术爱好者~
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 900 字,预计阅读需要 3 分钟。
背景介绍
客户要将生产环境上一套副本集架构的 MongoDB 进行迁移,数据量 240GB 左右。经过测试,全量备份耗时 3.5 小时,恢复耗时 4.5小时。
为了减少割接时间,采取全量 + 增量 Oplog 的迁移方式。提前一天进行全备,割接当天只需备份增量的 Oplog 恢复即可,可大幅减少割接窗口。
实操过程
查看 Oplog 信息
检查并评估生产环境 Oplog 的产生信息,以防全量和增量备份期间产生的 Oplog 被覆盖掉。
mongo> db.getReplicationInfo()
{
"logSizeMB" : 20480,
"usedMB" : 20374.38,
"timeDiff" : 7074665,
"timeDiffHours" : 1965.18,
"tFirst" : "Fri Feb 24 2023 18:36:32 GMT+0800 (CST)",
"tLast" : "Wed May 17 2023 15:47:37 GMT+0800 (CST)",
"now" : "Wed May 17 2023 15:47:43 GMT+0800 (CST)"
}
可以看出在 1965.18h 的运行中,产生了 10374.38MB 大小的 Oplog。
全量备份
全量备份并拷贝备份期间产生的 Oplog 用来增量还原。
#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
outputdir=/data/mongobak_`date +%F`
authenticationdatabase=admin
start_time=`date +%s`
mongodump -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplog --gzip -o $outputdir
stop_time=`date +%s`
duration=$((stop_time-start_time))
echo "Spend times: $duration seconds"
全量恢复
利用全备进行数据恢复。
#!/bin/bashstart_time=`date +%s`
user=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
mongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay --gzip /data/mongobak_2023-07-17
stop_time=`date +%s`
duration=$((stop_time-start_time))
echo "Spend times: $duration seconds"
提取增量备份开始的时间点
全备备份出来的 Oplog,可以利用 bsondump 工具将 bson 转换为 json 格式,查看备份时间产生的最后的 Oplog 的时间戳,根据此时间戳来进行增量的 Oplog 备份。
shell> cd /data/ mongobak_2023-07-17
shell> mv oplog.bson oplog.bson.gz
shell> gzip -d oplog.bson.gz
shell> bsondump --pretty oplog.bson > op.json
查看 op.json 文件,找出增量备份开始的时间点。
"ts": {"$timestamp": {"t": 1686669429,"i": 4}
},
增量备份
备份 Oplog(时间戳大于上一次全备结束时的时间)。
#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
outputdir=/tmp/oplog_`date +%F`
authenticationdatabase=admin
start_time=`date +%s`
mongodump -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1686669429, "i":4}}}}' -o $outputdir
stop_time=`date +%s`
duration=$((stop_time-start_time))
echo "Spend times: $duration seconds"
增量恢复
#!/bin/bash
user=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
start_time=`date +%s`
mongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay /data/oplog_2023-07-17
stop_time=`date +%s`
duration=$((stop_time-start_time))
echo "Spend times: $duration seconds"
增量迁移后业务文档数量对比
分别在源端和目标端运行脚本,检查迁移完成后业务数据库下文档数量是否一致。
#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
mpid=`pidof mongod`
tooldir=`dirname $(ls -l /proc/$mpid/exe | awk '{print $11}')`
database=$(echo "show dbs" | $tooldir/mongo -uadmin --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --quiet |awk '{print $1}'| sed -E '/^admin$|^config$|^local$/d')
for db in $database
docollections=$(echo -e "use $db\n show collections" | $tooldir/mongo -u $user --host $host --port $port -p $password $authenticationdatabase --quiet | sed '/switched to db/d')for table in $collectionsdocount=$(echo -e "use $db\n db.$table.count()" | $tooldir/mongo -u $user --host $host --port $port -p $password --authenticationDatabase $authenticationdatabase --quiet | sed '/switched to db/d')echo "$db.$table have $count documents"done
done
源端运行结果:

目标端运行结果:

注意事项
- 使用 secondary 备份时,在割接停止业务后,增量备份前,首先检查下从库与主库的延时,确保主从没有延时,防止备份出的数据和主库不一致。
- 如果全备时指定了 gzip,在提取时间戳时要重命名
oplog.bson为oplog.bson.gz,然后解压,再利用bsondump工具解析 bson 文件,否则会报错。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
SQLE 获取
| 类型 | 地址 |
|---|---|
| 版本库 | https://github.com/actiontech/sqle |
| 文档 | https://actiontech.github.io/sqle-docs/ |
| 发布信息 | https://github.com/actiontech/sqle/releases |
| 数据审核插件开发文档 | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |
相关文章:
一则 MongoDB 副本集迁移实操案例
文中详细阐述了通过全量 增量 Oplog 的迁移方式,完成一套副本集 MongoDB 迁移的全过程。 作者:张然,DBA 数据库技术爱好者~ 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文约 900…...
2022年03月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题2分,共30分) 第1题 由1,2,3,4,5,0这六个数字经过排列组合能够组成多少个六位数偶数?注意:每一位都不相同,最高位不能为0。 A:720 B:360 C:312 D:88 答案:C 逻辑知识单选题 第2题 运行以下程…...
传音荣获2023首届全国人工智能应用场景创新挑战赛“智能家居专项赛”三等奖
近日,中国人工智能学会与科技部新一代人工智能发展研究中心联合举办2023首届全国人工智能应用场景创新挑战赛(2023 1st China’s Innovation Challenge on Artificial Intelligence Application Scene,以下简称CICAS 2023),吸引了…...
SQL注入-SQL注入过程
SQL注入的过程 手工注入过程 (1) 判断是否存在注入点; (2) 判断字段长度(字段数); (3) 判断字段回显位置; (4) 判断数据库信息; (5) 查找数据库名; (6) 查找数据库表; (7) 查找数据库表中所有字段以及字段值; (8) 猜解账号密码; (9) 登录管理员后台; 以sql-labs less-2举例 会…...
选择更灵活的设计工具:SOLIDWORKS 软件网络版与单机版的比较
随着科技的飞速发展,工程设计领域对于高效、灵活的设计工具需求日益增加。SOLIDWORKS 作为一款广受欢迎的三维设计软件,提供了网络版和单机版两种选择。在本文中,我们将深入探讨这两个版本的区别,并为您详细介绍它们的价格差异。 …...
Go语言中获取协程ID
简介 java同事都知道,线程会有对应的id,那么go语言中协程有id吗,其实是有的,但是不建议使用。 实在需要使用的话可以使用本文的例子获取 stack 我们先看一下runtime.Stack打印出来的栈结构,其中就包括了协程id fu…...
CH58x-BLE 程序阅读笔记
CH58x-BLE 程序阅读笔记 1. 广播1.1 广播类型设置1.2 广播数据长度 2. MTU设置2.1 CH58x 蓝牙协议栈支持有效最大MTU为247 1. 广播 1.1 广播类型设置 1.2 广播数据长度 1) GAP-广播数据(最大大小31字节,但最好保持较短以节省广告时的电量&a…...
ST53xx 系列是一种高精度、高输入电压、低静态电流、高速度、低压差线性稳压器
ST53xxS/T 40V,低静态电流,高可靠性 LDO 概述: ST53xx 系列是一种高精度、高输入电压、低静态电流、高速度、低压差线性稳压器,具有高纹波抑制能力。在 Vour 5V VIN 7V 时,输入电压高达40V,负载电流高达300…...
麻雀搜索优化算法MATLAB实现,SSA-BP网络
对于麻雀搜索算法的介绍,网上已经有不少资料了,这边公布SSA的matlab实现 下面展示SSA算法的核心代码以及详细注解 % 麻雀搜索算法函数定义 % 输入:种群大小(pop),最大迭代次数(Max_iter),搜索空间下界(lb),…...
142. 环形链表 II --力扣 --JAVA
题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使…...
深入浅出 Vue 中的插槽 slot
深入浅出 Vue 中的插槽 slot start 最近被问到好几次 Vue 中的插槽相关知识,掌握的还是有些不全面。抱着重新学习的心态,写这篇博客。首先对基础知识做一个回顾,然后再对源码实现做一个学习。作者:番茄编写时间:2023…...
postgreSQL 查询所有模式的语句
场景 postgre 数据库下携带模式的分组 sql select schema_name from information_schema.schemata;...
pandas教程:Introduction to scikit-learn scikit-learn简介
文章目录 13.4 Introduction to scikit-learn(scikit-learn简介) 13.4 Introduction to scikit-learn(scikit-learn简介) scikit-learn是一个被广泛使用的python机器学习工具包。里面包含了很多监督式学习和非监督式学习的模型&a…...
Linux配置路由功能及添加静态路由
一、配置路由功能 Linux作为路由器,Linux本身就具备路由功能,开启方式如下: 临时开启: echo "1" > /proc/sys/net/ipv4/ip_forward永久开启: vim /etc/sysctl.confnet.ipv4.ip_forward1 # 配置生效 sys…...
什么是Geo Trust OV证书
一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书,它是一种支持OpenSSL的数字证书,具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商,为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…...
selenium 工具 的基本使用
公司每天要做工作汇报,汇报使用的网页版, 所以又想起 selenium 这个老朋友了。 再次上手,发现很多接口都变了, 怎么说呢, 应该是易用性更强了, 不过还是得重新看看, 我这里是python3。 pip安装…...
Excel如何比较两列数据的不同
当遇到exel有两个列表的数据,需要比较得到他们的不同的部分,并且得到一个不同的值的列表。示例如下: 目的是:通过比较,知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能,如下图:…...
力扣labuladong——一刷day47
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣993. 二叉树的堂兄弟节点二、力扣1315. 祖父节点值为偶数的节点和三、力扣1448. 统计二叉树中好节点的数目四、力扣1469. 寻找所有的独生节点 前言 二叉…...
蓝桥杯-02-python组考点与14届真题
文章目录 蓝桥杯python组考点与14届真题参考资源python组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1:矩形切割(结果填空题)样题 2&…...
【0240】源码分析PG内核中的关键字列表(SQL keywords)
相关文章: 【0236】聊一聊PG内核中的命令标签(Command Tags、CommandTag、tag_behavior) 【0239】从编译原理角度理解 #include “xxx“ 或 #include<xxx> 的实现机制 1. PostgreSQL的SQL关键字列表(SQL Keywords) 1.1 keywords.c源文件内容 keywords.c源文件中的内容…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
