[20210318]bbed讀取資料塊.txt

lfree發表於2021-03-18

[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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2763492/,如需轉載,請註明出處,否則將追究法律責任。

相關文章