|
在网上逛了一圈,好像也没详细写这个数据库如何恢复的文章,我自己就来整理一个比较详细的流程吧!
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
因为我个人不喜欢写博客啥的。不过个人经验还是分享一下吧。本文涉及的应用会上传到附件。
之前在某论坛上发过一次被删库后如何恢复,但是估计我说的不够清楚,很快就沉了
无独有偶,这两周因为疫情关系在家云办公,突然遇到了公司客户生产环境的数据库崩库了,而且同为Mongodb数据库,因此我需要远程为客户恢复生产环境。
有之前被删库恢复的经验后,这次我会把恢复过程尽力写的详细一点~!本文有关客户的数据隐私部分已经打码!
注意:个人切勿在生产环境上进行测试操作,因失误操作产生一切不可预料的严重后果均与本文作者无关
个人若需实操建议在测试环境或自建虚拟机测试
描述:由于MongoDB异常崩溃,导致部分collection物理文件损坏(相当于Oracle的表空间),数据库无法正常启动。之前我在某处写过一个Mongodb数据库被删除的恢复过程,但是个人说的不够详细,这次来讲详细一点。跟之前删库对比只是第一步找出数据文件有所区别而已。这里用一张图回顾下之前的不同处即可。其他地方都是大同小异,误删数据库的也可以尝试此方式。
这张图为删库恢复的帖子截图,后续操作大同小异。
【以下为正式开始】
恢复时会使用到的环境:WiredTiger Vmware CentOS7全新安装的Mongodb 4.0+一些C++类依赖库
情况描述:由于Windows服务器上的MongoDB进程异常崩溃,导致wt物理文件损坏,已造成Mongodb无法正常运行。
1.首先我查看启动日志文件表示部分collection无法通过校验。
2.随后再次查看data文件夹总共约有15G的数据文件
首先我把数据库文件复制了一份到本地。因为恢复过程中需要使用到Linux环境,因此我采用Vmware在本机电脑上安装了CentOS7虚拟机。
3.下载Centos7 x64镜像,在官网可找到https://www.centos.org/4.把刚才下载的CentOS7镜像安装到虚拟机
5.配置好基本虚拟机后开始安装,我这边给了200G硬盘,4核心CPU,8G内存
6.系统安装完成后,使用Xshell连接到虚拟机。随后把从生产环境上download下来的数据文件,通过WINSCP上传到虚拟机的Centos7系统上。
此处使用ifconfig查看一下虚拟机上的IP地址。用于远程连接使用SCP,传输需要恢复的文件
7. 下载WiredTigerhttp://source.wiredtiger.com/8. 下载依赖snappy【此依赖库难找】最后再GitHub上找到了源码9. 使用make&&makeinstall编译安装snappy【 Git地址https://github.com/google/snappy】
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安装正确时编译提示如下】
【此处如果snappy安装不正确会报依赖错误,报错如下图error: --enable-snappy requires snappy.h】
15.Wiredtiger编译安装完成后,可以使用./wt验证一下程序是否可用
16.安装一个Mongodb数据库,这边为了方便直接用宝塔平台一键安装一个Mongodb数据库就行了【如下图】
17.安装完成后,在shell上找到Mongodb的进程,并结束掉,因为我们需要手动调试导入相关数据,默认安装路径是在/www/server/mongodb内。
18.开始正式干活
这里可借助一些软件,例如Winhex,Ultraedit等支持十六进制编辑的软件打开collection物理文件。
当然数据文件很多。。直接这样做的方法费时费力,并不可取。我只需要查找到能保持我的业务系统正常运作的集合(表)即可。因此我使用Java写了个小工具用于查找collection内包含的目标数据片段。代码我会在后面附带上【临时写的,如果有BUG的话请多多谅解】。
通过工具查找,我得出了所需的业务表对应的collection物理文件。
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. 此时启动了数据库
随后切换至刚才创建的data目录内,使用ll查看目录内的collection物理文件
此处可用Robo 3T或者navicat连接到数据库上。如果连接不上,需要检查服务器的防火墙是否关闭或端口是否允许访问,家里的电脑只有navicat,我就将就用navicat连接Mongodb了
21.先创建一个数据库,我这边创建了一个名为recovery的数据库22.随后使用db.createCollection("collection")创建一个新的集合
随后/home/mongodb/data/物理路径内会对应的多出一个collection及index文件使用ll进行查看,其实这里也能参考文件生成时间判断,并记录下刚刚生产的collection的这个文件名,例如collection-0-7—7949******.wt
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文件
随后把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后缀]) 随后,导入成功,如下图,再次重启数据库
此时可以打开navicat查看集合,可见数据已被恢复
恢复出来的表检测没问题后再次从这台虚拟机中进行导出操作 主要步骤:
1.把刚才恢复出来的数据从临时集合中(表)导出
2.在生产环境的业务数据库上重新创建一个数据库。
3.把业务系统的表结构先导入。
4.再次把恢复导出来的集合(表)重新加载进业务数据库上。
5.再次启动业务数据库,即可完成恢复操作。
本次恢复主要耗时基本都在集合数据查找及分析部分,因为Mongodb存储引擎的特性,可能会找到许多相似的片段,如果找出相似的还需要进一步进行分析。此外以上WiredTiger工具的命令会比较复杂,输入的时候需要留意空格一类的,不然会造成命令无法被正常识别
本文可转载,但是转载请注明出处!谢谢!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|