首页 > 数据库 > Oracle > [20210318]bbed读取数据块.txt
[20210318]bbed读取数据块.txt
--//昨天同事一个小错误,本来是dml操作错误,需要恢复部分数据,然后导入,结果操作顺序出现错误,同事先做了truncate。
--//导致执行select * from ... as of timestamp 时报错表定义已经改变。我估计应该是先执行了select * from ... as of timestamp,
--//发现需要恢复的信息,然后在选择truncate,再次执行时报错。当然最后是有惊无险,dg是打开闪回的,恢复到特定时间,在恢复就
--//ok了。
--//我再想truncate后如果没有覆盖,读取原来的数据块信息还是可行的,我尝试bbed看看是否能读取数据,然后再导入数据。
--//仔细想想还是不行,主要会遇到会遇到各种无法预知的情况,比如行链接以及迁移,恢复表很大都是因素。不过我先那emp表来练习看看。
--//读取数据块信息再导入看看是否可行。
1.环境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2.准备:
SCOTT@book> select rowid from emp where rownum=1;
ROWID
------------------
AAAVREAAEAAAACXAAA
SCOTT@book> @ rowid AAAVREAAEAAAACXAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
87108 4 151 0 0x1000097 4,151 alter system dump datafile 4 block 151 ;
--//就拿dba=4,151的数据块来测试。
3.测试:
$ cat fff.sh
#! /bin/bash
dba=4,151
kdbr_size=$(echo map dba $dba | rlbbed | grep "sb2 kdbr" | sed -e "s/^.*\[//;s/].*$//")
#echo $kdbr_size
begin=0
end=$[ kdbr_size -1 ]
while [ $begin -le $end ]
do
kdbr_off=$(echo p dba $dba offset 0 kdbr | rlbbed | grep "sb2 kdbr\[$begin\]" | awk '{print $NF'})
#echo $kdbr_off
# if [ $kdbr_off -gt $kdbr_size ]
# if [[ $kdbr_off > $kdbr_size ]]
if (( $kdbr_off > $kdbr_size ))
then
echo -n "x /rnccntnnn dba $dba *kdbr[$begin]" | rlbbed | grep "^col " | cut -c20- | paste -sd'|'
fi
begin=$[ begin + 1 ]
done
--//补充说明一些细节:
$ echo p dba $dba offset 0 kdbr | rlbbed | grep "sb2 kdbr\[0\]"
BBED> sb2 kdbr[0] @118 8050
$ echo p dba $dba offset 0 kdbr | rlbbed | grep "sb2 kdbr\[1\]"
sb2 kdbr[1] @120 8007
--//过滤输出sb2 kdbr[0]时有一点点问题,多了1个BBED>开头,awk 只能改为awk '{print $NF'}。
--//这样保证不会出错,bbed如何规避这个问题呢?
--//我以前写的tab$脚本是否会遇到类似的问题呢?
$ . fff.sh
7369 |SMITH|CLERK|7902 |1980-12-17 00:00:00 |800 |*NULL*|20
7499 |ALLEN|SALESMAN|7698 |1981-02-20 00:00:00 |1600 |300 |30
7521 |WARD|SALESMAN|7698 |1981-02-22 00:00:00 |1250 |500 |30
7566 |JONES|MANAGER|7839 |1981-04-02 00:00:00 |2975 |*NULL*|20
7654 |MARTIN|SALESMAN|7698 |1981-09-28 00:00:00 |1250 |1400 |30
7698 |BLAKE|MANAGER|7839 |1981-05-01 00:00:00 |2850 |*NULL*|30
7782 |CLARK|MANAGER|7839 |1981-06-09 00:00:00 |2450 |*NULL*|10
7788 |SCOTT|ANALYST|7566 |1987-04-19 00:00:00 |3000 |*NULL*|20
7839 |KING|PRESIDENT|*NULL*|1981-11-17 00:00:00 |5000 |*NULL*|10
7844 |TURNER|SALESMAN|7698 |1981-09-08 00:00:00 |1500 |0 |30
7876 |ADAMS|CLERK|7788 |1987-05-23 00:00:00 |1100 |*NULL*|20
7900 |JAMES|CLERK|7698 |1981-12-03 00:00:00 |950 |*NULL*|30
7902 |FORD|ANALYST|7566 |1981-12-03 00:00:00 |3000 |*NULL*|20
7934 |MILLER|CLERK|7782 |1982-01-23 00:00:00 |1300 |*NULL*|10
--//注意一些细节bbed取出的数据字符串后面没有空格外,其它都有1个空格在结尾,并且NULL使用*NULL*表示。
--//另外分割符可以使用ascii(7),对应ctrl+g,在linux下可以通过ctrl+v ,ctrl+g输入,避免冲突。我的测试使用|作为分隔符。
4.导入看看:
SCOTT@book> create table empx as select * from emp where 1=2;
Table created.
--//整理本文如下,使用vim的替换功能:
--//:%s+ |+|+g
--//:%s+ $++g
--//:%s+|\*NULL\*|++g
7369|SMITH|CLERK|7902|1980-12-17 00:00:00|800||20
7499|ALLEN|SALESMAN|7698|1981-02-20 00:00:00|1600|300|30
7521|WARD|SALESMAN|7698|1981-02-22 00:00:00|1250|500|30
7566|JONES|MANAGER|7839|1981-04-02 00:00:00|2975||20
7654|MARTIN|SALESMAN|7698|1981-09-28 00:00:00|1250|1400|30
7698|BLAKE|MANAGER|7839|1981-05-01 00:00:00|2850||30
7782|CLARK|MANAGER|7839|1981-06-09 00:00:00|2450||10
7788|SCOTT|ANALYST|7566|1987-04-19 00:00:00|3000||20
7839|KING|PRESIDENT||1981-11-17 00:00:00|5000||10
7844|TURNER|SALESMAN|7698|1981-09-08 00:00:00|1500|0|30
7876|ADAMS|CLERK|7788|1987-05-23 00:00:00|1100||20
7900|JAMES|CLERK|7698|1981-12-03 00:00:00|950||30
7902|FORD|ANALYST|7566|1981-12-03 00:00:00|3000||20
7934|MILLER|CLERK|7782|1982-01-23 00:00:00|1300||10
--//导入细节略,我是使用toad自带的import功能实现的。
SCOTT@book> select * from empx minus select * from emp;
no rows selected
SCOTT@book> select * from emp minus select * from empx;
no rows selected
4.总结:
--//不实用,问题多多,权当做练习吧。
--//有机会再完成更加复杂的情况,总之遇到特殊情况不好处理通过bbed,特别行迁移以及链接的情况。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2763492/ ,如需转载,请注明出处,否则将追究法律责任。