本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger 的Oracle技术博客 本文链接地址: 如何利用bbed来修改asm diskgroup中的数据(修复坏块方法类似)? 很多时候,我们面临一个问题,对于asm diskgroup中的数据文件,如果存在坏块,要么
本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客
本文链接地址: 如何利用bbed来修改asm diskgroup中的数据(修复坏块方法类似)?
很多时候,我们面临一个问题,对于asm diskgroup中的数据文件,如果存在坏块,要么通过备份进行恢复要么进行blockrecover,除了这2种方法之外,对于绝大多数人来讲,我想都是没招儿了。其实不然,你还可以利用bbed来进行修复。这里我没有模拟坏块,仅仅是利用bbed来模拟直接修改asm diskgroup中的表数据,方法类似。
++++创建测试表
SQL> create table t0727(a number);
Table created.
SQL> insert into t0727 values(1);
1 row created.
SQL> insert into t0727 values(10);
1 row created.
SQL> insert into t0727 values(100);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) blk# from t0727;
FILE# BLK#
---------- ----------
5 28
5 28
5 28
这里我需要将第3条数据100修改为99.
通过将该block copy到文件系统,然后bbed修改数据,然后再copy到asm diskgroup。
++++copy block to filesystem
SQL> @cp_block_to_fs.sql
Enter value for asm_file_name: +DATA1/test/datafile/roger.260.831967031
old 14: v_AsmFilename := '&ASM_File_Name'; --asm file name
new 14: v_AsmFilename := '+DATA1/test/datafile/roger.260.831967031'; --asm file name
Enter value for block_to_extract: 28
old 15: v_offstart := '&block_to_extract'; --block id
new 15: v_offstart := '28'; --block id
Enter value for number_of_blocks_to_extract: 1
old 16: v_numblks := '&number_of_blocks_to_extract'; --number of blocks to patch
new 16: v_numblks := '1'; --number of blocks to patch
Enter value for filesystem_file_name: /home/oracle/file_528.dbf
old 17: v_FsFilename := '&FileSystem_File_Name';
new 17: v_FsFilename := '/home/oracle/file_528.dbf';
PL/SQL procedure successfully completed.
+++++使用bbed 修改数据
BBED> set file 5 block 1
FILE# 5
BLOCK# 1
BBED> map
File: /home/oracle/file_528.dbf (5)
Block: 1 Dba:0x01400001
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @