暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mog_filedump的恢复数据

原创 hehe 2022-02-10
741

在mogdb中少量数据的删除时可以通过mog_filedump工具恢复被误删除的数据行的。还有他也有很多的参数,可以去分析block images,数据块的内容,以及item的内容,绝对路径,文件块内容,段大小,段个数,数据块大小。
-a 显示绝对路径表文件数据块的header和data
-b 输出一个范围的二进制block images
-d 输出文件块内容
-D 表的数据类型。
目前支持的数据类型有:bigint、bigserial、bool、charN、date、float、float4、
float8、int、json、macaddr、name、oid、real、serial、smallint、
smallserial、text、time、timestamp、timetz、uuid、varchar、varcharN、xid、
xml、~。
'~'表示忽略后面所有的数据类型,比如元组有10列,-D 前三列数据类型, ~表示只解析该
表元组前三列数据。
-f 输出并解析数据块的内容
-i 输出并解析item的详细信息(其中包含XMIN、XMAX、Block Id、linp Index、Attributes、Size、infomask)
-k 核实数据块的校验和
-R 解析并输出指定LSN范围的数据文件内容,例如 -R startblock [endblock]。如果只有
startblock没有endblock,则只输出单个数据块内容
-s 设置segment大小
-n 设置segment数量
-S 设置数据块大小
-x 把块items当作索引item格式解析并输出(默认自带)
-y 把块items当作堆item格式解析并输出(默认自带)

其原理是虽然数据被删除了,但在数据文件中其仅仅是被标记为删除,而并未被清空;只要在auto vaccum之前都可以通过mog_filedump工具恢复这部分数据。

以前测试过删除,这里进测试数据恢复到另一张表。

sbtest=# select * from sbtest8 limit 3;
id | k | c
| pad
----±------±------------------------------------------------------------------------------------------------------------------
-------±-------------------------------------------------------------
1 | 50262 | 17071294348-87769262458-98919982585-61875153729-40901861439-36695986184-90395989221-12660058883-86866969327-077535
90385 | 47105181084-48806947628-84621296382-49482909434-46593011898
2 | 50047 | 41638255198-30787347272-76641968504-79628405774-42701081390-57108180868-85431006942-44866150603-05155796308-585690
25129 | 69706772486-89854160653-60444433483-17338230399-87013841094
3 | 59540 | 25814638913-91319561380-35196922548-68446914500-89034752629-69939506398-58773210032-08813413790-91040301468-083723
45269 | 39310992949-33725282723-17934878144-48523738232-38611340752

找到sbtest8 的绝对路径

sbtest=# select pg_relation_filepath(‘sbtest8’);
pg_relation_filepath

base/16403/16476

使用mog_filedump来检查数据文件
root@mogdb001 mog_filedump]# mog_filedump -D int,int,charN,charN /mogdb/base/16403/16476|grep -i copy|awk -F ‘:’ ‘{print $2}’|more
1 50262 17071294348-87769262458-98919982585-61875153729-40901861439-36695986184-90395989221-12660058883-86866969327-0775
3590385 47105181084-48806947628-84621296382-49482909434-46593011898
2 50047 41638255198-30787347272-76641968504-79628405774-42701081390-57108180868-85431006942-44866150603-05155796308-5856
9025129 69706772486-89854160653-60444433483-17338230399-87013841094
3 59540 25814638913-91319561380-35196922548-68446914500-89034752629-69939506398-58773210032-08813413790-91040301468-0837
2345269 39310992949-33725282723-17934878144-48523738232-38611340752

文件内容解释
COPY: 1 50262 17071294348-87769262458-98919982585-61875153729-40901861439-36695986184-90395989221-12660058883-86866969327-07753590385 47105181084-48806947628-84621296382-49482909434-46593011898

sbtest8表结构

sbtest=# \d sbtest8
Table “public.sbtest8”
Column | Type | Modifiers
--------±---------------±-----------------------------------------------------
id | integer | not null default nextval(‘sbtest8_id_seq’::regclass)
k | integer | not null default 0
c | character(120) | not null default NULL::bpchar
pad | character(60) | not null default NULL::bpchar
Indexes:
“sbtest8_pkey” PRIMARY KEY, btree (id) TABLESPACE pg_default
“k_8” btree (k) TABLESPACE pg_default

其中id,k,c,pad都是一一对应的
id就是 1
k就是 50262
c就是 17071294348-87769262458-98919982585-61875153729-40901861439-
36695986184-90395989221-12660058883-86866969327-07753590385
pad就是 47105181084-48806947628-84621296382-49482909434-46593011898

然后进行数据切割和输入到文件里面
[root@mogdb001 moguser]# mog_filedump -D int,int,charN,charN /mogdb/base/16403/16476|grep -i copy|awk -F ‘:’ ‘{print $2}’>sbtest17

查案sbtest17文件内容
root@mogdb001 moguser]# more /home/moguser/sbtest17
1 50262 17071294348-87769262458-98919982585-61875153729-40901861439-36695986184-90395989221-12660058883-86866969327-0775
3590385 47105181084-48806947628-84621296382-49482909434-46593011898
2 50047 41638255198-30787347272-76641968504-79628405774-42701081390-57108180868-85431006942-44866150603-05155796308-5856
9025129 69706772486-89854160653-60444433483-17338230399-87013841094
3 59540 25814638913-91319561380-35196922548-68446914500-89034752629-69939506398-58773210032-08813413790-91040301468-0837
2345269 39310992949-33725282723-17934878144-48523738232-38611340752

创建和sbtest8一模一样的表结构,相比较起来mogdb还是比mysql的建表复杂一些,他没有原命令去查询较定义语句,如果涉及到seq的话,还需要手动重新建立序列,要不然会报ERROE
比如:
sbtest=# CREATE TABLE sbtest17 (
id integer DEFAULT nextval(‘sbtest17_id_seq’::regclass) NOT NULL,
k integer DEFAULT 0 NOT NULL,
c character(120) DEFAULT NULL::bpchar NOT NULL,
pad character(60) DEFAULT NULL::bpchar NOT NULL
);
ERROR: relation “sbtest17_id_seq” does not exist

CREATE INDEX k_17 ON sbtest17 USING btree (k) TABLESPACE pg_default;
ERROR: relation “sbtest17_id_seq” does not exist

ALTER TABLE sbtest17 ADD CONSTRAINT sbtest17_pkey PRIMARY KEY (id);
ERROR: relation “sbtest17” does not exist

最后就是一个copy的操作了,这样的话数据就恢复回去了
sbtest=# copy sbtest17 from ‘/home/moguser/sbtest17’;
COPY 3

select * from sbtest17 limit 3;
id | k | c
| pad
----±------±------------------------------------------------------------------------------------------------------------------
-------±-------------------------------------------------------------
1 | 50262 | 17071294348-87769262458-98919982585-61875153729-40901861439-36695986184-90395989221-12660058883-86866969327-077535
90385 | 47105181084-48806947628-84621296382-49482909434-46593011898
2 | 50047 | 41638255198-30787347272-76641968504-79628405774-42701081390-57108180868-85431006942-44866150603-05155796308-585690
25129 | 69706772486-89854160653-60444433483-17338230399-87013841094
3 | 59540 | 25814638913-91319561380-35196922548-68446914500-89034752629-69939506398-58773210032-08813413790-91040301468-083723
45269 | 39310992949-33725282723-17934878144-48523738232-38611340752

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论