美文网首页
使用WiredTiger引擎wt 工具打捞数据

使用WiredTiger引擎wt 工具打捞数据

作者: 大地缸 | 来源:发表于2021-03-04 06:41 被阅读0次

title: "使用WiredTiger引擎wt 工具打捞数据"
date: 2021-02-17T08:13:37+08:00
draft: true
tags: ['wiredtiger','mongodb']
author: "dadigang"
author_cn: "大地缸"
personal: "http://www.real007.cn"


关于作者

http://www.real007.cn/about

使用WiredTiger引擎wt 工具打捞数据

文章目录

WiredTiger 存储引擎wt工具使用

mongodb 使用WiredTiger 存储引擎,如果数据文件损坏无法启动实例,同时无法使用备份恢复的情况下,可以考虑使用WiredTiger 存储引擎工具wt补救数据。尤其是在恢复单个collection文件时,特别实用。

本案例主要展示如何安装wt、如何使用wt打捞数据、如何获取mongodb 的元数据并和文件对应。

!注意

此文档适用mongodb 3.0之后版本。

文档案例基于mongodb 3.2.22 版本,其他版本实验结果可能存在差异

安装wt 工具

wt工具需要单独安装才能使用,打捞数据时,建议在非生产服务器安装工具,并进行数据恢复。

下载软件包

wget http://source.wiredtiger.com/releases/wiredtiger-3.2.1.tar.bz2

软件版本可以在 http://source.wiredtiger.com/ 获取

官方使用文档参考: http://source.wiredtiger.com/3.2.1/index.html

安装软件

  1. 编译软件
tar xvf wiredtiger-3.2.1.tar.bz2 && cd wiredtiger-3.2.1
./configure && make

重新编译前需要情况编译目录 make distclean

  1. 安装
make install

卸载: make uninstall

安装文档参考: http://source.wiredtiger.com/3.2.1/build-posix.html

通过数据文件打捞数据

准备数据

  1. 元数据拷贝

    从原始数据库目录(/data/db),拷贝以下文件到恢复目录(/data/bak):

_mdb_catalog.wt
storage.bson
WiredTigerLAS.wt
WiredTiger.turtle
sizeStorer.wt
WiredTiger
WiredTiger.lock
WiredTiger.wt

  1. 拷贝要恢复的数据文件,到恢复目录(/data/bak)
案例中文件名为:
collection-100102--6515743417462602428.wt

恢复数据

  1. 打捞数据
./wt -v -h /data/bak -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f /data/bak/collection.dump collection-100102--6515743417462602428

!注意

指定的文件不带后缀.wt

执行完成之后会在恢复目录生成collection.dump 文件

  1. 在恢复实例,新建一个集合,并把数据导入到集合对应的文件中
> show dbs;
db     0.000GB
db1    0.000GB
local  0.000GB
meta   0.016GB
> use recovery
switched to db recovery
> db.recovery.insert({})
WriteResult({ "nInserted" : 1 })
> db.recovery.count()
1
> db.recovery.find()
{ "_id" : ObjectId("5f3f42822d5ef36233066653") }
> db.recovery.remove({})
WriteResult({ "nRemoved" : 1 })
> db.recovery.stats()

……
"uri" : "statistics:table:collection-0-6622636875055800198",
……

如上,在stats输出中,有个uri字段,表示的即为collection和文件的对应关系

进入到mongodb 启动时指定的数据目录,找到对应的文件

[root@dbtest mongo]# pwd
/data/mongo
[root@dbtest mongo]# ls collection-0-6622636875055800198.wt -lh
-rw-r--r--. 1 root root 20K Aug 21 11:43 collection-0-6622636875055800198.wt
[root@dbtest mongo]#

  1. 暂停mongodb 实例,恢复数据到recovery 集合
./wt -v -h /data/mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R load -f /data/bak/collection.dump -r collection-0-6622636875055800198

导入成功会显示成功的文档数,如:

table:collection-0-6622636875055800198: 1

  1. 启动实例,检查数据
> db.recovery.count()
0 --此处显式0,是因为我们直接修改的数据,并没有更新元数据
>
>
>
> db.recovery.find()
{ "_id" : ObjectId("5f3d1e77e2c50600e01202f4"), "data" : [ { "request" : { "LanguageCode" : "CH", "Text" : "天天气怎样" }, "detail" : [ {  } ] } ], "dataType"   : "nlu_df", "errCode" : 20005, "errDetail" : "dialogflow config NOT found robotid ={\"tenantId\":\"RDK\",\"robotId\":\"862851236614634\",\"robotType\":\"Clou  d Ginger\",\"serviceCode\":\"ginger\",\"version\":\"1.0\",\"userId\":\"RDK254\"}.", "errMsg" : "DF_GRPC_RCC_DIALOGFLOW_NOT_FOUND_ERROR[20005]", "guid" : "5f3d  1e6aba986400b9bea007", "robotId" : "862851236614634", "robotType" : "Cloud Ginger", "serviceCode" : "ginger", "tenantId" : "RDK", "timestamp" : NumberLong("15  97840987355"), "userId" : "RDK254", "version" : "1.0", "_class" : "com.mongodb.BasicDBObject" }

  1. 导出数据
mongodump -d recovery -c recovery

mongorestore --drop

> db.recovery.count()
1
显示正常。

  1. 根据实际情况,导出数据并导入生产环境

获取元数据和数据文件对应关系

上面的操作步骤,使用的是新建恢复集合的方式,直接把数据导入到一个已知的集合,有些情况下,我们还需要根据实际需求直接从数据文件中读取元数据,例如,集合和文件的对应关系,索引和文件的对饮关系等。接下来的演示如何找到对应关系。

mongodb 的数据文件组成

mongodb 3.0之后默认的存储引擎为WiredTiger,mongodb将WiredTiger作为一个KV存储使用,每个集合/索引对应着WireTiger一个WT表(一个.wt文件)。

新建mongodb 实例,底层逻辑存储结构如下(启用--directoryperdb):

.
├── diagnostic.data
│   ├── metrics.2020-08-21T04-33-34Z-00000
│   └── metrics.interim
├── journal
│   ├── WiredTigerLog.0000000001
│   ├── WiredTigerPreplog.0000000001
│   └── WiredTigerPreplog.0000000002
├── local
│   ├── collection-0--5800790113660283275.wt
│   └── index-1--5800790113660283275.wt
├── _mdb_catalog.wt  // mongodb元数据信息,包含集合和wt表的对应,文档创建参数和索引信息。
├── mongod.lock //mongod实例启动的lock文件,防止多个实例读取一个文件
├── sizeStorer.wt //存储占用空间信息,文档大小,文档数等信息,每次文档修改都会更新该文件的cache信息,,每1000次操作刷新一次。实例crash 可能会造成size统计数据不准,可以通过validate()函数刷新。
├── storage.bson
├── WiredTiger
├── WiredTigerLAS.wt
├── WiredTiger.lock
├── WiredTiger.turtle
└── WiredTiger.wt

如果需要从WiredTiger 文件恢复mongodb 的元数据,只需要恢复 _mdb_catalog.wt数据即可,由于该文件也是一个wt表,依然可以通过wt工具恢复。

恢复元数据

  1. 拷贝要恢复的文件到恢复目录
cp /data/db/_mdb_catalog.wt /root/tmp/

  1. 使用wt打捞数据
./wt -v -h /root/tmp -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f /root/tmp/metdata.dump _mdb_catalog

  1. 导入数据,见 恢复数据第2步

  2. 导入数据

./wt -v -h /data/mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R load -f /root/tmp/metdata.dump -r local/collection-2--5800790113660283275
        table:local/collection-2--5800790113660283275: 281455

查找对应关系

元数据恢复成功后,可以通过查询,定位到wt文件对应的colletion名称

使用上面案例的文件,文件名为:collection-100102–6515743417462602428.wt

> db.metadata.find({"ident": "collection-100102--6515743417462602428"}).pretty()
{
        "md" : {
                "ns" : "rod-RDK.storage_biz_qa_rdk254_862851236614634",
                "options" : {

                },
                "indexes" : [
                        {
                                "spec" : {
                                        "v" : 1,
                                        "key" : {
                                                "_id" : 1
                                        },
                                        "name" : "_id_",
                                        "ns" : "rod-RDK.storage_biz_qa_rdk254_862851236614634"
                                },
                                "ready" : true,
                                "multikey" : false,
                                "head" : NumberLong(0)
                        }
                ]
        },
        "idxIdent" : {
                "_id_" : "index-100103--6515743417462602428"
        },
        "ns" : "rod-RDK.storage_biz_qa_rdk254_862851236614634",
        "ident" : "collection-100102--6515743417462602428"
}

相关文章

网友评论

      本文标题:使用WiredTiger引擎wt 工具打捞数据

      本文链接:https://www.haomeiwen.com/subject/efawfltx.html