oracle如何恢復被誤誤刪除的pdb

最近太忙,一直沒時間寫blog;加上前段時間blog空間除了點問題,因此整體遷移到阿里雲並且重新備案了。後續有時間我會定期更新,保持寫作習慣,不能把技術荒廢了。

這是去年底某客戶的一個case,誤刪除了6個pdb且帶了including datafiles參數;這是一個非常複雜的恢復;據說用戶開始找了國內很多恢復專家都沒恢復成功;最終經過幾天的努力,我們最終恢復了全部數據;針對這樣的case;據我瞭解目前國內只有我們可以做這個恢復。

針對此Case我們最開始預想了幾種方案:

1) 使用Oracle AMDU

通常當ASM磁盤組無法mount的時候常常會想到使用AMDU去抽取數據文件,那麼此次故障是否可以使用amdu呢?,這顯然是不能的。

   amdu抽取asm文件的原理是通過asm文件號找到該文件對應的FILEDIR(asm 1號文件)的kfffde[0-59]找到file extent信息,如果extent個數大於60還需要藉助kfffde[60+]指向的INDIRECT的kffixe來獲取asm file每個extent所在的disk#,au#,從而完成抽取的。如果asm 1號文件FILEDIR損壞或者清空的情況下,amdu是無法完成文件抽取的。而drop datafile操作正好會清理掉FILEDIR的kfffde[0-59]和kfffde[60+]指向的INDIRECT的kffixe。

 

2)使用老熊的ODU軟件

odu在asm 1號文件FILEDIR損壞或者清空的情況下,通過配置asmdisk.txt,可以掃描該配置文件中所有的磁盤,會產生很多.odu文件,其中一個非常重要的文件是asm_fileext_meta.odu該文件以最小au也就是1M爲1行記錄,記錄磁盤每個au所在的asmdisk#,au#,au_block#,第一個塊的rdba、rfile#和block#,數據塊大小等信息,相當於通過掃描磁盤建立數據文件的fileext,唯一不同的是FILEDIR記錄的是asm文件號,這裏記錄的是相對文件號,隨後即可通過extract命令根據rfile#來按照rdba的是順序來抽取數據文件。但是此案例是刪除了多個pdb,單純的使用odu也無法實現;原因是pdb之間會存在相同rdba的情況,也就是說rfile#是一樣的。在rdba相同的情況下此時odu根本不知道數據塊是屬於哪個pdb哪個數據文件的(除了數據文件頭所在的第一個au,因爲有且只有數據文件頭中存在絕對文件號),從而就無法做出正確的抽取。

換句話講;要找到其中的關係,就是本次恢復的關鍵所在。

那麼如何尋找呢?這裏我們需要通過去分析ACD(Active Change Directory)和COD(Continuing Operation Directory)元數據信息;尋找其中關鍵信息。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

indirect:kfracdb2.lge[0].bcd[0].kfbl.blk:    323 ; 0x020: blk=323

kfracdb2.lge[0].bcd[0].kfbl.obj:      1 ; 0x024: file=1

kfracdb2.lge[0].bcd[0].kfcn.base:4325033 ; 0x028: 0x0041fea9

kfracdb2.lge[0].bcd[0].kfcn.wrap:     0 ; 0x02c: 0x00000000

kfracdb2.lge[0].bcd[0].oplen:        12 ; 0x030: 0x000c

kfracdb2.lge[0].bcd[0].blkIndex:    323 ; 0x032: 0x0143

kfracdb2.lge[0].bcd[0].flags:        28 ; 0x034: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[0].bcd[0].opcode:      133 ; 0x036: 0x0085

kfracdb2.lge[0].bcd[0].kfbtyp:        4 ; 0x038: KFBTYP_FILEDIR

kfracdb2.lge[0].bcd[0].redund:       17 ; 0x039: SCHE=0x1 NUMB=0x1

kfracdb2.lge[0].bcd[0].pad:       63903 ; 0x03a: 0xf99f

kfracdb2.lge[0].bcd[0].KFFFD_EXT.xtntcnt:7263 ; 0x03c: 0x00001c5f

kfracdb2.lge[0].bcd[0].KFFFD_EXT.xtntblk:61 ; 0x040: 0x003d

kfracdb2.lge[0].bcd[0].KFFFD_EXT.xnum:0 ; 0x042: 0x0000

kfracdb2.lge[0].bcd[0].KFFFD_EXT.xcnt:0 ; 0x044: 0x0000

kfracdb2.lge[0].bcd[0].KFFFD_EXT.setflg:0 ; 0x046: 0x00

kfracdb2.lge[0].bcd[0].KFFFD_EXT.flags:0 ; 0x047: O=0 S=0 S=0 D=0 C=0 I=0 R=0 A=0

kfracdb2.lge[0].bcd[0].au[0]:        10 ; 0x048: 0x0000000a

kfracdb2.lge[0].bcd[0].disks[0]:      0 ; 0x04c: 0x0000

kfracdb2.lge[0].bcd[1].kfbl.blk:2147483663 ; 0x050: blk=15 (indirect)

kfracdb2.lge[0].bcd[1].kfbl.obj:    323 ; 0x054: file=323

kfracdb2.lge[0].bcd[1].kfcn.base:4325033 ; 0x058: 0x0041fea9

kfracdb2.lge[0].bcd[1].kfcn.wrap:     0 ; 0x05c: 0x00000000

kfracdb2.lge[0].bcd[1].oplen:        16 ; 0x060: 0x0010

kfracdb2.lge[0].bcd[1].blkIndex:     15 ; 0x062: 0x000f

kfracdb2.lge[0].bcd[1].flags:        28 ; 0x064: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[0].bcd[1].opcode:      161 ; 0x066: 0x00a1

kfracdb2.lge[0].bcd[1].kfbtyp:       12 ; 0x068: KFBTYP_INDIRECT

kfracdb2.lge[0].bcd[1].redund:       17 ; 0x069: SCHE=0x1 NUMB=0x1

kfracdb2.lge[0].bcd[1].pad:       63903 ; 0x06a: 0xf99f

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xtntblk:3 ; 0x06c: 0x0003

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xnum:3 ; 0x06e: 0x0003

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xcnt:1 ; 0x070: 0x0001

kfracdb2.lge[0].bcd[1].KFFIX_EXT.ub2spare:0 ; 0x072: 0x0000

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xptr[0].au:4294967295 ; 0x074: 0xffffffff

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xptr[0].disk:65535 ; 0x078: 0xffff

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xptr[0].flags:0 ; 0x07a: L=0 E=0 D=0 S=0

kfracdb2.lge[0].bcd[1].KFFIX_EXT.xptr[0].chk:42 ; 0x07b: 0x2a

kfracdb2.lge[0].bcd[1].au[0]:     28230 ; 0x07c: 0x00006e46

kfracdb2.lge[0].bcd[1].disks[0]:      7 ; 0x080: 0x0007

 

LGE爲ACD redo log record,BCD爲ACD block change descriptor。改動向量0和1組成的重做記錄0,這點和redo基本一樣。

以上描述了asm file 323的FILEDIR kfffde[60](kfffde從0開始計算)所指向的INDIRECT(disk#爲28230 au#爲7)的kffixe[3]被清空。

即asm file號爲323的extent號爲7263的file extent map被清理。

備註::對於indirect,extent#=KFFIX_EXT.xnum+60+indirect block#*480=3+60+15*480=7263,一個indirect block包含480個extent信息

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

direct:kfracdb2.lge[12].valid:               1 ; 0x3c4: V=1 B=0 M=0

kfracdb2.lge[12].chgCount:            1 ; 0x3c5: 0x01

kfracdb2.lge[12].len:                68 ; 0x3c6: 0x0044

kfracdb2.lge[12].kfcn.base:     4363270 ; 0x3c8: 0x00429406

kfracdb2.lge[12].kfcn.wrap:           0 ; 0x3cc: 0x00000000

kfracdb2.lge[12].bcd[0].kfbl.blk:   321 ; 0x3d0: blk=321

kfracdb2.lge[12].bcd[0].kfbl.obj:     1 ; 0x3d4: file=1

kfracdb2.lge[12].bcd[0].kfcn.base:4363269 ; 0x3d8: 0x00429405

kfracdb2.lge[12].bcd[0].kfcn.wrap:    0 ; 0x3dc: 0x00000000

kfracdb2.lge[12].bcd[0].oplen:       20 ; 0x3e0: 0x0014

kfracdb2.lge[12].bcd[0].blkIndex:   321 ; 0x3e2: 0x0141

kfracdb2.lge[12].bcd[0].flags:       28 ; 0x3e4: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[12].bcd[0].opcode:     133 ; 0x3e6: 0x0085

kfracdb2.lge[12].bcd[0].kfbtyp:       4 ; 0x3e8: KFBTYP_FILEDIR

kfracdb2.lge[12].bcd[0].redund:      17 ; 0x3e9: SCHE=0x1 NUMB=0x1

kfracdb2.lge[12].bcd[0].pad:      63903 ; 0x3ea: 0xf99f

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xtntcnt:48 ; 0x3ec: 0x00000030

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xtntblk:48 ; 0x3f0: 0x0030

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xnum:48 ; 0x3f2: 0x0030

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xcnt:1 ; 0x3f4: 0x0001

kfracdb2.lge[12].bcd[0].KFFFD_EXT.setflg:0 ; 0x3f6: 0x00

kfracdb2.lge[12].bcd[0].KFFFD_EXT.flags:0 ; 0x3f7: O=0 S=0 S=0 D=0 C=0 I=0 R=0 A=0

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xptr[0].au:4294967295 ; 0x3f8: 0xffffffff

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xptr[0].disk:65535 ; 0x3fc: 0xffff

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xptr[0].flags:0 ; 0x3fe: L=0 E=0 D=0 S=0

kfracdb2.lge[12].bcd[0].KFFFD_EXT.xptr[0].chk:42 ; 0x3ff: 0x2a

kfracdb2.lge[12].bcd[0].au[0]:       10 ; 0x400: 0x0000000a

kfracdb2.lge[12].bcd[0].disks[0]:     0 ; 0x404: 0x0000

 

以上描述了asm file 321的FILEDIR的kfffde[48] extent信息被清空。

即asm文件號爲321的extent號爲48的file extent map被清理。

備註:對於direct extent#=KFFFD_EXT.xnum=48。

但是始終沒有看到drop之前的file extent map記錄。由於drop datafile已經完成,所以COD也清空了更改之前的信息。 那麼如何找到之前的記錄呢?這將是本次恢復的核心技術點所在。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            8 ; 0x002: KFBTYP_CHNGDIR

kfbh.datfmt:                          2 ; 0x003: 0x02

kfbh.block.blk:                    1777 ; 0x004: blk=1777

kfbh.block.obj:                       3 ; 0x008: file=3

kfbh.check:                   918117267 ; 0x00c: 0x36b95b93

kfbh.fcn.base:                  4365702 ; 0x010: 0x00429d86

kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000

kfbh.spare1:                          0 ; 0x018: 0x00000000

kfbh.spare2:                          0 ; 0x01c: 0x00000000

kfracdb2.aba.seq:                    18 ; 0x000: 0x00000012

kfracdb2.aba.blk:                  1776 ; 0x004: 0x000006f0

kfracdb2.ents:                       23 ; 0x008: 0x0017

kfracdb2.ub2spare:                    0 ; 0x00a: 0x0000

kfracdb2.instNum:                     1 ; 0x00c: 0x00000001

kfracdb2.timestamp:          1004905358 ; 0x010: 2019-4-6 20:22:38

kfracdb2.lge[0].valid:                1 ; 0x014: V=1 B=0 M=0

kfracdb2.lge[0].chgCount:             3 ; 0x015: 0x03

kfracdb2.lge[0].len:                172 ; 0x016: 0x00ac

kfracdb2.lge[0].kfcn.base:      4365703 ; 0x018: 0x00429d87

kfracdb2.lge[0].kfcn.wrap:            0 ; 0x01c: 0x00000000

kfracdb2.lge[0].bcd[0].kfbl.blk:     58 ; 0x020: blk=58

kfracdb2.lge[0].bcd[0].kfbl.obj:2147483656 ; 0x024: disk=8

kfracdb2.lge[0].bcd[0].kfcn.base:4365702 ; 0x028: 0x00429d86

kfracdb2.lge[0].bcd[0].kfcn.wrap:     0 ; 0x02c: 0x00000000

kfracdb2.lge[0].bcd[0].oplen:        24 ; 0x030: 0x0018

kfracdb2.lge[0].bcd[0].blkIndex:     58 ; 0x032: 0x003a

kfracdb2.lge[0].bcd[0].flags:        28 ; 0x034: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[0].bcd[0].opcode:       66 ; 0x036: 0x0042

kfracdb2.lge[0].bcd[0].kfbtyp:        3 ; 0x038: KFBTYP_ALLOCTBL

kfracdb2.lge[0].bcd[0].redund:       18 ; 0x039: SCHE=0x1 NUMB=0x2

kfracdb2.lge[0].bcd[0].pad:       63903 ; 0x03a: 0xf99f

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.curidx:2888 ; 0x03c: 0x0b48

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.nxtidx:8 ; 0x03e: 0x0008

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.prvidx:8 ; 0x040: 0x0008

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.asz:0 ; 0x042: KFDASZ_1X

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.frag:0 ; 0x043: 0x00

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.total:0 ; 0x044: 0x0000

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.free:0 ; 0x046: 0x0000

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.fnum:4294967295 ; 0x048: 0xffffffff

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.xnum:4294967295 ; 0x04c: 0xffffffff

kfracdb2.lge[0].bcd[0].KFDAT_DEALLOC.flags:0 ; 0x050: 0x00000000

kfracdb2.lge[0].bcd[0].au[0]:         0 ; 0x054: 0x00000000

kfracdb2.lge[0].bcd[0].au[1]:        11 ; 0x058: 0x0000000b

kfracdb2.lge[0].bcd[0].disks[0]:      8 ; 0x05c: 0x0008

kfracdb2.lge[0].bcd[0].disks[1]:      8 ; 0x05e: 0x0008

kfracdb2.lge[0].bcd[1].kfbl.blk:2147483659 ; 0x060: blk=11 (indirect)

kfracdb2.lge[0].bcd[1].kfbl.obj:    320 ; 0x064: file=320

kfracdb2.lge[0].bcd[1].kfcn.base:4365702 ; 0x068: 0x00429d86

kfracdb2.lge[0].bcd[1].kfcn.wrap:     0 ; 0x06c: 0x00000000

kfracdb2.lge[0].bcd[1].oplen:        16 ; 0x070: 0x0010

kfracdb2.lge[0].bcd[1].blkIndex:     11 ; 0x072: 0x000b

kfracdb2.lge[0].bcd[1].flags:        28 ; 0x074: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[0].bcd[1].opcode:      163 ; 0x076: 0x00a3

kfracdb2.lge[0].bcd[1].kfbtyp:       12 ; 0x078: KFBTYP_INDIRECT

kfracdb2.lge[0].bcd[1].redund:       17 ; 0x079: SCHE=0x1 NUMB=0x1

kfracdb2.lge[0].bcd[1].pad:       63903 ; 0x07a: 0xf99f

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xtntblk:0 ; 0x07c: 0x0000

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xnum:313 ; 0x07e: 0x0139

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xcnt:1 ; 0x080: 0x0001

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.ub2spare:0 ; 0x082: 0x0000

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xptr[0].au:4294967292 ; 0x084: 0xfffffffc

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xptr[0].disk:8 ; 0x088: 0x0008

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xptr[0].flags:0 ; 0x08a: L=0 E=0 D=0 S=0

kfracdb2.lge[0].bcd[1].KFFIX_PEXT.xptr[0].chk:33 ; 0x08b: 0x21

kfracdb2.lge[0].bcd[1].au[0]:      8360 ; 0x08c: 0x000020a8

kfracdb2.lge[0].bcd[1].disks[0]:      0 ; 0x090: 0x0000

kfracdb2.lge[0].bcd[2].kfbl.blk:      2 ; 0x094: blk=2

kfracdb2.lge[0].bcd[2].kfbl.obj:      4 ; 0x098: file=4

kfracdb2.lge[0].bcd[2].kfcn.base:4365702 ; 0x09c: 0x00429d86

kfracdb2.lge[0].bcd[2].kfcn.wrap:     0 ; 0x0a0: 0x00000000

kfracdb2.lge[0].bcd[2].oplen:         8 ; 0x0a4: 0x0008

kfracdb2.lge[0].bcd[2].blkIndex:      2 ; 0x0a6: 0x0002

kfracdb2.lge[0].bcd[2].flags:        28 ; 0x0a8: F=0 N=0 F=1 L=1 V=1 A=0 C=0

kfracdb2.lge[0].bcd[2].opcode:      211 ; 0x0aa: 0x00d3

kfracdb2.lge[0].bcd[2].kfbtyp:       16 ; 0x0ac: KFBTYP_COD_DATA

kfracdb2.lge[0].bcd[2].redund:       17 ; 0x0ad: SCHE=0x1 NUMB=0x1

kfracdb2.lge[0].bcd[2].pad:       63903 ; 0x0ae: 0xf99f

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.offset:60 ; 0x0b0: 0x003c

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.length:4 ; 0x0b2: 0x0004

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.data[0]:45 ; 0x0b4: 0x2d

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.data[1]:0 ; 0x0b5: 0x00

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.data[2]:0 ; 0x0b6: 0x00

kfracdb2.lge[0].bcd[2].KFRCOD_DATA.data[3]:128 ; 0x0b7: 0x80

kfracdb2.lge[0].bcd[2].au[0]:         6 ; 0x0b8: 0x00000006

kfracdb2.lge[0].bcd[2].disks[0]:      1 ; 0x0bc: 0x0001


最終答案是什麼呢?由此通過amdu抽取出asm 3號文件ACD,遍歷ACD元數據塊篩選出drop pdb的時間戳AT條目的所有變更記錄,則可以完全的恢復被drop掉的asm file的extent map。然後重新構造asm_fileext_meta.odu文件並結合odu最終完美的恢復了被誤刪除的6個pdb。

 

不得不都說ODU非常的強大。這種方法我們驗證可以恢復12c以及以後版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章