Welcome 微信登录

首页 / 数据库 / MySQL / Oracle表空间收缩方案

应用背景:
某些情况下,由于前期设计上没有考虑全面,导致表空间预建太大,远远超出实际使用大小。于是,就出现了收缩表空间这样的需求,即将这个表空间的占用空间进行收缩。
 
处理方案:
对于表空间收缩,Oracle只提供扩大的功能,而不提供收缩。所以,要实现这样的要求,就只能先创建一个中间表空间,然后将待收缩表空间中的数据迁移到这个表空间下
 
处理方法:
1、找出该表空间下的所有数据对象;
select segment_type, partition_name, segment_name from dba_segments;
 
2、创建目标空间(不强制创建,但是建议)。
create tablespace dbs_temp datafile "d:dbs_temp01.dbf" size 100m;
 
3、根据对象类型重建或转移对应数据;
对于table:
alter table xx move tablespace dbs_temp;
对于partition table:
alter table xx move partition xx1 tablespace dbs_temp;
对于index:
alter index ixx rebuild tablespace dbs_temp;
对于lob字段:
alter table xx move lob(col_name) store as (tablespace dbs_temp);一般情况下,下面语句基本可以涵盖所有的数据对象了:
select segment_type, segment_name, partition_name,
       case segment_type
       when "TABLE" then "alter table " || owner || "." || segment_name || " move tablespace dbs_temp;",
       when "INDEX" then "alter index " || owner || "." || segment_name || " rebuild tablespace dbs_temp;",
       when "INDEX PARTITION" then "alter index " || owner || "." || segment_name || " rebuild tablespace dbs_temp;",
       when "TABLE PARTITION" then "alter table " || owner || "." || segment_name || " move partition " || partition_name || "tablespace dbs_temp;" sqltext
  from dba_segments
 where tablespace_name = "FUND_TABLE"
   and segment_type not like "LOB%";
 
下面是迁移lob字段的
select table_name, column_name, "alter table " || owner || "." || table_name || " move lob(" || column_name || ") store as(tablespace dbs_temp);" sqltext
  from dba_lobs
 where tablespace_name = "FUND_TABLE";
 
4、删除清空后的表空间;
drop tablespace dbs_old including contents and datafiles;
下面步骤简单了,就不一一列举。
 
5、如果对表空间名称有要求,则使用原来的表空间名再次创建一个合适大小的表空间。6、将目标表空间中的数据再迁移回新建的最终的表空间。Oracle性能问题诊断一例Oracle group by的按照不同粒度聚合方法相关资讯      Oracle表空间 
  • 关于Oracle可传输表空间的总结  (今 20:12)
  • Aix下删除Oracle表空间以及对应的  (04月17日)
  • Oracle表空间过大时候的处理  (10/27/2015 20:42:50)
  • Oracle删除表空间遇到的问题及解决  (04月17日)
  • Oracle使用SQL传输表空间  (03月01日)
  • Oracle 设置表空间自增长  (10/09/2015 11:42:07)
本文评论 查看全部评论 (0)
表情: 姓名: 字数