索引丟失或則索引失效以後,在不進行數據庫恢復的狀況如何解決?下面會模擬索引丟失的狀況。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.