数码之家

 找回密码
 立即注册
搜索
查看: 9653|回复: 59

[软件] 记一次MongoDB数据库从崩(删)溃(库)到恢复的过程

    [复制链接]
发表于 2020-2-26 23:59:11 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在网上逛了一圈,好像也没详细写这个数据库如何恢复的文章,我自己就来整理一个比较详细的流程吧!

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

因为我个人不喜欢写博客啥的。不过个人经验还是分享一下吧。本文涉及的应用会上传到附件。
之前在某论坛上发过一次被删库后如何恢复,但是估计我说的不够清楚,很快就沉了

无独有偶,这两周因为疫情关系在家云办公,突然遇到了公司客户生产环境的数据库崩库了,而且同为Mongodb数据库,因此我需要远程为客户恢复生产环境。

有之前被删库恢复的经验后,这次我会把恢复过程尽力写的详细一点~!本文有关客户的数据隐私部分已经打码!

注意:个人切勿在生产环境上进行测试操作,因失误操作产生一切不可预料的严重后果均与本文作者无关
个人若需实操建议在测试环境或自建虚拟机测试


描述:由于MongoDB异常崩溃,导致部分collection物理文件损坏(相当于Oracle的表空间),数据库无法正常启动。之前我在某处写过一个Mongodb数据库被删除的恢复过程,但是个人说的不够详细,这次来讲详细一点。跟之前删库对比只是第一步找出数据文件有所区别而已。这里用一张图回顾下之前的不同处即可。其他地方都是大同小异,误删数据库的也可以尝试此方式。

这张图为删库恢复的帖子截图,后续操作大同小异。
image.png



【以下为正式开始】

恢复时会使用到的环境:WiredTiger Vmware CentOS7全新安装的Mongodb 4.0+一些C++类依赖库
情况描述:由于Windows服务器上的MongoDB进程异常崩溃,导致wt物理文件损坏,已造成Mongodb无法正常运行。

image.png


1.首先我查看启动日志文件表示部分collection无法通过校验。

image.png

2.随后再次查看data文件夹总共约有15G的数据文件
image.png

首先我把数据库文件复制了一份到本地。因为恢复过程中需要使用到Linux环境,因此我采用Vmware在本机电脑上安装了CentOS7虚拟机。

3.下载Centos7 x64镜像,在官网可找到https://www.centos.org/4.把刚才下载的CentOS7镜像安装到虚拟机
image.png

5.配置好基本虚拟机后开始安装,我这边给了200G硬盘,4核心CPU,8G内存
image.png

6.系统安装完成后,使用Xshell连接到虚拟机。随后把从生产环境上download下来的数据文件,通过WINSCP上传到虚拟机的Centos7系统上。
image.png

此处使用ifconfig查看一下虚拟机上的IP地址。用于远程连接使用SCP,传输需要恢复的文件
image.png


7. 下载WiredTigerhttp://source.wiredtiger.com/8. 下载依赖snappy【此依赖库难找】最后再GitHub上找到了源码9. 使用make&&makeinstall编译安装snappy【 Git地址https://github.com/google/snappy】

image.png

10. 此处附上一个Centos7系统 snappy的rpm包http://vault.centos.org/centos/7/os/Source/SPackages/snappy-1.1.0-3.el7.src.rpm12. 随后使用yuminstall snappy snappy-devel 13. 在Linux上创建一个文件夹,并解包下载过来的WiredTiger 源码,进入该目录14.  编译开始,先安装依赖 yum –y install libsnappy-dev build-essential15. 使用./configure--enable-snappy && make 编译源码【snappy安装正确时编译提示如下】

image.png

【此处如果snappy安装不正确会报依赖错误,报错如下图error: --enable-snappy requires snappy.h】


image.png

15.Wiredtiger编译安装完成后,可以使用./wt验证一下程序是否可用

image.png

16.安装一个Mongodb数据库,这边为了方便直接用宝塔平台一键安装一个Mongodb数据库就行了【如下图】
image.png

17.安装完成后,在shell上找到Mongodb的进程,并结束掉,因为我们需要手动调试导入相关数据,默认安装路径是在/www/server/mongodb内。
image.png


18.开始正式干活
这里可借助一些软件,例如Winhex,Ultraedit等支持十六进制编辑的软件打开collection物理文件。
image.png

当然数据文件很多。。直接这样做的方法费时费力,并不可取。我只需要查找到能保持我的业务系统正常运作的集合(表)即可。因此我使用Java写了个小工具用于查找collection内包含的目标数据片段。代码我会在后面附带上【临时写的,如果有BUG的话请多多谅解】。
image.png

通过工具查找,我得出了所需的业务表对应的collection物理文件。
image.png


19.先在Linux上安装一个MongoDB的临时数据库(我这里恢复和安装的临时数据库都在同一台虚拟机上)我在/home/mongodb/目录内创建了一个data目录,随后进入我刚才安装好的Mongodb数据库的bin路径输入mongod --dbpath /home/mongodb/data/--storageEngine wiredTiger --nojournal --bind_ip 0.0.0.0[命令解释mongod –dbpath [数据库物理路径] --storageEnginewiredTiger[存储引擎wiredTiger(重要参数)] --nojournal --bind_ip 0.0.0.0(允许所有IP连接) 启动后进入数据库的物理路径,我这里的物理文件存放在/home/mongodb/data/目录内20. 此时启动了数据库

image.png

随后切换至刚才创建的data目录内,使用ll查看目录内的collection物理文件
image.png

此处可用Robo 3T或者navicat连接到数据库上。如果连接不上,需要检查服务器的防火墙是否关闭或端口是否允许访问,家里的电脑只有navicat,我就将就用navicat连接Mongodb了

image.png

21.先创建一个数据库,我这边创建了一个名为recovery的数据库22.随后使用db.createCollection("collection")创建一个新的集合
image.png

随后/home/mongodb/data/物理路径内会对应的多出一个collection及index文件使用ll进行查看,其实这里也能参考文件生成时间判断,并记录下刚刚生产的collection的这个文件名,例如collection-0-7—7949******.wt

image.png


23. 随后进入你解压并编译好的WiredTiger 工具目录24.以下为关键步骤使用mkdir创建一个dump目录【创建在哪里自己记住路径即可,如果遇到wt损坏,这会无法dump出来】使用命令把collection进行dump(dump过程中不会有进度显示,dump完成后会直接返回到root@localhost命令输入界面) ./wt -v -h /home/mongodb/tmp-mongo/ -C"extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]"-R dump -f /home/mongodb/tmp-mongo/dump/collection-481-8046098457195716502.dumpcollection-481-8046098457195716502命令解释(./wt -v -h /home/mongodb/ tmp-mongo/[这里是我刚刚上传从被删库服务器上恢复出来的collection物理文件目录] -C"extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]"-R dump -f /home/mongodb/tmp-mongo/dump/collection-481-8046098457195716502.dump[这里是我刚刚创建的dump目录路径] collection-481-8046098457195716502[需要进行dump的collection物理文件,注意此处不要带.wt后缀]) Dump会有失败的情况,如果失败则证明此数据文件已损坏,不具备修复及恢复可能 此时dump目录就会生成一个新的collection--****.dump文件

image.png

随后把dump出来的collection load到Recover临时库的collection上(此步需要先把MongoDB数据库服务停止)【还记得我刚才说的db.createCollection("collection")命令创建的物理文件吗,忘记的话,往上翻找出来即可,这步需要先停止数据库,完成后重新启动即可】随后使用./wt -v -h /home/mongodb/data/ -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]"-R load -f /home/mongodb/ tmp-mongo/dump/collection-481-8046098457195716502.dump-r collection-12--794979766327542825 命令把恢复出来的collection load到Recover库的collection上。命令详解(./wt -v -h /home/mongodb/tmp-mongo/ [MongoDB临时库的路径,就是MongoDB的data目录路径]-C"extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]"-R load -f /home/mongodb/tmp-mongo/dump/collection-481-8046098457195716502.dump [这里是刚才dump出来的文件] -r collection-12--794979766327542825[刚才使用db.createCollection("collection")创建并记录的物理文件名,注意此处不要带.wt后缀]) 随后,导入成功,如下图,再次重启数据库

image.png

此时可以打开navicat查看集合,可见数据已被恢复
image.png


恢复出来的表检测没问题后再次从这台虚拟机中进行导出操作 主要步骤:
1.把刚才恢复出来的数据从临时集合中(表)导出
2.在生产环境的业务数据库上重新创建一个数据库。
3.把业务系统的表结构先导入。
4.再次把恢复导出来的集合(表)重新加载进业务数据库上。
5.再次启动业务数据库,即可完成恢复操作。

本次恢复主要耗时基本都在集合数据查找及分析部分,因为Mongodb存储引擎的特性,可能会找到许多相似的片段,如果找出相似的还需要进一步进行分析。此外以上WiredTiger工具的命令会比较复杂,输入的时候需要留意空格一类的,不然会造成命令无法被正常识别

本文可转载,但是转载请注明出处!谢谢!

snappy-1.1.0-3.el7.src.zip

1.54 MB, 下载次数: 4, 下载积分: 家元 -55

snappy-master.zip

1.1 MB, 下载次数: 4, 下载积分: 家元 -55

wiredtiger-3.2.1.zip

3.49 MB, 下载次数: 3, 下载积分: 家元 -55

搜索器JAVA代码.rar

1.29 KB, 下载次数: 5, 下载积分: 家元 -55

打赏

参与人数 13家元 +242 收起 理由
的结构是什么 + 30 優秀文章
llcc + 20
沙漠臭屁虫 + 20
xu6965319 + 20 優秀文章
wwwji + 20 優秀文章
newnet1234 + 20 謝謝分享
花生仔 + 20 謝謝分享
hongo + 20 原創內容
2n3055 + 20 優秀文章
ch104517745 + 20 優秀文章

查看全部打赏

发表于 2020-2-27 01:33:15 | 显示全部楼层
只用过sql和ora的膜拜下,看不懂啊:shy:
回复 支持 反对

使用道具 举报

发表于 2020-2-27 08:51:51 来自手机浏览器 | 显示全部楼层
还是sqlserver和oracle好,直接用配套的日志分析工具就行了

点评

Mongodb也有日志,但是日志多的头大。目前好像也没啥配套工具  详情 回复 发表于 2020-2-27 09:53
回复 支持 反对

使用道具 举报

发表于 2020-2-27 09:33:14 | 显示全部楼层
只用过mysql,看着好复杂的,高手。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-27 09:53:19 | 显示全部楼层
yukimura_z 发表于 2020-2-27 08:51
还是sqlserver和oracle好,直接用配套的日志分析工具就行了

Mongodb也有日志,但是日志多的头大。目前好像也没啥配套工具

打赏

参与人数 1家元 +20 收起 理由
xu6965319 + 20 優秀文章

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-27 21:14:19 来自手机浏览器 | 显示全部楼层
不明觉厉,膜拜大佬
回复 支持 反对

使用道具 举报

发表于 2020-2-27 23:32:28 来自手机浏览器 | 显示全部楼层
谢谢,你的这个回答非常有用。
回复 支持 反对

使用道具 举报

发表于 2020-2-28 00:14:56 | 显示全部楼层
好高级的感觉,不明觉厉:shocked:
回复 支持 反对

使用道具 举报

发表于 2020-2-28 11:07:59 来自手机浏览器 | 显示全部楼层
已收藏,好帖,oracle恢复弄过,其他了解不多,学习了
回复 支持 反对

使用道具 举报

发表于 2020-2-28 20:17:21 来自手机浏览器 | 显示全部楼层
哈哈这个是好的帖子,能学到真
回复 支持 反对

使用道具 举报

发表于 2020-2-28 21:16:32 | 显示全部楼层
走过路过旁观一下
回复 支持 反对

使用道具 举报

发表于 2020-2-29 03:52:28 来自手机浏览器 | 显示全部楼层
只会用win下mysql
linux实在学不会
回复 支持 反对

使用道具 举报

发表于 2020-2-29 16:01:28 | 显示全部楼层
留名收藏,顺便拜高手:smile:
回复 支持 反对

使用道具 举报

发表于 2020-3-1 13:37:21 | 显示全部楼层
MongoDB是什么,没听过,有听过mysql,用过sqlserver和oracle
回复 支持 反对

使用道具 举报

发表于 2020-3-1 15:22:35 | 显示全部楼层
备份加离线备份!离线备份很重要,关键时刻能救你一命!
维护过十年左右的Oracle,遇到过两次崩溃,都靠事先的离线备份把损失降到最低。

点评

热备份才是王道  发表于 2020-3-4 22:22
这东西就坑在这里,有离线备份的,然而主数据库进程启动不起来备份导入就校验错误了,重建了数据库导入也是各种报错。感觉这备份文件根本不是全库备份。毕竟我只是过来打酱油的,备份不是我做的  详情 回复 发表于 2020-3-1 18:53
回复 支持 反对

使用道具 举报

发表于 2020-3-1 17:28:41 | 显示全部楼层
前段时间是不是有个程序员老婆被睡,程序员删库的事件:shocked:,是不是真的

点评

哈哈,最后公司陪了1.5个亿,这程序员真的是直男,麻痹的,有钱害怕没女人。  详情 回复 发表于 2020-3-4 19:38
你这问到太深层的问题了~~~哈哈 其实没必要,遇到一个渣女人,离了就算了,为了这种人牺牲自己的事业,没必要。 渣女如衣服,这年头,遇到几件衣服很正常,丢了就行,理性的过好自己生活。  详情 回复 发表于 2020-3-3 18:57
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 18:53:09 | 显示全部楼层
madaxiazi 发表于 2020-3-1 15:22
备份加离线备份!离线备份很重要,关键时刻能救你一命!
维护过十年左右的Oracle,遇到过两次崩溃,都靠事 ...

这东西就坑在这里,有离线备份的,然而主数据库进程启动不起来备份导入就校验错误了,重建了数据库导入也是各种报错。感觉这备份文件根本不是全库备份。毕竟我只是过来打酱油的,备份不是我做的:lol:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 23:08 , Processed in 0.546001 second(s), 19 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表