使用dbms_repair修复受损数据块

使用dbms_repair修复受损数据块

1、根据在全表扫描中出现的受损数据块的绝对文件号和数据块号的提示确定受损对象:

select segment_name,segment_type,owner,tablespace_name,partition_name

  from dba_extents

  where file_id = &AFN and &BL between block_id and block_id + blocks - 1;

2、使用dbms_repair包创建两个数据表:

   declare

   begin

    dbms_repair.admin_tables(table_name => 'REPAIR_TABLE',

                             table_type => dbms_repair.REPAIR_TABLE,

                             action     => dbms_repair.CREATE_ACTION,

                             tablespace => 'TESTDATA');

   end;

  

   declare

   begin

    dbms_repair.admin_tables(table_type => dbms_repair.ORPHAN_TABLE,

                             action     => dbms_repair.CREATE_ACTION,

                             tablespace => 'TESTDATA');

   end;

3、检查受损对象,并将检查结果存入之前创建的表中:

set serveroutput on;

  declare

    rpr_count int;

  begin

    rpr_count := 0;

    dbms_repair.check_object(schema_name       => 'TEST',

                             object_name       => 'B',

                             repair_table_name => 'REPAIR_TABLE',

                             corrupt_count     => rpr_count);

    dbms_output.put_line('repair count:'||to_char(rpr_count));

  end;

4、查看检查结果:

    select t.object_name,

         t.block_id,

         t.corrupt_type,

         t.marked_corrupt,

         t.corrupt_description,

         t.repair_description

from repair_table t;

5、如果受损数据块还没有被标记为“software corrupt,使用dbms_repair包将受损数据块标记为”software corrupt”

set serveroutput on;

declare

    fix_count int;

  begin

    fix_count := 0;

    dbms_repair.fix_corrupt_blocks(schema_name       => 'TEST',

                                   object_name       => 'B',

                                   object_type       => dbms_repair.TABLE_OBJECT,

                                   repair_table_name => 'REPAIR_TABLE',

                                   fix_count         => fix_count);

    dbms_output.put_line('fix_count:' || to_char(fix_count));

  end;

6、查看有多少索引项指向了坏块:

  select index_name
    from dba_indexes
   where table_name in (select distinct object_name from repair_table);

  

 set serveroutput on;

  declare
    key_count int;
  begin
    key_count :=
0;
    dbms_repair.dump_orphan_keys(schema_name       =>
'TEST',
                                 object_name       =>
'TEST_PK',
                                 object_type       => dbms_repair.INDEX_OBJECT,
                                 repair_table_name =>
'REPAIR_TABLE',
                                 orphan_table_name =>
'ORPHAN_KEY_TABLE',
                                 key_count         => key_count);
    dbms_output.put_line(
'orphan key count:' || to_char(key_count));
  end;

 

select index_name,count(1) from orphan_key_table group by index_name;

7、 使用dbms_repair包将受损数据块设置为skip,或使用10231事件,使在全表扫描中屏蔽ora-1578错误:

  begin
    dbms_repair.skip_corrupt_blocks(schema_name =>
'TEST',
                                    object_name =>
'B',
                                    object_type => dbms_repair.TABLE_OBJECT,
                                    flags       => dbms_repair.SKIP_FLAG);
  end;

 

8、  重建表和索引:

使用CTAS方法重建表,或者使用dbms_repair包重建对象的freelists

 declare
 begin
    dbms_repair.rebuild_freelists(schema_name =>
'TEST',
                                  object_name =>
'B',
                                  object_type => dbms_repair.TABLE_OBJECT);

 end;

使用alter index indexname rebuild online命令重建索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用DBMS_CRYPTO加密NUMBER数据类型的数据后,需要先将加密后的数据转换成HEX格式的,然后再进行存储。那么查询加密后的数据时,需要先将查询条件转换成HEX格式的字符串,然后再与存储的加密数据进行比较。 以下是一个示例,假设我们要加密的数据为数字123,加密算法为AES128: ``` DECLARE v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey'); v_data NUMBER := 123; v_encrypted RAW(2000); v_hex_str VARCHAR2(4000); BEGIN v_encrypted := DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(v_data), DBMS_CRYPTO.TYPE_AES128, v_key ); v_hex_str := RAWTOHEX(v_encrypted); DBMS_OUTPUT.PUT_LINE('Encrypted data: ' || v_hex_str); END; ``` 输出结果为: ``` Encrypted data: 4A8C65F25A9D827C830B9A79E8C9F7C9 ``` 我们将加密后的数据存储到数据库中,然后查询加密后的数据时,需要将查询条件也转换成HEX格式的字符串: ``` DECLARE v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey'); v_data NUMBER := 123; v_encrypted RAW(2000); v_hex_str VARCHAR2(4000); v_decrypted RAW(2000); v_result NUMBER; BEGIN v_encrypted := DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(v_data), DBMS_CRYPTO.TYPE_AES128, v_key ); v_hex_str := RAWTOHEX(v_encrypted); -- 查询加密后的数据 SELECT COUNT(*) INTO v_result FROM my_table WHERE TO_CHAR(TO_NUMBER(RAWTOHEX(my_column)), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') = v_hex_str; DBMS_OUTPUT.PUT_LINE('Result: ' || v_result); END; ``` 这里使用了TO_NUMBER和TO_CHAR函数将HEX格式的字符串转换成NUMBER类型,然后再与加密后的数据进行比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值