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"
关于作者
使用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/ 获取
安装软件
- 编译软件
tar xvf wiredtiger-3.2.1.tar.bz2 && cd wiredtiger-3.2.1
./configure && make
重新编译前需要情况编译目录
make distclean
- 安装
make install
卸载:
make uninstall
通过数据文件打捞数据
准备数据
-
元数据拷贝
从原始数据库目录(/data/db),拷贝以下文件到恢复目录(/data/bak):
_mdb_catalog.wt
storage.bson
WiredTigerLAS.wt
WiredTiger.turtle
sizeStorer.wt
WiredTiger
WiredTiger.lock
WiredTiger.wt
- 拷贝要恢复的数据文件,到恢复目录(/data/bak)
案例中文件名为:
collection-100102--6515743417462602428.wt
恢复数据
- 打捞数据
./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
文件
- 在恢复实例,新建一个集合,并把数据导入到集合对应的文件中
> 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]#
- 暂停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
- 启动实例,检查数据
> 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" }
- 导出数据
mongodump -d recovery -c recovery
mongorestore --drop
> db.recovery.count()
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工具恢复。
恢复元数据
- 拷贝要恢复的文件到恢复目录
cp /data/db/_mdb_catalog.wt /root/tmp/
- 使用wt打捞数据
./wt -v -h /root/tmp -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f /root/tmp/metdata.dump _mdb_catalog
-
导入数据,见 恢复数据第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"
}
网友评论