找回密码
 立即注册
首页 业界区 业界 特殊恢复:最简单的BBED修改ASM的数据块的方法 ...

特殊恢复:最简单的BBED修改ASM的数据块的方法

垢峒 2025-6-14 10:18:36
我们的文章会在微信公众号Oracle恢复实录和博客网站同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
前天在客户现场遇到ASM中的一个数据块损坏,数据库打开后,在5分钟内,数据库就自动关闭了,由于特殊的原因,当时没有使用bbed来直接修改块,采用了其它的方式来正常打开数据库。这里就展示利用这个功能来演示在ASM环境中如果快速的实现bbed数据块。
1,模拟环境

1.1,创建测试表
  1. www.htz.pw > create table scott.htz tablespace users as select * from dba_objects;
  2. Table created.
复制代码
查询表区的信息
  1. www.htz.pw > @extent.sql
  2. Enter value for owner: scott
  3. Enter value for segment_name: htz
  4. Enter value for tablespace_name:
  5.                       FILE                  BLOCK
  6. OWNER:SEGMENT_NAME      ID   FNO  EXTENT_ID BEGIN_END    BLOCKS SUM_BLOCKS BYTES(KB)  SUM_BYTES
  7. -------------------------- ----- ---------- ------------------- ---------- --------- ----------
  8. SCOTT.HTZ                4     4          0 57~64             8          8        64      65536
  9.                          4     4          1 65~72             8         16        64     131072
  10.                          4     4          2 73~80             8         24        64     196608
  11.                          4     4          3 81~88             8         32        64     262144
  12.                          4     4          4 89~96             8         40        64     327680
  13.                          4     4          5 97~104            8         48        64     393216
  14.                          4     4          6 105~112           8         56        64     458752
  15.                          4     4          7 113~120           8         64        64     524288
  16.                          4     4          8 121~128           8         72        64     589824
  17.                          4     4          9 129~136           8         80        64     655360
  18.                          4     4         10 137~144           8         88        64     720896
  19.                          4     4         11 145~152           8         96        64     786432
  20.                          4     4         12 153~160           8        104        64     851968
  21.                          4     4         13 161~168           8        112        64     917504
  22.                          4     4         14 169~176           8        120        64     983040
  23.                          4     4         15 177~184           8        128        64    1048576
  24.                          4     4         16 265~392         128        256      1024    2097152
  25.                          4     4         17 393~520         128        384      1024    3145728
  26.                          4     4         18 521~648         128        512      1024    4194304
  27.                          4     4         19 649~776         128        640      1024    5242880
  28.                          4     4         20 777~904         128        768      1024    6291456
  29.                          4     4         21 1673~1800       128        896      1024    7340032
  30.                          4     4         22 1801~1928       128       1024      1024    8388608
  31.                          4     4         23 1929~2056       128       1152      1024    9437184
  32.                          4     4         24 2057~2184       128       1280      1024   10485760
  33.                          4     4         25 2185~2312       128       1408      1024   11534336
  34.                          5     5         26 9~136           128        128      1024    1048576
  35.                          5     5         27 137~264         128        256      1024    2097152
  36.                          5     5         28 265~392         128        384      1024    3145728
  37.                          5     5         29 393~520         128        512      1024    4194304
  38.                          5     5         30 521~648         128        640      1024    5242880
  39.                          5     5         31 649~776         128        768      1024    6291456
  40.                          5     5         32 777~904         128        896      1024    7340032
  41.                          5     5         33 905~1032        128       1024      1024    8388608
  42.                          5     5         34 1033~1160       128       1152      1024    9437184
  43.                          4     4         35 2313~2440       128       1536      1024   12582912
  44.                       FILE                  BLOCK
  45. OWNER:SEGMENT_NAME      ID   FNO  EXTENT_ID BEGIN_END    BLOCKS SUM_BLOCKS BYTES(KB)  SUM_BYTES
  46. -------------------------- ----- ---------- ------------------- ---------- --------- ----------
  47. SCOTT.HTZ                4     4         36 2441~2568       128       1664      1024   13631488
  48. *********************                                   -------            ---------
  49. Total:                                                     2816                22528
复制代码
这里通过extent脚本主要是想找到块是位置那个数据文件中的那一个extent,用于后面确认块在asm磁盘中的那个块上。
  1. www.htz.pw > select  rowid,dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid)  block from scott.htz where owner='SCOTT';
  2. ROWID                     FNO      BLOCK
  3. ------------------ ---------- ----------
  4. AAAMpMAAEAAAAC1ABE          4        181
  5. AAAMpMAAEAAAANLAAM          4        843
  6. AAAMpMAAEAAAANLAAN          4        843
  7. AAAMpMAAEAAAANLAAO          4        843
  8. AAAMpMAAEAAAANLAAP          4        843
  9. AAAMpMAAEAAAANLAAQ          4        843
  10. AAAMpMAAEAAAANLAAR          4        843
  11. AAAMpMAAEAAAAcDAAj          4       1795
  12. AAAMpMAAEAAAAiSAAm          4       2194
  13. AAAMpMAAEAAAAiSAAn          4       2194
  14. AAAMpMAAEAAAAiSAAo          4       2194
  15. AAAMpMAAEAAAAiSAAp          4       2194
  16. AAAMpMAAEAAAAiSAAq          4       2194
  17. AAAMpMAAEAAAAiSAAr          4       2194
复制代码
这里我们以843这个块为例来操作。修改AAAMpMAAEAAAANLAAO 这行中的owner值,将SCOTT改修改为HUANG
1.2 确认修改的数据块
  1. www.htz.pw > @rowid_to_info.sql
  2. Enter value for rowid: AAAMpMAAEAAAANLAAO
  3. ROWID_TYPE:  1
  4. OBJECT_NUMBER:  51788
  5. RELATIVE_FNO:  4
  6. BLOCK_NUMBER:  843
  7. ROW_NUMBER:  14
  8. PL/SQL procedure successfully completed.
复制代码
在bbed修改的时候要用到
确认数据文件

查询数据文件的路径
  1. www.htz.pw > /
  2.      FILE# NAME
  3. ---------- -----------------------------------------------
  4.          4 +DATA_E/asm19g/datafile/users.262.853485885
  5.          3 +DATA_E/asm19g/datafile/sysaux.264.853485883
  6.          2 +DATA_E/asm19g/datafile/undotbs1.263.853485885
  7.          1 +DATA_E/asm19g/datafile/system.265.853485883
复制代码
2 修改数据块

2.1 脚本复制数据块到文件系统

使用copy脚本将asm块COPY来文件系统并修改
  1. www.htz.pw > @asm_copy_block_to_file.sql
  2. Enter value for asm_datafile_name: +DATA_E/asm19g/datafile/users.262.853485885
  3. Enter value for block_id_in_datafile: 843
  4. Enter value for number_of_blocks: 1
  5. Enter value for filesystem_filename: /tmp/843.dmp
  6. PL/SQL procedure successfully completed.
复制代码
这里直接实现的asm_copy_block_to_file.sql这个脚本来实现。
下面是通过oracle来dump块,主要是为了验证脚本COPY出来的块是否正确
验证复制的数据块是否正确
  1. www.htz.pw > alter system dump datafile 4 block 843;
  2. System altered.
  3. www.htz.pw > oradebug setmypid
  4. Statement processed.
  5. www.htz.pw > oradebug tracefile_name;
  6. /oracle/app/oracle/admin/asm19g/udump/asm19g_ora_4363.trc
  7. [oracle@www.htz.pw sql]$ls -l /tmp/843.dmp
  8. -rw-r----- 1 oracle dba 16384 Jul 21 10:40 /tmp/843.dmp
  9. Block header dump:  0x0100034b
  10. Object id on Block? Y
  11. seg/obj: 0xca4c  csc: 0x00.61125  itc: 3  flg: E  typ: 1 - DATA
  12.      brn: 0  bdba: 0x100030a ver: 0x01 opc: 0
  13.      inc: 0  exflg: 0
  14. Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
  15. 0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.00061125
  16. 0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
  17. 0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
  18. data_block_dump,data header at 0x116d9a7c
  19. ===============
  20. tsiz: 0x1f80   
  21. hsiz: 0x8a
  22. pbl: 0x116d9a7c
  23. bdba: 0x0100034b
  24.      76543210   
  25. flag=--------   
  26. ntab=1
  27. nrow=60
  28. frre=-1
  29. fsbo=0x8a
  30. fseo=0x4a5
  31. avsp=0x41b
  32. tosp=0x41b
复制代码
2.2 BBED修改数据块

下面使用bbed来修改指定的行的内容
  1. BBED> x /rccn *kdbr[14]
  2. rowdata[5498]                               @6811   
  3. -------------
  4. flag@6811: 0x2c (KDRHFL, KDRHFF, KDRHFH)
  5. lock@6812: 0x00
  6. cols@6813:   13
  7. col    0[5] @6814: SCOTT
  8. col    1[3] @6820: EMP
  9. col    2[0] @6824: *NULL*
  10. col    3[4] @6825: 51575
  11. col    4[4] @6830: 51575
  12. BBED> set offset 6815这里是6814加上长度就可以了
  13.         OFFSET          6815
  14. BBED> set count 10
  15.         COUNT           10
  16. BBED> dump
  17. File: /tmp/843.dmp (0)
  18. Block: 1                Offsets: 6815 to 6824           Dba:0x00000000
  19. ------------------------------------------------------------------------
  20. 53434f54 5403454d 50ff
  21. <32 bytes per line>
  22. BBED> modify /x 4855414e(select dump('HUANG',16) from dual;可以得到值)
  23. Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
  24. File: /tmp/843.dmp (0)
  25. Block: 1                Offsets: 6815 to 6824           Dba:0x00000000
  26. ------------------------------------------------------------------------
  27. 4855414e 5403454d 50ff
  28. <32 bytes per line>
  29. BBED> set offset +4
  30.         OFFSET          6819
  31. BBED> modify /x 47
  32. File: /tmp/843.dmp (0)
  33. Block: 1                Offsets: 6819 to 6828           Dba:0x00000000
  34. ------------------------------------------------------------------------
  35. 4703454d 50ff04c3 0610
  36. <32 bytes per line>
  37. BBED> dump offset 6815
  38. File: /tmp/843.dmp (0)
  39. Block: 1                Offsets: 6815 to 6824           Dba:0x00000000
  40. ------------------------------------------------------------------------
  41. 4855414e 4703454d 50ff
  42. <32 bytes per line>
  43. BBED> dump /v
  44. File: /tmp/843.dmp (0)
  45. Block: 1       Offsets: 6815 to 6824  Dba:0x00000000
  46. -------------------------------------------------------
  47. 4855414e 4703454d 50ff              l HUANG.EMP.
  48. <16 bytes per line>
  49. BBED> x /rccn *kdbr[14]
  50. rowdata[5498]                               @6811   
  51. -------------
  52. flag@6811: 0x2c (KDRHFL, KDRHFF, KDRHFH)
  53. lock@6812: 0x00
  54. cols@6813:   13
  55. col    0[5] @6814: HUANG
  56. col    1[3] @6820: EMP
  57. col    2[0] @6824: *NULL*
  58. col    3[4] @6825: 51575
  59. col    4[4] @6830: 51575
  60. BBED> sum apply
  61. Check value for File 0, Block 1:
  62. current = 0x076e, required = 0x076e
  63. BBED> verify
  64. DBVERIFY - Verification starting
  65. FILE = /tmp/843.dmp
  66. BLOCK = 1
  67. Block 1 is corrupt
  68. Corrupt block relative dba: 0x01000001 (file 0, block 1)
  69. Bad header found during verification
  70. Data in bad block:
  71. type: 6 format: 2 rdba: 0x0100034b
  72. last change scn: 0x0000.0006116f seq: 0x2 flg: 0x04
  73. spare1: 0x0 spare2: 0x0 spare3: 0x0
  74. consistency value in tail: 0x116f0602
  75. check value in block header: 0x76e
  76. computed block checksum: 0x0
复制代码
这里看到verify报错是因为rdba地址与计算的地址不一致导致的,如果是坏块,这里建议先修改rdba地址为01000001后,再修改verify,用于验证其它地方是否有报错,无报错手,再将rdba地址修改回来。
  1. DBVERIFY - Verification complete
  2. Total Blocks Examined         : 1
  3. Total Blocks Processed (Data) : 0
  4. Total Blocks Failing   (Data) : 0
  5. Total Blocks Processed (Index): 0
  6. Total Blocks Failing   (Index): 0
  7. Total Blocks Empty            : 0
  8. Total Blocks Marked Corrupt   : 1
  9. Total Blocks Influx           : 0
复制代码
2.3 利用脚本将修改的数据块复制到ASM

使用asm_copy_block_to_asm.sql将修改的块copy到数据文件中
这里在copy之前建议将数据文件offline,防止修改数据块。
  1. www.htz.pw > @asm_copy_block_to_asm.sql
  2. Enter value for filesystem_filename: /tmp/843.dmp
  3. Enter value for asm_datafile_name: +DATA_E/asm19g/datafile/users.262.853485885
  4. Enter value for block_id_in_datafile: 843
  5. PL/SQL procedure successfully completed.
  6. www.htz.pw >  select  rowid,dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid)  block from scott.htz where owner='HUANG';
  7. ROWID                     FNO      BLOCK
  8. ------------------ ---------- ----------
  9. AAAMpMAAEAAAANLAAO          4        843
复制代码
这里看到已经从SCOTT修改到HUANG了
2.4 采用dd实现复制

使用dd将数据块COPY来文件系统,我们需要构建一个OS块,关于OS块的构建,方法很简单,可以直接从其它的地方DD一个块过来就可以了,这里我实现使用之前的那个OS块
下面测试是将HUANG更改为ZHONG
查找843这个块数据文件
  1. www.htz.pw > @asm_block_by_datafile_block.sql                       
  2. Enter value for block: 843                                          
  3. Enter value for file_number: 262                                    
  4. Enter value for file_type: datafile                                 
  5. Enter value for filename:                                          
  6.                                                                     
  7. DATAFILE                       DISK_NUMBER                          
  8. NUMBER_NAME                    DISK_NMAE                 DISK_BLOCK
  9. ------------------------------ ------------------------- ----------
  10. 262.USERS.262.853485885        3.VOL5                         29515
复制代码
此脚本只适用10G数据库,不适用11G的环境
这里可以看到843这个块位于DISK VOL5的29515这个块
下面将磁盘中的块dd出来跟之前ASM复制出来的块进行对比
  1. [oracle@www.htz.pw sql]$./asm_find_asmlib_disk_by_kfed.sh
  2. ASMLIB disk name: /dev/oracleasm/disks/VOL1
  3. ASM disk name:
  4. Device path: /dev/sdc1
  5. ASMLIB disk name: /dev/oracleasm/disks/VOL2
  6. ASM disk name:
  7. Device path: /dev/sdc2
  8. ASMLIB disk name: /dev/oracleasm/disks/VOL3
  9. ASM disk name:
  10. Device path: /dev/sdc3
  11. ASMLIB disk name: /dev/oracleasm/disks/VOL5
  12. ASM disk name:
  13. Device path: /dev/sdc5
  14. ASMLIB disk name: /dev/oracleasm/disks/VOL6
  15. ASM disk name:
  16. Device path: /dev/sdc6
  17. ASMLIB disk name: /dev/oracleasm/disks/VOL7
  18. ASM disk name:
  19. Device path: /dev/sdc7
  20. ASMLIB disk name: /dev/oracleasm/disks/VOL8
  21. ASM disk name:
  22. Device path: /dev/sdc8
  23. ASMLIB disk name: /dev/oracleasm/disks/VOL9
  24. ASM disk name:
  25. Device path: /dev/sdc9
  26. [root@www.htz.pw ~]#dd if=/dev/sdc5 bs=8192 skip=29515 count=1 |od -x|more
  27. 1+0 records in
  28. 1+0 records out
  29. 8192 bytes (8.2 kB) copied, 0.034031 seconds, 241 kB/s
  30. 0000000 a206 0000 034b 0100 116f 0006 0000 0402
  31. 0000020 076e 0000 0001 0000 ca4c 0000 1125 0006
  32. 0000040 0000 0000 0003 0032 030a 0100 ffff 0000
  33. 0000060 0000 0000 0000 0000 0000 0000 8000 0000
  34. 0000100 1125 0006 0000 0000 0000 0000 0000 0000
  35. 0000120 0000 0000 0000 0000 0000 0000 0000 0000
  36. *
  37. 0000160 0000 0000 0000 0000 0000 0000 0100 003c
  38. 0000200 ffff 008a 04a5 041b 041b 0000 003c 1f1c
  39. 0000220 1ebf 1e59 1dfb 1d93 1d32 1cdd 1c7d 1c1e
  40. 0000240 1bbe 1b64 1b0e 1abc 1a6d 1a1f 19ce 197e
  41. 0000260 192b 18ad 1832 17ba 173b 16c1 164d 15ca
  42. 0000300 1549 14c0 143c 13b7 1340 12c8 124c 11d2
  43. 0000320 1158 10d6 104c 0fc9 0f53 0ed0 0e48 0dc1
  44. 0000340 0d49 0cce 0c59 0bde 0b66 0aec 0a6f 09f9
  45. 0000360 0980 090e 0899 081f 07a0 0726 06a9 0627
  46. 0000400 05a2 0525 04a5 0000 0000 0000 0000 0000
  47. 0000420 0000 0000 0000 0000 0000 0000 0000 0000
  48. [root@www.htz.pw ~]#od -x /tmp/843.dmp |more
  49. 0000000 a200 0000 0000 ffc0 0000 0000 0000 0000
  50. 0000020 fa67 0000 2000 0000 0001 0000 7c7d 7a7b
  51. 0000040 81a0 0000 0000 0000 0000 0000 0000 0000
  52. 0000060 0000 0000 0000 0000 0000 0000 0000 0000
  53. *
  54. 0020000 a206 0000 034b 0100 116f 0006 0000 0402
  55. 0020020 076e 0000 0001 0000 ca4c 0000 1125 0006
  56. 0020040 0000 0000 0003 0032 030a 0100 ffff 0000
  57. 0020060 0000 0000 0000 0000 0000 0000 8000 0000
  58. 0020100 1125 0006 0000 0000 0000 0000 0000 0000
  59. 0020120 0000 0000 0000 0000 0000 0000 0000 0000
  60. *
  61. 0020160 0000 0000 0000 0000 0000 0000 0100 003c
  62. 0020200 ffff 008a 04a5 041b 041b 0000 003c 1f1c
  63. 0020220 1ebf 1e59 1dfb 1d93 1d32 1cdd 1c7d 1c1e
  64. 0020240 1bbe 1b64 1b0e 1abc 1a6d 1a1f 19ce 197e
  65. 0020260 192b 18ad 1832 17ba 173b 16c1 164d 15ca
  66. 0020300 1549 14c0 143c 13b7 1340 12c8 124c 11d2
  67. 0020320 1158 10d6 104c 0fc9 0f53 0ed0 0e48 0dc1
  68. 0020340 0d49 0cce 0c59 0bde 0b66 0aec 0a6f 09f9
  69. 0020360 0980 090e 0899 081f 07a0 0726 06a9 0627
  70. 0020400 05a2 0525 04a5 0000 0000 0000 0000 0000
  71. 0020420 0000 0000 0000 0000 0000 0000 0000 0000
复制代码
这里我们只需要对比dba地址就可以了。
  1. [root@www.htz.pw ~]#dd if=/dev/sdc5 of=/tmp/843.dmp skip=29515 bs=8192 count=1 seek=1
  2. 1+0 records in
  3. 1+0 records out
  4. 8192 bytes (8.2 kB) copied, 4.1e-05 seconds, 200 MB/s
复制代码
2.5  bbed修改数据块
  1. rowdata[5498]                               @6811    -------------flag@6811: 0x2c (KDRHFL, KDRHFF, KDRHFH)lock@6812: 0x00cols@6813:   13col    0[5] @6814: HUANGcol    1[3] @6820: EMPcol    2[0] @6824: *NULL*col    3[4] @6825: .Lcol    4[4] @6830: .Lcol    5[5] @6835: TABLEcol    6[7] @6841: xn...+.col    7[7] @6849: xn...+.col   8[19] @6857: 2010-04-20:08:42:07col    9[5] @6877: VALIDcol   10[1] @6883: Ncol   11[1] @6885: Ncol   12[1] @6887: NBBED> set mode edit        MODE            EditBBED> modify /x 5a484f4eWarning: contents of previous BIFILE will be lost. Proceed? (Y/N)  BBED-00311: unable to edit without a BIFILEBBED> set count 10BBED> modify /x 5a484f4eWarning: contents of previous BIFILE will be lost. Proceed? (Y/N) y File: /tmp/843.dmp (0) Block: 1                Offsets: 6815 to 7326           Dba:0x00000000------------------------------------------------------------------------ 5a484f4e 4703454d 50ff04c3 06104c04 c306104c 05544142 4c450778 6e041409 BBED> set offset +4        OFFSET          6819BBED> set count 10        COUNT           10BBED> modify /x 47 File: /tmp/843.dmp (0) Block: 1                Offsets: 6819 to 6828           Dba:0x00000000------------------------------------------------------------------------ 4703454d 50ff04c3 0610  BBED> BBED> sum applyCheck value for File 0, Block 1:current = 0x1b73, required = 0x1b73BBED> verifyDBVERIFY - Verification startingFILE = /tmp/843.dmpBLOCK = 1Block 1 is corruptCorrupt block relative dba: 0x01000001 (file 0, block 1)Bad header found during verificationData in bad block: type: 6 format: 2 rdba: 0x0100034b last change scn: 0x0000.0006116f seq: 0x2 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x116f0602 check value in block header: 0x1b73 computed block checksum: 0x0DBVERIFY - Verification complete
  2. Total Blocks Examined         : 1
  3. Total Blocks Processed (Data) : 0
  4. Total Blocks Failing   (Data) : 0
  5. Total Blocks Processed (Index): 0
  6. Total Blocks Failing   (Index): 0
  7. Total Blocks Empty            : 0
  8. Total Blocks Marked Corrupt   : 1
  9. Total Blocks Influx           : 0
复制代码
2.5 DD复制文件到ASM磁盘
  1. [root@www.htz.pw ~]#dd if=/tmp/843.dmp of=/dev/sdc5 skip=1 bs=8192 count=1 seek=29515 conv=notrunc
  2. 1+0 records in
  3. 1+0 records out
  4. 8192 bytes (8.2 kB) copied, 6.2e-05 seconds, 132 MB/s
复制代码
这里千万要记住,conv=notrunc,不然后面的数据就被切断了,丢失了。
已经看到数据了
  1. www.htz.pw > select  rowid,dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid)  block from scott.htz where owner='ZHONG';
  2. ROWID                     FNO      BLOCK
  3. ------------------ ---------- ----------
  4. AAAMpMAAEAAAANLAAO          4        843
复制代码
这里已经看到数据已经从HUANG更改到ZHONG了。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册