某個表空間的資料檔案損壞的修復思路

還不算暈發表於2013-10-27

如果索引表空間的資料檔案損壞,可以考慮離線資料檔案,開啟資料庫後直接刪除索引表空間及資料檔案再重建相應的索引表空間及資料檔案。

1.新建一個索引表空間

SQL> conn bys/bys

已連線。

SQL> show user

USER 為 "BYS"

SQL> select * from user_role_privs;

USERNAME                       GRANTED_ROLE                   ADM DEF OS_

------------------------------------------------------------ --- --- ---

BYS                            DBA                            NO  YES NO

SQL> create tablespace bys_indx datafile 'e:\useroradata\bys_indx.dbf' size 10m;

表空間已建立。

SQL> select * from cat;

TABLE_NAME                     TABLE_TYPE

------------------------------ -----------

EMPBYS                         TABLE

SYS_TEMP_FBT                   TABLE

TEST                           TABLE

TEST2                          TABLE

TEST3                          TABLE

SQL> create index empbys_empno onempbys(empno) tablespace bys_indx nologging;

索引已建立。

SQL> col index_name for a15

SQL> col table_name for a15

SQL> selectindex_name,table_name,tablespace_name,status from user_indexes;

INDEX_NAME     TABLE_NAME      TABLESPACE_NAME      STATUS

--------------- ----------------------------------- --------

EMPBYS_EMPNO    EMPBYS          BYS_INDX             VALID

SQL> conn / as sysdba

已連線。

SQL> shutdown immediate;

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

2.刪除BYS_INDX.DBF並重啟資料庫,此時在OPEN階段會報錯找不到資料檔案

SQL> startup;

ORACLE 例程已經啟動。

Total System Global Area  431038464 bytes

Fixed Size                  1375088 bytes

Variable Size             331351184 bytes

Database Buffers           92274688 bytes

Redo Buffers                6037504 bytes

資料庫裝載完畢。

ORA-01157: 無法標識/鎖定資料檔案 6 - 請參閱 DBWR 跟蹤檔案

ORA-01110: 資料檔案 6: 'E:\USERORADATA\BYS_INDX.DBF'

3.OFFLINE丟失資料檔案 的索引表空間

SQL> select status from v$instance;

STATUS

------------

MOUNTED

SQL> alter database datafile 6 offline;    --檔案號根據上一步的報錯得出,也可以直接使用檔案直接路徑:如 datafile  'USERORADATA\BYS_INDX.DBF' offline;   

資料庫已更改。

如使用以上語句出現:ORA-01145錯誤:ORA-01145 除非啟用了介質恢復,否則不允許立即離線   。出現此錯誤可以使用DROP關鍵字,即:alter database datafile 6 offlinedrop;

SQL> alter database open;

資料庫已更改。

SQL> selectfile_id,file_name,tablespace_name,bytes/1024/1024 MB from dba_data_files;

  FILE_ID FILE_NAME                     TABLESPACE_NAME              MB

---------- -------------------------------------------------- ----------

        5 E:\USERORADATA\BYS_UNDO.DBF   BYS_UNDO                     30

        6 E:\USERORADATA\BYS_INDX.DBF   BYS_INDX

        4 E:\SYSORADATA\USERS01.DBF     USERS                         5

        3 E:\SYSORADATA\UNDOTBS01.DBF   UNDOTBS1                     90

        2 E:\SYSORADATA\SYSAUX01.DBF    SYSAUX                      570

        1 E:\SYSORADATA\SYSTEM01.DBF    SYSTEM                      690

SQL> select file#,status fromv$datafile;

    FILE# STATUS

---------- -------

        1 SYSTEM

        2 ONLINE

        3 ONLINE

        4 ONLINE

        5 ONLINE

        6 OFFLINE

SQL> select  file_id,tablespace_name from  dba_data_files;

  FILE_ID TABLESPACE_NAME

---------- --------------------

        5 BYS_UNDO

        6 BYS_INDX

        4 USERS

        3 UNDOTBS1

        2 SYSAUX

        1 SYSTEM

SQL> conn bys/bys

已連線。

SQL> select index_name,table_name,tablespace_name,statusfrom user_indexes;

未選定行

4.刪除並重建索引表空間

SQL> drop  tablespace bys_indx including contents;

表空間已刪除。

也可以用 drop  tablespace bys_indx including contents  and datafiles;  連帶資料檔案一起刪除。

SQL> create tablespace bys_indx datafile'e:\useroradata\bys_indx.dbf' size 10m;

create tablespace bys_indx datafile'e:\useroradata\bys_indx.dbf' size 10m

*

第 1 行出現錯誤:

ORA-01119: 建立資料庫檔案 'e:\useroradata\bys_indx.dbf' 時出錯

ORA-27038: 所建立的檔案已存在

OSD-04010: 指定了 <create> 選項, 但檔案已經存在

SQL> create tablespace bys_indx datafile'e:\useroradata\bys_indx.dbf' size 10m;

表空間已建立。


SQL> selecttablespace_name,status,contents,extent_management from dba_tablespaces;

TABLESPACE_NAME      STATUS   CONTENTS  EXTENT_MAN

-------------------- --------- -------------------

SYSTEM               ONLINE    PERMANENT LOCAL

SYSAUX               ONLINE    PERMANENT LOCAL

UNDOTBS1             ONLINE    UNDO     LOCAL

TEMP                 ONLINE    TEMPORARY LOCAL

USERS                ONLINE    PERMANENT LOCAL

BYS_UNDO             ONLINE    UNDO     LOCAL

BYS_INDX             ONLINE    PERMANENT LOCAL

相關文章