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.
相關文章
相關標籤/搜索