13 oracle數據庫壞塊-邏輯壞塊(模擬/修復)


13 oracle數據庫壞塊-邏輯壞塊

邏輯數據壞塊的場景
1)oracle bug也可能導致邏輯壞塊的產生. 特別是parallel dml. 例如:
Bug 5621677 Logical corruption with PARALLEL update
Bug 6994194 Logical corruption from UPDATE DML
Bug 15980234 ORA-1400 / logical corruption from direct path INSERT ALL(fail with
ORA-1400, in direct path / PDML) 。
2)多數情況下邏輯壞塊可能都是軟件問題導致,當然數據庫異常也可能導致。比如掉電的情況下,
就可能導致塊內數據不一致
邏輯數據壞塊檢測工具
RMAN備份恢忽略soft corruption
soft corruption的塊不計入maxcorrupt
media recovery會忽略soft corrupt
RMAN validate命令不會在alert中記錄soft corrupt的信息,但是會在v$database_block_corruption中記錄
DBV可以檢測soft corruption
如果不設置event10231或者類似事件,那么soft corruption的塊再次訪問時報ORA-1578

邏輯數據壞塊的檢測

exp\expdp     該方式存在缺陷,是發現邏輯壞塊后就會報錯,不再繼續檢測.如果是索引邏輯壞塊,那么exp是檢測不到的
rman        同檢測物理壞塊一樣,rman備份也具備檢測邏輯壞塊的功能,而且用的很多.
           通常我們在進行數據庫不完全恢復時,很多時候可能需要使用隱含參數強制打開數據庫,打開之后我們都建議
         使用rman進行檢查,確認是否存在邏輯壞塊等等,以免open后數據庫出現異常
bbed        上面有介紹
sql查詢       select select count(1) table_name ;
         select /*+index_ffs(xxx) */ count(1) from table_name;
analyze命令       analyze index idx_name validate structure;
         analyze table idx_name validate structure cascade online;
db_block_checking參數 在10g版本中,該參數默認是false,如果設置為true,那么可以進行邏輯壞塊的檢測,實際上設置以后, oracle在寫入時就會進行check,避免產生邏輯壞塊

邏輯壞塊的分類
data block     通常我們是最大程度的將segment內的數據搶救出來,然后處理掉壞塊.(如果是個別壞塊,可以手工修復)
index block     對於index logical 壞塊,一般來講,我們通過rebuild就可以解決(有時或許不行,可以drop然后重建)
segment header/bitmap block ...etc   這種情況下比較復雜

模擬邏輯壞塊
在很多情況下邏輯壞塊都發生在索引上,所以這里我們以模擬索引邏輯壞塊為例進行說明

YHQT@ orcl >create table yhqtest_6 as select owner,object_id,object_name from dba_objects where rownum<300;
Table created.
YHQT@ orcl >create index idx_yhqt6_id on yhqtest_6(object_id);
Index created.
YHQT@ orcl >select owner,object_id from dba_objects where object_name=upper('idx_yhqt6_id');
OWNER				OBJECT_ID
------------------------------ ----------
YHQT				    88407
YHQT@ orcl >alter session set events 'immediate trace name treedump level 88407';
Session altered.

--查看trace結果

[oracle@DSI ~]$ more /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2354.trc
*** 2019-07-15 16:00:53.250
*** MODULE NAME:(SQL*Plus) 2019-07-15 16:00:53.250
*** ACTION NAME:() 2019-07-15 16:00:53.250
 
----- begin tree dump
leaf: 0x28000db 41943259 (0: nrow: 299 rrow: 299)
----- end tree dump
YHQT@ orcl >select dbms_utility.data_block_address_file(TO_NUMBER('28000db','XXXXXXXX')) file_id,
dbms_utility.data_block_address_block(TO_NUMBER('28000db','XXXXXXXX')) block_id from dual;  2  

   FILE_ID   BLOCK_ID
---------- ----------
	10	  219

--使用bbed查看並修改

BBED> set file 10 block 219
	FILE#          	10
	BLOCK#         	219
BBED> map /v
 File: /u01/app/oracle/oradata/orcl/yhqt01.dbf (10)
 Block: 219                                   Dba:0x028000db
------------------------------------------------------------

BBED> p kdxle
struct kdxle, 32 bytes                      @100     
   struct kdxlexco, 16 bytes                @100     
      ub1 kdxcolev                          @100      0x00
      ub1 kdxcolok                          @101      0x00
      ub1 kdxcoopc                          @102      0x80
      ub1 kdxconco                          @103      0x02
      ub4 kdxcosdc                          @104      0x00000000
      sb2 kdxconro                          @108      299
      sb2 kdxcofbo                          @110      634
      sb2 kdxcofeo                          @112      4246
      sb2 kdxcoavs                          @114      3612
   sb2 kdxlespl                             @116      0
   sb2 kdxlende                             @118      0
   ub4 kdxlenxt                             @120      0x00000000
   ub4 kdxleprv                             @124      0x00000000
   ub1 kdxledsz                             @128      0x00
   ub1 kdxleflg                             @129      0x00 (NONE)

BBED> dump /v offset 108 count 32
 File: /u01/app/oracle/oradata/orcl/yhqt01.dbf (10)
 Block: 219     Offsets:  108 to  139  Dba:0x028000db
-------------------------------------------------------
 2b017a02 96101c0e 00000000 00000000 l +.z.............
YHQT@ orcl >select to_char(299,'xxxxxx') from dual;

TO_CHAR
-------
    12b
BBED> modify /x 2a offset 108
 File: /u01/app/oracle/oradata/orcl/yhqt01.dbf (10)
 Block: 219              Offsets:  108 to  139           Dba:0x028000db
------------------------------------------------------------------------
 2a017a02 96101c0e 00000000 00000000 00000000 00000000 601f0000 541f481f 

 <32 bytes per line>

BBED> sum apply
Check value for File 10, Block 219:
current = 0xf239, required = 0xf239

 使用rman進行查看

RMAN> backup validate check logical database;
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
5    FAILED 0              81           64011           10373342  
  File Name: /home/oracle/backup/test01.tts
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       3              20628           
  Index      0              13088           
  Other      0              30203        
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
10   FAILED 0              6190         6400            10411019  
  File Name: /u01/app/oracle/oradata/orcl/yhqt01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       2              53              
  Index      1              2               
  Other      1              155  

用視圖查詢

YHQT@ orcl >select * from v$database_block_corruption;

     FILE#     BLOCK#	  BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
	10	  135	       1		  0 FRACTURED
	10	  160	       1		  0 ALL ZERO
	 5	 2199	       1	    9533291 CORRUPT
	 5	 2207	       1	    9579846 CORRUPT
	 5	 2231	       1	    9620379 CORRUPT
	10	  151	       1	   10410172 CORRUPT
	10	  219	       1	   10411020 CORRUPT
CORRUPTION_CHANGE#值= 10410172,我們可以發現,corruption_change#值是大於0,那么表示是邏輯壞塊

--查詢壞塊所在的對象

set autot off
set lines 150
col segment_name for a15
col owner for a20
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 10
and 219 between block_id AND block_id + blocks - 1; 
YHQT@ orcl >SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 10
and 219 between block_id AND block_id + blocks - 1;  2    3    4  

TABLESPACE_NAME            SEGMENT_TYPE      OWNER            SEGMENT_NAME
------------------------------ ------------------ -------------------- ---------------
YHQT                   INDEX          YHQT               IDX_YHQT6_ID

使用dbms_repair檢測

創建repair table
YHQT@ orcl >conn / as sysdba
YHQT@ orcl >BEGIN
   DBMS_REPAIR.ADMIN_TABLES (
   TABLE_NAME => 'REPAIR_TABLE',
   TABLE_TYPE => dbms_repair.repair_table,
   ACTION => dbms_repair.create_action,
   TABLESPACE => 'YHQT');
END;
/
檢查對象上是否存在壞塊
YHQT@ orcl >set serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
SCHEMA_NAME  => 'YHQT',
OBJECT_NAME  => 'YHQTEST_6',
REPAIR_TABLE_NAME  => 'REPAIR_TABLE',
corrupt_count  => num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
/
通過check后,就可以查詢repair table了
SYS@ orcl >col CORRUPT_DESCRIPTION for a100
SYS@ orcl >select OBJECT_ID,RELATIVE_FILE_ID,BLOCK_ID,CORRUPT_TYPE,OBJECT_NAME,CORRUPT_DESCRIPTION FROM repair_table;

---修復邏輯塊錯誤--index

SYS@ orcl >conn yhqt/***
Connected.
YHQT@ orcl >alter index IDX_YHQT6_ID rebuild;
Index altered.
YHQT@ orcl >select * from v$database_block_corruption;
     FILE#     BLOCK#      BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
    10      135           1          0 FRACTURED
    10      160           1          0 ALL ZERO
     5     2199           1        9533291 CORRUPT
     5     2207           1        9579846 CORRUPT
     5     2231           1        9620379 CORRUPT
    10      151           1       10410172 CORRUPT
    10      219           1       10411020 CORRUPT
7 rows selected.

YHQT@ orcl >analyze table yhqtest_6 validate structure cascade online;
analyze table yhqtest_6 validate structure cascade online
*
ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file
YHQT@ orcl >drop index IDX_YHQT6_ID;
Index dropped.
YHQT@ orcl >create index idx_yhqt6_id on yhqtest_6(object_id);
Index created.
YHQT@ orcl >analyze table yhqtest_6 validate structure cascade online;
Table analyzed.

 使用expdp備份

[oracle@DSI ~]$ expdp system/**** DIRECTORY=dump_file_dir_test compression=all schemas=YHQT dumpfile=schemas_YHQT_%U.DMP parallel=2 logfile=schemas_YHQT_20190715.log

修復上一篇物理壞塊測試中的

2.The block is Fractured/Incomplete - header and footer of the block do not match

分析alert日志

Mon Jul 15 11:12:19 2019
Hex dump of (file 10, block 143) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2354.trc
Corrupt block relative dba: 0x0280008f (file 10, block 143)
Fractured block found during multiblock buffer read
Data in bad block:
 type: 6 format: 2 rdba: 0x0280008f
 last change scn: 0x0000.009e53f5 seq: 0x1 flg: 0x06
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x54f50601 ===>>>tail=2 lower bytes of SCN Base+type+seq=53f5+06+01 而改變之后的值是54f50601
 check value in block header: 0x46ca
 computed block checksum: 0x0
Reading datafile '/u01/app/oracle/oradata/orcl/yhqt01.dbf' for corruption at rdba: 0x0280008f (file 10, block 143)
Reread (file 10, block 143) found same corrupt data (no logical check)
Mon Jul 15 11:12:19 2019
Corrupt Block Found
         TSN = 10, TSNAME = YHQT
         RFN = 10, BLK = 143, RDBA = 41943183
         OBJN = 88385, OBJD = 88385, OBJECT = YHQTEST_2, SUBOBJECT = 
         SEGMENT OWNER = YHQT, SEGMENT TYPE = Table Segment
Corrupt Block Found
         TSN = 10, TSNAME = YHQT
         RFN = 10, BLK = 143, RDBA = 41943183
         OBJN = 88385, OBJD = 88385, OBJECT = YHQTEST_2, SUBOBJECT = 
         SEGMENT OWNER = YHQT, SEGMENT TYPE = Table Segment
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2354.trc  (incident=67366):
ORA-01578: ORACLE data block corrupted (file # 10, block # 143)
ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'
Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_67366/orcl_ora_2354_i67366.trc
Mon Jul 15 11:12:21 2019
Sweep [inc][67366]: completed
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2354.trc  (incident=67367):
ORA-01578: ORACLE data block corrupted (file # 10, block # 143)
ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'
Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_67367/orcl_ora_2354_i67367.trc
Hex dump of (file 10, block 135) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_67366/orcl_m000_2539_i67366_a.trc

用bbed修改

BBED> p tailchk
ub4 tailchk                                 @8188     0x54f50601
BBED> modify /x 0106f553 offset 8188
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /u01/app/oracle/oradata/orcl/yhqt01.dbf (10)
 Block: 143              Offsets: 8188 to 8191           Dba:0x0280008f
------------------------------------------------------------------------
 0106f553 
 <32 bytes per line>
BBED> sum apply
Check value for File 10, Block 143:
current = 0x41ca, required = 0x41ca
YHQT@ orcl >alter system flush buffer_cache;
YHQT@ orcl >set linesize 999
YHQT@ orcl >select * from yhqtest_2;

    ID NAME
---------- ---------===查詢正常,數據也還在
     1 yhq


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM