index索引表空间丢失的恢复

版权声明:欢迎指正,评论,共同学习 https://blog.csdn.net/m18994118189/article/details/82796241

不使用备份恢复,如何重建索引表空间及里面的索引

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;

扫描二维码关注公众号,回复: 3417511 查看本文章

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.
 

猜你喜欢

转载自blog.csdn.net/m18994118189/article/details/82796241
今日推荐