Oracle控制文件损坏的恢复方案

 更新时间:2025年10月20日 09:38:40   作者:施嘉伟  
本文介绍了将表空间TS_HX_SB_IDX、IDX_SSD_HX中的索引分批迁移至TS_SSD_IDX的流程及脚本编写,预计用4个晚上完成,无需业务停机,并详细说明了迁移前准备、脚本编写及迁移后的检查方法,需要的朋友可以参考下

一 说明

1.1 迁移说明

把表空间TS_HX_SB_IDX、IDX_SSD_HX中的全部索引迁移至表空间TS_SSD_IDX。

1.2 迁移流程

整体迁移流程:(因为索引量很大,需要分批进行迁移)

步骤流程计划时间估算
1迁移用户HX_YH、HX_RD、HX_JC、HX_PZ、HX_DJ、HX_ZM、HX_RD索引(无分区)一个晚上
2迁移用户HX_ZS索引(有分区)一个晚上
3迁移用户HX_SB索引(首先迁移分区索引(小索引)一节点上跑,非分区索引(小索引)二节点上跑)一个晚上
4迁移用户HX_SB剩下的索引一个晚上

总结时间:4个晚上

总计花费业务停机时间:0

二 索引迁移详细操作流程

2.1 前期准备

统计各个用户在此两表空间的索引量大小,以便计划迁移。

SQL> select segment_type,sum(bytes)/1024/1024 m from dba_segments where owner='HX_SB' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') group by segment_type;

SEGMENT_TYPE                M
------------------ ----------
INDEX               494088.25
INDEX PARTITION    236043.688

SQL> select segment_type,sum(bytes)/1024/1024 m from dba_segments where owner='HX_ZS' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') group by segment_type;

SEGMENT_TYPE                M
------------------ ----------
INDEX                45650.75
INDEX PARTITION    99813.3125

SQL> select segment_type,sum(bytes)/1024/1024 m from dba_segments where owner='HX_RD' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') group by segment_type;

SEGMENT_TYPE                M
------------------ ----------
INDEX               8373.6875

这些都没有分区:
单位(M)
HX_YH 50
HX_RD 8373.6875
HX_JC 4.0625
HX_PZ 640.4375
HX_DJ 3732
HX_ZM 39

综上:计划先迁移HX_RD、 HX_YH、HX_RD、HX_JC、HX_PZ、HX_DJ、HX_ZM这些用户的索引,再迁移HX_ZS,最后分批迁移HX_SB索引。

2.2 撰写迁移脚本(无分区)

重建普通索引脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0
spool /home/oracle/idx/hx_rd.sql
select 'alter index '||a.owner||'.'||a.index_name||' rebuild tablespace TS_SSD_IDX online parallel 4;' from dba_indexes a where a.owner='HX_RD' and not exists(select * from dba_part_indexes b where a.owner=b.owner and a.index_name=b.index_name) and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');
spool off;

修改parallel脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0 
spool /home/oracle/idx/hx_rd_parallel.sql
select 'alter index '||a.owner||'.'||a.index_name||' noparallel;' from dba_indexes a where a.owner='HX_RD' and not exists(select * from dba_part_indexes b where a.owner=b.owner and a.index_name=b.index_name) and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');
spool off;

注意事项:

把hx_dr.sql和hx_rd_parallel.sql中无关信息删除。(比如select ‘alter’…… 最后的33 rows selected),hx_rd.sql文件中只保留alter index hx_rd.index_name rebuild TS_SSD_IDX online parallel 4; hx_rd_parallel.sql文件中只保留 alter index hx_rd.index_name noparallel;即可。

最后撰写hx_rd.sh脚本。

vi hx_rd.sh
[oracle@ljw sql]$ cat 2.sh
#!/bin/sh
sqlplus "/ as sysdba" <<EOF
host echo "*******************begin rebuild*****************",`date`
@idx/hx_rd.sql;
host echo "*******************end rebuild*******************",`date`
host echo "*******************begin noparalel***************",`date`
@hx_rd_parallel.sql;
host echo "*******************end noparalel*****************",`date`
EOF

2.3 撰写迁移脚本(有分区)

重建普通索引脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0
spool /home/oracle/idx/hx_zs.sql
select 'alter index '||a.owner||'.'||a.index_name||' rebuild tablespace TS_SSD_IDX online parallel 4;' from dba_indexes a where a.owner='HX_ZS' and not exists(select * from dba_part_indexes b where a.owner=b.owner and a.index_name=b.index_name) and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');
spool off;

重建分区索引脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0
spool /home/oracle/idx/hx_zs_part.sql
select 'alter index '||a.owner||'.'||a.index_name||' rebuild partition '||b.partition_name||' tablespace TS_SSD_IDX online parallel 4;' from dba_part_indexes a,dba_ind_partitions b where a.owner=b.index_owner and a.index_name=b.index_name and a.owner='HX_ZS' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');
spool off;

修改普通索引parallel脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0 
spool /home/oracle/idx/hx_zs_parallel.sql
select 'alter index '||a.owner||'.'||a.index_name||' noparallel;' from dba_indexes a where a.owner='HX_RD' and not exists(select * from dba_part_indexes b where a.owner=b.owner and a.index_name=b.index_name) and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');
spool off;

修改分区索引parallel脚本:

su – oracle
sqlplus / as sysdba
set lin 400
set pagesize 0 
spool /home/oracle/idx/hx_zs_part_parallel.sql
select 'alter index '||a.owner||'.'||a.index_name||' noparallel;' from dba_part_indexes a,dba_ind_partitions b where a.owner=b.index_owner and a.index_name=b.index_name and a.owner='HX_ZS' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') group by a.owner,a.index_name;
spool off;

注意事项和前面一样,删除。sql中无关信息。

最后撰写hx_rd.sh脚本。

vi hx_rd.sh

#!/bin/sh
sqlplus "/ as sysdba" <<EOF
host echo "*******************begin rebuild*****************",`date`
@idx/hx_zs.sql;
@hx_zs_part.sql;
host echo "*******************end rebuild*******************",`date`
host echo "*******************begin noparalel***************",`date`
@hx_zs_parallel.sql;
@hx_zs_part_parallel.sql;
host echo "*******************end noparalel*****************",`date`
EOF


2.4 执行脚本

cd 到相应目录下

nohup ./hx_rd.sh & 即可

2.5 检查索引迁移成功与否

检查源表空间中是否还存在索引:

select index_name,degree,tablespace_name from dba_indexes where owner='HX_RD' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX');

检查迁移到的表空间中是否有索引:

select index_name,degree,tablespace_name from dba_indexes where owner='HX_RD' and tablespace_name in ('TS_SSD_IDX');

常用语句:

如:

查询HX_SB用户下普通索引的大小:

select segment_name,segment_type,bytes/1024/1024 m from dba_segments where owner='HX_SB' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') and segment_type='INDEX' order by bytes;

查询HX_SB用户下分区索引的大小:

select segment_name,segment_type,partition_name,bytes/1024/1024 m from dba_segments where owner='HX_SB' and tablespace_name in('TS_HX_SB_IDX','IDX_SSD_HX') and segment_type='INDEX PARTITION' order by bytes;

到此这篇关于Oracle控制文件损坏的恢复方案的文章就介绍到这了,更多相关Oracle控制文件损坏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle实现竖表转横表的几种常用方法小结

    Oracle实现竖表转横表的几种常用方法小结

    本文主要介绍了Oracle实现竖表转横表的几种常用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 如何使用Flink CDC实现 Oracle数据库数据同步

    如何使用Flink CDC实现 Oracle数据库数据同步

    Flink CDC是一个基于流的数据集成工具,为用户提供一套功能全面的编程接口API, 该工具使得用户能够以YAML 配置文件的形式实现数据库同步,同时也提供了Flink CDC Source Connector API,本文给大家介绍使用Flink CDC实现 Oracle数据库数据同步的方法,感兴趣的朋友一起看看吧
    2024-08-08
  • Oracle如何修改当前的序列值实例详解

    Oracle如何修改当前的序列值实例详解

    很多时候我们都会用到oracle序列,那么我们怎么修改序列的当前值呢?下面这篇文章主要给大家介绍了关于Oracle如何修改当前的序列值的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Oracle 当前用户下所有表的记录总数

    Oracle 当前用户下所有表的记录总数

    Oracle 数据库下 查询当前用户下所有表的记录总数
    2009-07-07
  • Oracle数据库中表压缩的实现方式和特点

    Oracle数据库中表压缩的实现方式和特点

    在 Oracle 数据库中,表压缩是一项重要的功能,旨在优化存储空间和提高性能,Oracle 提供了多种表压缩技术,以适应不同的应用场景和需求,以下是 Oracle 数据库中表压缩的实现方式和特点,需要的朋友可以参考下
    2024-10-10
  • Oracle SqlPlus设置Login.sql的技巧

    Oracle SqlPlus设置Login.sql的技巧

    sqlplus在启动时会自动运行两个脚本:glogin.sql、login.sql这两个文件,接下来通过本文给大家介绍Oracle SqlPlus设置Login.sql的技巧,对oracle sqlplus设置相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • plsql developer修改sql窗口的大小实现

    plsql developer修改sql窗口的大小实现

    本文主要介绍了plsql developer修改sql窗口的大小实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Oracle带输入输出参数存储过程(包括sql分页功能)

    Oracle带输入输出参数存储过程(包括sql分页功能)

    这篇文章主要介绍了Oracle带输入输出参数存储过程(包括sql分页功能)的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • oracle备份恢复的具体方法

    oracle备份恢复的具体方法

    这篇文章介绍了oracle备份恢复的具体方法,有需要的朋友可以参考一下
    2013-10-10
  • Oracle 12c新特性之如何检测有用的多列统计信息详解

    Oracle 12c新特性之如何检测有用的多列统计信息详解

    这篇文章主要给大家介绍了Oracle 12c新特性之如何检测有用的多列统计信息的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03

最新评论