在巡檢客戶的數據庫中,發現告警日志出現大量的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為主鍵別名