oracle 索引丢失后的恢复

    索引丢失或则索引失效以后,在不进行数据库恢复的状况如何解决?下面会模拟索引丢失的状况。sql

1    新建一个表空间tmp0408数据库

    create tablespace tmp0408 datafile '/u01/oracle/oradata/orcl/tmp0408.dbf' size 10m;oracle

SQL> create tablespace tmp0408 datafile '/u01/oracle/oradata/orcl/tmp0408.dbf' size 10M;

Tablespace created.
SQL> select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------------
	 1 SYSTEM  /u01/oracle/oradata/orcl/system01.dbf
	 2 ONLINE  /u01/oracle/oradata/orcl/sysaux01.dbf
	 3 ONLINE  /u01/oracle/oradata/orcl/undotbs01.dbf
	 4 ONLINE  /u01/oracle/oradata/orcl/users01.dbf
	 5 ONLINE  /u01/oracle/oradata/orcl/user02.dbf
	 6 ONLINE  /u01/oracle/oradata/orcl/tmpspace0327
	 7 ONLINE  /u01/oracle/oradata/orcl/tmp0408.dbf

2    在刚建的表空间tmp0408 中建立表emp 字段ename的索引index_emp_ename_ithis

SQL> create index INDEX_EMP_ENAME_I on emp(ename) tablespace tmp0408;

Index created.
SQL> select index_name,table_owner,table_name,tablespace_name from user_indexes where table_name = 'EMP';

INDEX_NAME	     TABLE_OWNE TABLE_NAME	     TABLESPACE_NAME
-------------------- ---------- -------------------- --------------------
INDEX_EMP_ENAME_I    SCOTT	EMP		     TMP0408
PK_EMP		     SCOTT	EMP		     USERS

3    删除表空间的文件tmp0408.dbfspa

SQL> drop index index_emp_ename_i;

#删除索引以后在sys用户下切换几回日志
SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;
# 切换用户已经报错了,数据发现表空间tmp0408的数据文件tmp0408文件已经不在了,报错
SQL> conn scott/tiger
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Process ID: 0
Session ID: 0 Serial number: 0
# 再切换会sys用户已是空实例了
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area  584568832 bytes
Fixed Size		    2230552 bytes
Variable Size		  440403688 bytes
Database Buffers	  134217728 bytes
Redo Buffers		    7716864 bytes
SQL> alter database mount;

Database altered.
# 启动到mount状态下,把丢失的表空间下线再open数据库
SQL> alter database datafile '/u01/oracle/oradata/orcl/tmp0408.dbf' offline drop;

Database altered.

SQL> alter database open;

Database altered.

这个时候就发现scott.emp 里面没法插入数据了,由于索引对于的表空间没有了,索引失效日志

SQL> insert into emp (empno,ename)values(123,'aaa');
insert into emp (empno,ename)values(123,'aaa')
            *
ERROR at line 1:
ORA-00376: file 7 cannot be read at this time
ORA-01110: data file 7: '/u01/oracle/oradata/orcl/tmp0408.dbf'

解决办法:删掉索引,重建索引。code

    注意:要先找到索引叫什么名字,当时简历索引的sql语句是哪一个才能够删除索引。索引

SQL> select index_name,table_name,tablespace_name from user_indexes;

INDEX_NAME	     TABLE_NAME 	  TABLESPACE_NAME
-------------------- -------------------- --------------------
INDEX_EMP_ENAME_I    EMP		  TMP0408
PK_EMP		     EMP		  USERS
PK_DEPT 	     DEPT		  USERS

索引名字:INDEX_EMP_ENAME_Ici

SQL> select dbms_metadata.get_ddl('INDEX','INDEX_EMP_ENAME_I') from dual;

DBMS_METADATA.GET_DDL('INDEX','INDEX_EMP_ENAME_I')
--------------------------------------------------------------------------------

  CREATE INDEX "SCOTT"."INDEX_EMP_ENAME_I" ON "SCOTT"."EMP" ("ENAME")
  PCTFRE

建立索引的sql:CREATE INDEX "SCOTT"."INDEX_EMP_ENAME_I" ON "SCOTT"."EMP" ("ENAME")get

4    删除原来的索引并重建索引

SQL> drop index INDEX_EMP_ENAME_I;

Index dropped.
SQL> CREATE INDEX "SCOTT"."INDEX_EMP_ENAME_I" ON "SCOTT"."EMP" ("ENAME") tablespace users;

Index created.
SQL> select index_name,table_name,tablespace_name from user_indexes;

INDEX_NAME	     TABLE_NAME 	  TABLESPACE_NAME
-------------------- -------------------- --------------------
INDEX_EMP_ENAME_I    EMP		  USERS
PK_EMP		     EMP		  USERS
PK_DEPT 	     DEPT		  USERS

这个时候索引已经恢复了,表emp里面又能够从新插入数据了

SQL> insert into emp (empno,ename)values(123,'aaa');

1 row created.

SQL> commit;

Commit complete.

SQL> select empno,ename from emp where empno = 123;

     EMPNO ENAME
---------- ----------
       123 aaa

注意:索引是恢复了,只是索引所在的表空间换了一下。并且以前已是把丢失文件的表空间tmp0408 下线的,下一次重启又会没法启动了,因此建议 把哪一个丢失文件的表空间删除。

SQL> select tablespace_name,status from user_tablespaces;

TABLESPACE_NAME      STATUS
-------------------- ---------
SYSTEM		     ONLINE
SYSAUX		     ONLINE
UNDOTBS1	     ONLINE
TEMP		     ONLINE
USERS		     ONLINE
USER02		     ONLINE
TMP_SPACE_0327	     ONLINE
TMP0408 	     ONLINE
SQL> select file#,name,status from v$datafile;

     FILE# NAME 				    STATUS
---------- ---------------------------------------- ----------
########## /u01/oracle/oradata/orcl/system01.dbf    SYSTEM
########## /u01/oracle/oradata/orcl/sysaux01.dbf    ONLINE
########## /u01/oracle/oradata/orcl/undotbs01.dbf   ONLINE
########## /u01/oracle/oradata/orcl/users01.dbf     ONLINE
########## /u01/oracle/oradata/orcl/user02.dbf	    ONLINE
########## /u01/oracle/oradata/orcl/tmpspace0327    ONLINE
########## /u01/oracle/oradata/orcl/tmp0408.dbf     RECOVER
# 能够看到tmp0408.dbf 状态有问题。
SQL> drop tablespace TMP0408;

Tablespace dropped.
# 表空间直接删除
SQL> select file#,name,status from v$datafile;

     FILE# NAME 				    STATUS
---------- ---------------------------------------- ----------
########## /u01/oracle/oradata/orcl/system01.dbf    SYSTEM
########## /u01/oracle/oradata/orcl/sysaux01.dbf    ONLINE
########## /u01/oracle/oradata/orcl/undotbs01.dbf   ONLINE
########## /u01/oracle/oradata/orcl/users01.dbf     ONLINE
########## /u01/oracle/oradata/orcl/user02.dbf	    ONLINE
########## /u01/oracle/oradata/orcl/tmpspace0327    ONLINE

6 rows selected.

SQL> select tablespace_name,status from user_tablespaces;

TABLESPACE_NAME      STATUS
-------------------- ----------
SYSTEM		     ONLINE
SYSAUX		     ONLINE
UNDOTBS1	     ONLINE
TEMP		     ONLINE
USERS		     ONLINE
USER02		     ONLINE
TMP_SPACE_0327	     ONLINE

7 rows selected.
# 已经删除丢失的表空间
ORACLE instance started.

Total System Global Area  584568832 bytes
Fixed Size		    2230552 bytes
Variable Size		  440403688 bytes
Database Buffers	  134217728 bytes
Redo Buffers		    7716864 bytes
Database mounted.
Database opened.
相关文章
相关标签/搜索