oracle檢查資料庫是否有壞塊的命令

煙花丶易冷發表於2016-03-30
oracle檢查資料庫是否有壞塊的命令

dbv是檢查物理上是否有壞塊的命令

#su - oracle
#dbv file=/oracleruanko/app/oracle/oracle/product/10.2.0/ruanko/dbs/ruankotest blocksize=8192

DBVERIFY: Release 10.2.0.1.0 - Production on Fri May 28 09:56:37 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - Verification starting : FILE = /oracleruanko/app/oracle/oracle/product/10.2.0/ruanko/dbs/ruankotest


DBVERIFY - Verification complete

Total Pages Examined         : 2560
Total Pages Processed (Data) : 356
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 255
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 112
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 1837
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 140907784 (0.140907784)

2:analyze 是檢查邏輯上是否有壞塊的,還可以對錶進行統計分析最佳化,

SQL>analyze table ruankosystem.RSYS_ACC_ACCOUNT
  2  validate structure cascade;

Table analyzed.

SQL>analyze index ruankosystem.PK_RSYS_ACC_ACCOUNT
  2  validate structure;

Index analyzed.


3:db_block_checking是邏輯上的,是初始化引數:
是實時的控制和掃描每一個塊,對效能有一點點的影響
可以透過alter session 或alter system deferred 命令對神經過敏進行設定

4:db_block_checksum是物理上的檢查,也是初始化的引數對io來進入實時的

5:dblock media recovery是邏輯和物理上都可以
這個是用RMAN做的如:
rman> blockrecover batafile 6 block3:

-查一下 V$database_bloce_corruption有多少個壞塊

rman > blockrecover corruption list
    >restore until time 'sysdate-10';

-查一下v$dackup_corruption檢視顯示資料庫檔案備份中的損壞塊清單
-v$copy_corruption 檢視檔案副本中的壞塊清單


6:exp/expdb匯出的時候就會進行掃描,是物理上的檢查和恢復
7:flashback是邏輯上的

8:dbms_repalr是邏輯上的專是做恢復用的包
有的功能是
-CHECK_OBJECT
-FIX_CORRUPT_BLOCKS
-DUMP_ORPHAN_KEYS
-REBUILD_FREELISTS
-SEGMENT_FIX_STATUS
-SKIP_CORRUPT_BLOCKS
-ADMIN_TABLES



如:先檢查ruankoystem這個使用者下的RSYS_ACC_ACCOUNT表是否有壞塊
set serveroutput on
declare num_corrupt int;
begin
  num_corrupt := 0;
  dbms_repair.check_object (
  schema_name => 'ruankoystem',
  object_name => 'RSYS_ACC_ACCOUNT'
  repair_table_name => 'repair_table',
  corrupt_count => num_corrupt);
end;

如何修復
set serveroutput on
declare num_fix int;
begin
  num_fix := 0;
  dbms_repair.fix_corrup_blocks (
  schema_name => 'ruankoystem',
  object_name => 'RSYS_ACC_ACCOUNT'
  object_type => dbms_repair.table_object,
  repair_table_name => 'repair_table',
  fix_count => num_fix );
end;

修理index和重建丟失的資料
set serveroutput on
declare num_orphans int:
begin
 num_orphans := 0;
 dbms_repair.dump_orphan_reys()
  sehema_name => 'ruankosystem'
  object_name => 'PK_rsys_acc_acount'
  object_type => dbms_repair.index_object,
  repair_table_name => 'orpman_key_table',
  orphan_table_name => 'ORPMAN_KEY_TABLE',
  key_count => num_orphans);
 dbms_output.put_line('orphan key count: '|| to_char(num_orphans)
);
end;




表資料可以是壞的,但是index(索引一定要是好的)

set serveroutput on

declare
nrows number;
badrows number;
vyhdabh varchar2(50);
vfgsbh varchar2(50);
vjbh varchar2(50);
begin
badrows := 0;
nrows := 0;
for i in (select /*+ index (tabl1) */ rowid, fgsbh from id_data.yh_dnbtab1) loop
begin

 insert into ld_data.newtb select from ld_data.yh_dnb where rowid=i.orwid;

 if (mod (nrows,20000)=0) then cmmit; end if;

  exception wher others then
  badrows := badrows+1;
  select / *+ index(a YH_DNB_IND_2) */ yhdabh,fgsbh,jbh into
 vyhdabh,ufgsbh,ujbh form. id_data.yh_dnb a where rowid=i.rowid;

 insert into bad_rows values (i.rowid,vfgsbh,vyhdabh,vjbh);
commit;
end;
nrow:=nrows+1;
end loop;
dbms_output.put_line('total rows: '||to_char(nrows)||'bad rows:'||to_char(badrows));
commit;
end;
/



用上面那個查出了那些記錄壞了,就可以手動補單了
修復後再用dbms_repair make所有壞塊做一個標識

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29618264/viewspace-2072265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章