| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MongoDB案例分享:如何使用oplog恢复数据 -> 正文阅读 |
|
[大数据]MongoDB案例分享:如何使用oplog恢复数据 |
最近跟数据恢复杠上了,这不又来一例。关于备份恢复的问题其实我在6年多以前就写过,其中大部分讨论放在今天仍然适用。 1案例介绍某用户使用了MongoDB 4.0,数据库中的一个表因为
步骤4属于基本操作就不详细叙述了,主要来看前面3步。 2恢复步骤2.1 导出oplog这一步实际上特别简单。 mongodump --host <host>:<port> -d local -c oplog.rs -u <user> --authenticationDatabase <adb> 得到如下输出: > tree dump dump └── local ├── oplog.rs.bson └── oplog.rs.metadata.json 1 directory, 2 files 我们需要的就是 2.2 寻找截止时间戳进行重放的关键是要先找出重放截止到哪条 方案1 从 > bsondump dump/local/oplog.rs.bson | grep drop {"ts":{"$timestamp":{"t":1646056645,"i":1}},"t":{"$numberLong":"1"},"h":{"$numberLong":"7307295890643732087"},"v":{"$numberInt":"2"},"op":"c","ns":"test.$cmd","ui":{"$binary":{"base64":"9sakiEOMS2qjwBZ5O0mQjQ==","subType":"04"}},"wall":{"$date":{"$numberLong":"1646056645661"}},"o":{"drop":"survey"}} 如果多次出现 方案2 从
这种情况通常是由于从节点是后来加进集群里导致的。那么想要查询时,可以使用: > use local > db.oplog.rs.find({"o.drop": {$exists: true}}).sort({$natural: -1}).limit(1); { "ts" : Timestamp(1646056729, 1), "t" : NumberLong(1), "h" : NumberLong("6882491835596436855"), "v" : 2, "op" : "c", "ns" : "test.$cmd", "ui" : UUID("a98cba5a-066b-46fe-92a9-d122386dba5d"), "wall" : ISODate("2022-02-28T13:58:49.167Z"), "o" : { "drop" : "survey" } } 同样注意 2.3 重放oplog
mkdir empty mongorestore --host <host>:<port> -u <user> --authenticationDatabase <adb> \ --oplogReplay \ --oplogFile dump/local/oplog.rs.bson \ --oplogLimit 1646056729:1 \ empty/ 注意:这里应该在一个新的实例上完成重放操作。 3改进方案上面的步骤虽然可以完成任务,但有些浪费。因为丢失的只有一个表,我们却恢复了整个数据库,消耗了不必要的时间。有没有办法只恢复丢失的那一个表呢?从原理来讲是可以办到的,那就是只重放这个表上的 mongodump --host <host>:<port> -d local -c oplog.rs -u <user> --authenticationDatabase <adb> -q '{"ns": "test.survey"}' 后续步骤没有什么差异,就不再赘述了。但是这样的做法有个bug,那就是事务。我一开始也栽在了这个问题上。事务会把多条操作放在一条 var mongo = db.getMongo(); var session = mongo.startSession(); session.startTransaction(); var coll = session.getDatabase("test").getCollection("survey"); coll.insertOne({y: 1}); coll.insertOne({y: 2}); coll.insertOne({y: 3}); session.commitTransaction(); 其产生的 { "ts": Timestamp(1646057834, 1), "t": NumberLong(1), "h": NumberLong("-2362908976881142089"), "v": 2, "op": "c", "ns": "admin.$cmd", "wall": ISODate("2022-02-28T14:17:14.189Z"), "lsid": { "id": UUID("02ca1f7e-f451-4ec3-946f-cf307c0d03b7"), "uid": BinData(0, "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=") }, "txnNumber": NumberLong(1), "stmtId": 0, "prevOpTime": { "ts": Timestamp(0, 0), "t": NumberLong(-1) }, "o": { "applyOps": [{ "op": "i", "ns": "test.survey", "ui": UUID("04a8b634-4048-48a6-b358-9a879c1a20ed"), "o": { "_id": ObjectId("621cd969a3a94c2e74b595c5"), "y": 1 } }, { "op": "i", "ns": "test.survey", "ui": UUID("04a8b634-4048-48a6-b358-9a879c1a20ed"), "o": { "_id": ObjectId("621cd969a3a94c2e74b595c6"), "y": 2 } }, { "op": "i", "ns": "test.survey", "ui": UUID("04a8b634-4048-48a6-b358-9a879c1a20ed"), "o": { "_id": ObjectId("621cd969a3a94c2e74b595c7"), "y": 3 } }] } } 可见这里的 mongodump --host <host>:<port> -d local -c oplog.rs -u <user> --authenticationDatabase <adb> -q '{"$or": [{"ns": "test.survey"}, {"o.applyOps.ns": "test.survey"}]}' 4结束语这个案例是个很极端的情况,所以不要想着抄作业,你几乎一定不会遇到相同的场景。但恢复的原理却是相通的,无论何种备份恢复都是“全量”+“增量”的做法,只要你理解了原理,剩下的就是动手尝试而已。 关于作者:张耀星 MongoDB中文社区常委会委员,论坛联席主席。 MongoDB公司北亚区首席技术咨询服务顾问。在MongoDB的开发、应用和咨询服务方面,拥有多年的丰富实践经验。 作为MongoDB认证专家,曾经为不同行业的各类大型客户提供过培训、性能调优、架构设计等各类技术及咨询服务,颇得广大客户信任。 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:52:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |