程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫壞塊問題處理思路

Oracle數據庫壞塊問題處理思路

編輯:Oracle數據庫基礎
 

在巡檢客戶的數據庫中,發現告警日志出現大量的ORA-01578,ORA-01110,ORA-26040錯誤。該錯誤為數據庫中出現壞塊需處理。

以下給大家講解一下在沒有可用的備份情況下,數據庫表和索引壞塊處理思路。

一 分析損壞的數據塊類型

1.1 生產環境:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Windows server 2008 R2 Enterprise
巡檢過程中發現類似錯誤如下:
Errors in file e:\app\oracle\diag\rdbms\orcl\orcl\trace\orcl_ora_6860.trc (incident=169237):
ORA-01578: ORACLE 數據塊損壞 (文件號 6, 塊號 329302)
ORA-01110: 數據文件 6: 'E:\APP\ORACLE\ORADATA\ORCL\YKSPACE.DBF'
ORA-26040: 數據塊是使用 NOLOGGING 選項加載的。

1.2 數據表類型:

SQL> SELECT tablespace_name,segment_type,owner,segment_name FROM dba_extents WHERE file_id = 6 and 329302 between block_id AND block_id + blocks - 1;
TABLESPACE_NAME SEGMENT_TYPE OWNER
------------------------------ ------------------ --------------

SEGMENT_NAME
----------------------------------------------------------------

YKSPACE LOBSEGMENT YKSOFT
SYS_LOB0000820025C00004$$

對於LOBSEGMENT類型,還需要進一步分析:
SQL> select owner,table_name from dba_lobs where segment_name like 'SYS_LOB0000820025C00004$$';
OWNER TABLE_NAME
------------------------------ ------------------------------
YKSOFT CONSTANT

1.3 索引表類型:

SQL> SELECT tablespace_name,segment_type,owner,segment_name FROM dba_extents WHERE file_id = 6 and 329302 between block_id AND block_id + blocks - 1;
TABLESPACE_NAME SEGMENT_TYPE OWNER
------------------------------ ------------------ --------------

SEGMENT_NAME
----------------------------------------------------------------

YKSPACE INDEX YKSOFT
M83_SU_USR_PK_1

二 損壞表處理辦法

2.1 數據表處理:

在有備份的情況下可以通過RMAN來進行恢復(不丟失數據)。
在沒有備份的情況下(丟失壞塊數據)可以通過設置10231事件:
ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10' ;

使用EXP導出不存在壞塊的數據:
exp yksoft/*** file=xx.dmp log=xx.log tables=CONSTANT
同時可以導出多個表
exp yksoft/*** file=xx.dmp log=xx.log tables=表1,表2

取消10231事件:
ALTER SYSTEM SET EVENTS '10231 trace name context off';

2.2 索引表處理:

對於索引損壞,通常使用刪除索引,重建索引。(只需執行3、5、6步驟)
SQL>DROP INDEX yksoft.M83_SU_USR_PK_1;

當刪除索引時候出現:ORA-02429: 無法刪除用於強制唯一/主鍵的索引。

1.查詢索引所在的表(M83_SU_USR):
select index_name,column_name,table_name from dba_ind_columns where index_name='M83_SU_USR_PK_1';

2.查詢表定義:
set heading off;  
set echo off;  
Set pages 999;  
set long 90000;
select dbms_metadata.get_ddl('TABLE','M83_SU_USR','YKSOFT') from dual;
#(類型,表名,用戶名)

3.查詢索引內容:
select dbms_metadata.get_ddl('INDEX','SUTAX_MX_INDEX','YKSOFT') from dual;
#(類型,索引名,用戶名)

4.刪除表約束:
alter table yksoft.M83_SU_USR drop constraint M83_SU_USR_PK_1;

5.刪除索引:
DROP INDEX yksoft.M83_SU_USR_PK_1;

6.重建索引:
CREATE UNIQUE INDEX "YKSOFT"."M83_SU_USR_PK_1" ON "YKSOFT"."M83_SU_USR" ("RECIDX") PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "YKSPACE";

7.添加相關約束:
alter table yksoft.M83_SU_USR add CONSTRAINT "M83_SU_USR_PK_1" PRIMARY KEY ("RECIDX");
#RECIDX為主鍵別名

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved