Move Tablespace for Partition Tables

 技术学习  4 条评论 »
212010
 

客户有一需求,要将一个 tablespace 上所有的 objects 移到另外一个 tablespace 上,过程记录如下:

1,检查该TBS上存在哪些类型的Segment
[code]select distinct segment_type
from dba_segments
where owner = 'USER_NAME'
and tablespace_name = 'TBS_NAME';[/code]
发现有五种,分别是 TABLE, INDEX, TABLE PARTITION, TABLE SUBPARTITION, INDEX PARTITION, INDEX SUBPARTITION,接下来针对不同类型的 Segment 进行不同的操作,至于如何把实际需要运行的SQL兜出来,就不做详细解释了。

2,针对 Table 执行如下命令

alter table USER_NAME.TABLE_NAME move tablespace NEW_TBS_NAME;

3,针对 Index 执行如下命令

alter index USER_NAME.INDEX_NAME rebuild tablespace NEW_TBS_NAME;

4,针对含 Partition Table 执行如下命令
[code]alter table USER_NAME.TABLE_NAME move partition PARTITION_NAME tablespace NEW_TBS_NAME;
alter table USER_NAME.TABLE_NAME modify default attributes tablespace NEW_TBS_NAME;[/code]

5,针对含 SubPartition Table 执行如下命令
[code]alter table USER_NAME.TABLE_NAME move subpartition SUBPARTITION_NAME tablespace NEW_TBS_NAME;
[color=Blue]alter table USER_NAME.TABLE_NAME modify default attributes tablespace TABLE_NAME;
alter table USER_NAME.TABLE_NAME modify default attributes for partition PARTITION_NAME tablespace NEW_TBS_NAME;[/color][/code]

6,针对含 Partition Index 执行如下命令

alter index USER_NAME.INDEX_NAME rebuild partition PARTITION_NAME tablespace NEW_TBS_NAME;

7,针对含 SubPartition Index 执行如下命令

alter index USER_NAME.INDEX_NAME rebuild subpartition SUBPARTITION_NAME tablespace NEW_TBS_NAME;

这里要特别注意的是,在包含 Partition 或者 SubPartition 的 Table 中,除了需要将数据全部转移到新的 Tablespace 之外,还需要将上一层 Table 或者 Partition 的定义属性中的 Tablespace 信息也修改成新的 Tablespace,具体请参考蓝色标记的SQL语句,这样才完美。

最后需要检查所有相关的 Index 是否可用,最好是通过以下命令再确认一下各个 Segment 的定义中是否还存在旧的 Tablespace 信息
[code]select dbms_metadata.get_ddl('TABLE','TABLE_NAME','USER_NAME') from dual;
select dbms_metadata.get_ddl('INDEX','INDEX_NAME','USER_NAME') from dual;[/code]

ORA-03294, Resize Tablespace, High Water Mark

 技术学习  没有评论 »
142010
 

记得以前第一次通过 Resize Datafile 方式来 Thrink Tablespace 的时候,总共30G表空间,明明使用了10G,剩余20G空闲,但是你想缩小到12G的时候确报错,错误信息为

[color=Red][quote]ERROR at line 1:
orA-03297: file contains used data beyond requested RESIZE value[/quote][/color]
入门时很多人会被此问题困扰,实际上这就是传说中的HWM(Hign Water Mark)在搞鬼,顾名思义,最高水位,去Google上搜一下这个关键字,就知道缘由了。今天刚好客户让我评估一个 Resize Tablespace 的最佳方案,于是特地为HWM兜了条SQL语句出来存于此

[color=Green][code]select ff.file_id "File Id",
ff.file_name "File Name",
ff.tablespace_name || ' (' || ff.block_size || ')' "Tablespace Name",
ceil(ff.blocks * ff.block_size / 1024 / 1024) "Current(MB)",
ceil(nvl(max_hwm.hwm, 1) * ff.block_size / 1024 / 1024/1024) "Smallest(GB)",
ceil(((ff.blocks * ff.block_size) -
(nvl(max_hwm.hwm, 1) * ff.block_size)) / 1024 / 1024/1024) "Save(GB)"
from (select file_id,
file_name,
blocks,
ts.tablespace_name tablespace_name,
ts.block_size block_size
from dba_data_files f, dba_tablespaces ts
where f.tablespace_name = ts.tablespace_name
and ts.tablespace_name = 'SONIC_TBS') ff,
(select file_id, max(block_id + blocks - 1) hwm
from dba_extents
where tablespace_name = 'SONIC_TBS'
group by file_id) max_hwm
where ff.file_id = max_hwm.file_id(+)
order by ceil(((ff.blocks * ff.block_size) -
(nvl(max_hwm.hwm, 1) * ff.block_size)) / 1024 / 1024 / 1024);[/code][/color]

Powered by WordPress 3.3.1 CopyRight 2004~2012, Sonic Tang

虚拟主机赞助商:海波,苏ICP备11082989号

Suffusion theme by Sayontan Sinha