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