[20220909]bbed關於刪除記錄恢復的問題.txt

来源:https://www.cnblogs.com/lfree/archive/2022/09/21/16717220.html
-Advertisement-
Play Games

如果現在的我們離開了互聯網,生活會是什麼樣子? 互聯網++++,已經深刻滲透到人們的生活中。 不知道大家有沒有想過?每一個互聯網+結合的背後都是海量的存儲需求。你查看的每一個商品、組建的每一個戰隊、閱讀的每一篇文章,基於互聯網的每一個興趣愛好,都有它的key和value。 在 key-value 數 ...


[20220909]bbed關於刪除記錄恢復的問題.txt

--//快下班被別人問的關於刪除記錄使用bbed恢復的問題,我開始以為很快講解完,刪除記錄oracle僅僅打上一個標識,實際的記錄還存在.
--//實際上地方問的是多次DML(刪除記錄的情況),實際上只要dump還能看到,bbed還是可以恢復的,做一個例子說明:

1.環境:
[email protected]> @ver1
PORT_STRING          VERSION    BANNER                                                                       CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production      0

[email protected]> create table deptx as select * from dept ;
Table created.

[email protected]> select rowid from deptx where rownum=1;
ROWID
------------------
AAAHGVAALAAAACjAAA

[email protected]> @ rowid AAAHGVAALAAAACjAAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA   DBA    TEXT
---------- ---------- ---------- ---------- ----------- ------ ----------------------------------------
     29077         11        163          0  0x2C000A3  11,163 alter system dump datafile 11 block 163

[email protected]> alter system checkpoint ;
System altered.

[email protected]> alter system checkpoint ;
System altered.

2.測試:
BBED> set dba 11,164
        DBA             0x02c000a4 (46137508 11,164)
--//註:bbed for windows 訪問的block要加1,主要問題在於無法識別數據文件的第0塊(OS塊頭)

BBED> p *kdbr
rowdata[66]
-----------
ub1 rowdata[66]                             @8162     0x2c

BBED> p kdbr
sb2 kdbr[0]                                 @142      8038
sb2 kdbr[1]                                 @144      8016
sb2 kdbr[2]                                 @146      7996
sb2 kdbr[3]                                 @148      7972

[email protected]> delete from deptx where deptno=20;
1 row deleted.

[email protected]> commit ;
Commit complete.

[email protected]> alter system checkpoint ;
System altered.

--//通過bbed觀察如下:
BBED> p kdbr dba 11,164
sb2 kdbr[0]                                 @142      8038
sb2 kdbr[1]                                 @144      8016
sb2 kdbr[2]                                 @146      7996
sb2 kdbr[3]                                 @148      7972

BBED> x /rncc *kdbr[0]
rowdata[66]                                 @8162
-----------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x00
[email protected]:    3
col    0[2] @8165: 10
col   1[10] @8168: ACCOUNTING
col    2[8] @8179: NEW YORK

BBED> x /rncc *kdbr[1]
rowdata[44]                                 @8140
-----------
[email protected]: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
[email protected]: 0x02
[email protected]:    0
--//你可以發現flag 從0x2c變成 0x3c,打上了KDRHFD標識表示刪除,恢復實際上就是修改flag=0x2c(也就是取消KDRHFD標識).
--//繼續:

[email protected]> delete from deptx where deptno=30;
1 row deleted.

[email protected]> commit ;
Commit complete.

[email protected]> alter system checkpoint ;
System altered.

BBED> p kdbr dba 11,164
sb2 kdbr[0]                                 @142      8038
sb2 kdbr[1]                                 @144      8016
sb2 kdbr[2]                                 @146      7996
sb2 kdbr[3]                                 @148      7972
--//偏移量還是不變,也就是這樣的情況下以上兩條記錄都可以恢復.

[email protected]> update deptx set dname=upper(dname) where deptno=10;
1 row updated.

[email protected]> commit ;
Commit complete.

[email protected]> alter system checkpoint ;
System altered.

BBED> p kdbr dba 11,164
sb2 kdbr[0]                                 @142      8038
sb2 kdbr[1]                                 @144      8016
sb2 kdbr[2]                                 @146      7996
sb2 kdbr[3]                                 @148      7972
--//我執行update操作,但是行目錄並沒有修改,主要原因在於DML修改的記錄長度沒有變化,oracle並不會改變行目錄的偏移。
--//而是就地修改相關記錄信息。

[email protected]> update deptx set dname=upper(dname)||'0' where deptno=10;
1 row updated.

[email protected]> commit ;
Commit complete.

[email protected]> alter system checkpoint ;
System altered.

BBED> p kdbr dba 11,164
sb2 kdbr[0]                                 @142      7945
sb2 kdbr[1]                                 @144      2
sb2 kdbr[2]                                 @146     -1
sb2 kdbr[3]                                 @148      7972
--//在DML後修改記錄長度發生變化後,oracle在修改kdbr[0]的偏移時,同時也修改kdbr[1],kdbr[2]的信息,
--//這個應該是oracle的一個設計理念,順手把以前沒做的事情做完...
--//你可以從修改的信息可以推斷,如果下次操作是插入,使用那個行目錄時應該從kdbr[1],kdbr[2]選擇。
--//如果你仔細觀察可以發現刪除記錄的行目錄記錄的偏移記錄的信息形成1個鏈表結構,sb2 kdbr[2] = -1 表示鏈表結構的尾部.
--//並且可以通過行目錄偏移 kdbr[N] 是否 >= kdbh.kdbhnrow (當前為4),來確定是否指向正確的記錄信息。

BBED> p kdbh dba 11,164
struct kdbh, 14 bytes                       @124
   ub1 kdbhflag                             @124      0x00 (NONE)
   b1 kdbhntab                              @125      1
   b2 kdbhnrow                              @126      4
=======================================================
   sb2 kdbhfrre                             @128      1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
   sb2 kdbhfsbo                             @130      26
   sb2 kdbhfseo                             @132      7945
   b2 kdbhavsp                              @134      7987
   b2 kdbhtosp                              @136      7987

--//kdbhfrre = 1 ,表示鏈表結構的開頭,也就是如果在塊DML有插入時,會先使用kdbr[1]行目錄.
--//你可以發現這時kdbr[1],kdbr[2]執行的偏移並沒有覆蓋,要恢復一定ok的.

BBED> assign  kdbr[1] = 8016;
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
sb2 kdbr[0]                                 @144      8016

BBED> assign  kdbr[2] = 7996;
sb2 kdbr[0]                                 @146      7996


BBED> x /rncc *kdbr[1]
rowdata[71]                                 @8140
-----------
[email protected]: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
[email protected]: 0x02
[email protected]:    0

BBED> x /rncc *kdbr[2]
rowdata[51]                                 @8120
-----------
[email protected]: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
[email protected]: 0x03
[email protected]:    0

--//修改flag取消KDRHFD標識:
BBED> assign  offset 8140 = 0x2c;
ub1 rowdata[0]                              @8140     0x2c

BBED> assign  offset 8120 = 0x2c;
ub1 rowdata[0]                              @8120     0x2c


BBED> x /2rncc *kdbr[2]
rowdata[51]                                 @8120
-----------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x03
[email protected]:    3

col    0[2] @8123: 30
col    1[5] @8126: SALES
col    2[7] @8132: CHICAGO

rowdata[71]                                 @8140
-----------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x02
[email protected]:    3

col    0[2] @8143: 20
col    1[8] @8146: RESEARCH
col    2[6] @8155: DALLAS
--//現在2條記錄都可以顯見,剩下就是恢復對應數據塊的完整性以及一致性問題.

BBED> sum apply
Check value for File 11, Block 164:
current = 0x9fe2, required = 0x9fe2

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: row locked by non-existent transaction
        table=0   slot=2
        lockid=3   ktbbhitc=3
Block 163 failed with check code 6101

--//lock 偏移8121 =0x0.
BBED> assign offset 8121=0x0;
ub1 rowdata[0]                              @8121     0x00

BBED> sum apply
Check value for File 11, Block 164:
current = 0x9ce2, required = 0x9ce2

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: entries on the free list are not ordered
        next=8016 nrow=4 chas=1
Block 163 failed with check code 6106

BBED> assign kdbh.kdbhfrre=-1
sb2 kdbhfrre                                @128     -1

BBED> sum apply
Check value for File 11, Block 164:
current = 0x631c, required = 0x631c

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: xaction header lock count mismatch
        trans=2 ilk=1 nlo=2
Block 163 failed with check code 6108

--//lock 偏移8141 =0x0.
BBED> assign offset 8141=0x0;
ub1 rowdata[0]                              @8141     0x00

BBED> sum apply
Check value for File 11, Block 164:
current = 0x611c, required = 0x611c

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: the amount of space used is not equal to block size
        used=119 fsc=0 avsp=7987 dtl=8064
Block 163 failed with check code 6110

--//dtl-used-fsc = avsp
--//8064-119-0 = 7945

BBED> assign kdbh.kdbhavsp=7945;
b2 kdbhavsp                                 @134      7945

BBED> sum apply
Check value for File 11, Block 164:
current = 0x6126, required = 0x6126

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: space available on commit is incorrect
        tosp=7987 fsc=0 stb=0 avsp=7945
Block 163 failed with check code 6111

BBED> assign kdbh.kdbhtosp=7945;
b2 kdbhtosp                                 @136      7945

BBED> sum apply
Check value for File 11, Block 164:
current = 0x611c, required = 0x611c

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163
--//OK現在恢復完成.

[email protected]> alter system flush BUFFER_CACHE;
System altered.

[email protected]> select * from deptx;
    DEPTNO DNAME                LOC
---------- -------------------- -------------
        10 ACCOUNTING0          NEW YORK
        20 RESEARCH             DALLAS
        30 SALES                CHICAGO
        40 OPERATIONS           BOSTON
--//刪除記錄已經恢復.
--//原來deptno= 10 的記錄沒有覆蓋,理論將也可以恢復.繼續嘗試看看.

BBED> assign kdbr[0]=8038
sb2 kdbr[0]                                 @142      8038

BBED> x /rncc *kdbr[0]
rowdata[93]                                 @8162
-----------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x00
[email protected]:    3

col    0[2] @8165: 10
col   1[10] @8168: ACCOUNTING
col    2[8] @8179: NEW YORK
--//這樣修改行目錄偏移指向執行原來的位置.

BBED> sum apply
Check value for File 11, Block 164:
current = 0x6173, required = 0x6173

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: xaction header lock count mismatch
        trans=2 ilk=1 nlo=0
Block 163 failed with check code 6108

BBED> assign offset 8163  = 0x02
ub1 rowdata[0]                              @8163     0x02

BBED> sum apply
Check value for File 11, Block 164:
current = 0x6373, required = 0x6373

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163

Block Checking: DBA = 46137507, Block Type = KTB-managed data block
data header at 0x2c4027c
kdbchk: the amount of space used is not equal to block size
        used=118 fsc=0 avsp=7945 dtl=8064
Block 163 failed with check code 6110

--//dtl-used-fsc = avsp
--//8064-118-0 = 7946

BBED> assign kdbh.kdbhavsp=7946;
b2 kdbhavsp                                 @134      7946

BBED> assign kdbh.kdbhtosp=7946;
b2 kdbhtosp                                 @136      7946

BBED> sum apply
Check value for File 11, Block 164:
current = 0x6373, required = 0x6373

BBED> verify
DBVERIFY - Verification starting
FILE = D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF
BLOCK = 163
--//ok,現在恢復到原始建立時的狀態.

[email protected]> alter system flush BUFFER_CACHE;
System altered.

[email protected]> select * from deptx;
    DEPTNO DNAME                LOC
---------- -------------------- -------------
        10 ACCOUNTING           NEW YORK
        20 RESEARCH             DALLAS
        30 SALES                CHICAGO
        40 OPERATIONS           BOSTON

3.總結:
--//很久不使用bbed,有點生疏了。
--//我前面的恢復定位行目錄信息時使用原來顯示的信息,實際的恢復只能通過find檢索0x2c,0x3c字元定位。
--//然後通過執行 x /rncc offset NNNN,確定顯示的信息是否正確。獲得NNNN偏移是絕對偏移,必須減去kdbh的偏移(這裡是124,前面
--//有3個ITL槽),這樣才能確定行目錄的相對偏移值。
--//總之到對應的數據塊操作相對複雜!!!

BBED> p kdbr dba 11,164
sb2 kdbr[0]                                 @142      8038
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sb2 kdbr[1]                                 @144      8016
sb2 kdbr[2]                                 @146      7996
sb2 kdbr[3]                                 @148      7972

BBED> p kdbh dba 11,164
struct kdbh, 14 bytes                       @124
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   ub1 kdbhflag                             @124      0x00 (NONE)
   b1 kdbhntab                              @125      1
   b2 kdbhnrow                              @126      4
   sb2 kdbhfrre                             @128      1
   sb2 kdbhfsbo                             @130      26
   sb2 kdbhfseo                             @132      7945
   b2 kdbhavsp                              @134      7987
   b2 kdbhtosp                              @136      7987


BBED> x /rncc *kdbr[0]
rowdata[66]                                 @8162
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x00
[email protected]:    3
col    0[2] @8165: 10
col   1[10] @8168: ACCOUNTING
col    2[8] @8179: NEW YORK
--// 8162-124 = 8038
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在項目中啟用了Nullable 可為空的類型,這個特性確實很好用,在 WebAPI 的入參上可以直接採用 ? 來標記一個欄位是否允許為空,但是使用過程中遇到瞭如下一個問題,比如創建部門介面 我們定義入參模型如下: public class DtoDepartment { /// <summary ...
  • .NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試 開發環境 VS2022 .NET 6 測試環境 測試工具 介面壓力測試工具:JMeter 資料庫 MySQL 5.7 資料庫和WebApi服務在同一臺伺服器上,JMeter在本人筆記本上。 測試設置 200個線程併發,每個 ...
  • 一、 環境準備 本次配置基於DR負載均衡模式,設置一個VIP(Virtual IP)為19.50.67.173,用戶只需要訪問這個IP地址即可獲得後端服務 其中,負載均衡主機為19.50.67.165(LVS1),備機為 19.50.67.169(LVS2)。Web伺服器A為19.50.67.171 ...
  • forklift Mac版是一款強大的文件管理程式,彌補了Finder文件管理比較單一的功能,強大到能遠程連接Ftp,SFTP,Amazon S3,WebDAV,SMB,NIS,AFP等網路共用服務協議。相對其他文件管理器如Path Finder,forklift mac更加小巧快速。 除此之外Fo ...
  • PowerPoint 無法打開文件 出現的問題 今天下載老師放在學習通的ppt,居然不能打開,記錄一下 點擊修複後出現: 這並不是文件損壞了,而是powerpoint出於安全的考慮,為了保護我們的電腦,不能打開其他電腦的文件。 解決辦法 右鍵選擇屬性,進入常規界面,勾選解除鎖定,點擊引用,點擊確 ...
  • 個人超級電腦是一個新概念,目前這個市場類似上世紀70年的PC革命時代。本篇是回答一位用戶提問,LAXCUS分散式操作系統如何成為一臺“個人超級電腦”。 ...
  • mysql二進位安裝腳本部署 單實例 [[email protected] ~]# mkdir mysql //創建存放腳本目錄 [[email protected] ~]# ls anaconda-ks.cfg mysql [[email protected] ~]# cd mysql/ [[email protected] ...
  • 1.shell命令的執行機制:fork+exec執行命令(任何的shell都會執行) 2.shell中的用戶輸入處理 1 命令行參數:選項、參數 2 運行時輸入 3 read命令: 4 1.基本讀取、 5 2.超時處理-t選項、 6 3.隱藏方式讀取-s選項) 7 4.從文件中讀取 3.shell的 ...
一周排行
    -Advertisement-
    Play Games
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...