如果索引表空间的数据文件损坏,可以考虑脱机数据文件,打开数据库后直接删除索引表空间及数据文件再重建相应的索引表空间及数据文件。

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