[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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2763492/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20210318]bbed讀取資料塊2.txt
- [20210906]bbed讀取資料塊(bbed-wrap.sh).txt
- [20210323]bbed讀取資料塊5.txt
- [20210319]bbed讀取資料塊3.txt
- [20210831]bbed讀取資料塊6.txt
- [20210930]bbed讀取資料塊7 fffext.sh.txt
- [20210401]使用bbed讀取資料塊恢復注意6.txt
- [20170419]bbed探究資料塊.txt
- [20220223]bbed讀取資料塊mssm與assm 2.txtSSM
- [20150522]bbed與資料塊檢查和.txt
- [20150527]bbed與資料塊檢查和2.txt
- oracle bbed修改資料塊的例子Oracle
- bbed_recover:恢復資料塊資料庫資料庫
- --bbed_recover:恢復資料塊資料庫(mybbed)資料庫
- bbed_recover:恢復資料塊資料庫(續)資料庫
- [20170412]bbed隱藏資料記錄.txt
- netty讀取大塊的有分界資料Netty
- 使用BBED幫助理解Oracle資料塊結構Oracle
- [20190124]bbed恢復資料遇到延遲塊清除的問題.txt
- c++ 從txt讀取資料 按照特殊字元拆分 gnssC++字元
- [20190104]bbed手工插入資料.txt
- [20140624]bbed修改資料記錄.txt
- BBED (Oracle Block Brower and EDitor Tool) :資料塊修復工具OracleBloC
- openfiledialog 使用 讀取txt檔案 StreamReader 檢驗資料
- C++(2) 從yml或者txt讀取和儲存資料C++
- c++ (2-0) 從txt讀取和儲存資料C++
- [20190104]bbed手動修改資料.txt
- [20160526]bbed修改資料記錄(不等長).txt
- [20190124]bbed恢復資料遇到延遲塊清除的問題2.txt
- 用bbed檢視資料檔案的資料塊block 0及block 1BloC
- 【BBED】使用bbed修改數字型別資料型別
- 【BBED】使用bbed修改字元型別資料字元型別
- [20180604]在記憶體修改資料(bbed).txt記憶體
- [20140624]bbed修改資料記錄(不等長).txt
- [20190125]bbed恢復資料遇到延遲塊清除的問題3.txt
- 讀取CSV資料
- excel 資料讀取Excel
- [20160531]windows下bbed修復corrupt資料塊Windows