不使用备份恢复,如何重建索引表空间及里面的索引
1.准备环境
SQL> create tablespace idx_tbs datafile '/u01/app/oracle/oradata/orcl/idx_tbs01.dbf' size 100m;
Tablespace created.
SQL> grant select on dba_objects to scott;
Grant succeeded.
SQL> conn scott/tiger
Connected.
SQL> create table t as select * from dba_objects;
Table created.
SQL> create index idx_t on t(object_id) tablespace idx_tbs;
Index created.
SQL> create table t2 as select * from dba_tables;
Table created.
SQL> create index idx_t2 on t2(table_name) tablespace idx_tbs;
Index created.
2.模拟故障,删除索引表空间对应数据文件
SQL> select name from v$datafile;
NAME
---------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/example01.dbf
/u01/app/oracle/oradata/orcl/idx_tbs01.dbf
6 rows selected.
SQL> !rm -rf /u01/app/oracle/oradata/orcl/idx_tbs01.dbf
3.通过数据字典中保存的元数据
找出被删除的索引表空间中保存的所有的索引的创建语句
set lines 180
set pages 999
set long 90000
spool recreate_index.sql
select dbms_metadata.get_ddl('INDEX',a.SEGMENT_NAME,a.OWNER) from dba_segments a
where a.segment_type='INDEX'
and a.owner<>'SYS'
and a.tablespace_name='IDX_TBS';
DBMS_METADATA.GET_DDL('INDEX',A.SEGMENT_NAME,A.OWNER)
--------------------------------------------------------------------------------
CREATE INDEX "SCOTT"."IDX_T" ON "SCOTT"."T" ("OBJECT_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT)
TABLESPACE "IDX_TBS";
CREATE INDEX "SCOTT"."IDX_T2" ON "SCOTT"."T2" ("TABLE_NAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT)
TABLESPACE "IDX_TBS";
spool off
编辑这个脚本,去头去尾
4.重建丢失数据文件的索引表空间
SQL> select file#,name from v$datafile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/orcl/system01.dbf
2 /u01/app/oracle/oradata/orcl/sysaux01.dbf
3 /u01/app/oracle/oradata/orcl/undotbs01.dbf
4 /u01/app/oracle/oradata/orcl/users01.dbf
5 /u01/app/oracle/oradata/orcl/example01.dbf
6 /u01/app/oracle/oradata/orcl/idx_tbs01.dbf
SQL> alter database datafile 6 offline drop;
Database altered.
SQL> drop tablespace idx_tbs including contents and datafiles;
Tablespace dropped.
SQL> create tablespace idx_tbs [nologging] datafile '/u01/app/oracle/oradata/orcl/idx_tbs01.dbf' size 100m;
Tablespace created.
5.利用之前查询数据字典创建的索引重建脚本,重建所有的索引
[oracle@oel ~]$ vi recreate_index.sql
CREATE INDEX "SCOTT"."IDX_T" ON "SCOTT"."T" ("OBJECT_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "IDX_TBS";
CREATE INDEX "SCOTT"."IDX_T2" ON "SCOTT"."T2" ("TABLE_NAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "IDX_TBS";
~
~
~
~
~
~
~
~
"recreate_index.sql" 11L, 1053C written
[oracle@oel ~]$ exit
exit
SQL> @recreate_index
Index created.
Index created.