一 说明
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控制文件损坏内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论