[20210318]bbed读取数据块.txt

来源:这里教程网 时间:2026-03-03 16:32:35 作者:

[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,特别行迁移以及链接的情况。

相关推荐