目的:收回目前没有使用过的表空间,减小数据文件大小。

难点:插入的历史数据可能分布在不同的磁盘位置上,所以无法确定resize datafile能不能成功执行。

解决方式:通过move一个tablespace上的所有对象到一个新的临时表空间上来降低表的hwm,从而减少数据占用的实际磁盘大小。

select tablespace_name,all_bytes,use_bytes, round(100*use_bytes/all_bytes,2),
free_bytes, round(100*free_bytes/all_bytes,2)
from(
select /*+ rule use_hash(a,b,c) */ a.tablespace_name,
c.bytes/1024/1024 all_bytes,
a.bytes/1024/1024 use_bytes,
b.bytes/1024/1024 free_bytes
from 
 (select tablespace_name,sum(bytes) bytes from dba_extents group by tablespace_name) a,
 ( select b.tablespace_name,sum(b.bytes) bytes from  dba_free_space b 
   group by b.tablespace_name
   ) b, 
(select tablespace_name,sum(bytes) bytes
from dba_data_files
group by tablespace_name) c 
where a.tablespace_name = b.tablespace_name
  and a.tablespace_name = c.tablespace_name
)

表空间

总大小

对象占用空间

占用比率

free大小

free比率

CTL

500

5.875

1.18

494.0625

98.81

CWMLITE

20

17.6875

88.44

2.25

11.25

DP23

10

2.5

25

7.4375

74.38

DRSYS

20

9.625

48.13

10.3125

51.56

DWD

4000

337.1875

8.43

3662.75

91.57

DWI

6144

212.1875

3.45

5931.625

96.54

EXAMPLE

139.375

138.9375

99.69

0.375

0.27

FBI

200

120.875

60.44

79.0625

39.53

OD

500

93.125

18.63

406.8125

81.36

ODM

20

9.3125

46.56

10.625

53.13

ODSD

22528

1737.8125

7.71

20789.5

92.28

ODSI

12288

835.9375

6.8

11451.69

93.19

RPTD

1024

100.5

9.81

923.4375

90.18

RPTI

1024

222

21.68

801.9375

78.31

SYSTEM

1040

1033.6875

99.39

6.25

0.6

TCLKING

5

4.875

97.5

0.0625

1.25

TODSD

10240

1212.0625

11.84

9027.625

88.16

TODSI

10240

401.1875

3.92

9838.5

96.08

UNDOTBS1

27055

731.578125

2.7

26323.19

97.3

USERS

82.5

82.375

99.85

0.0625

0.08

XDB

46.875

44.25

94.4

2.5625

5.47

测试步骤

1,  建立测试用表空间

SQL> create tablespace HWM

2  datafile '/oradata/HWM01.dbf' size 5000M;

2,  move table对索引的影响

首先,赋权给将需要move的用户DW。

SQL> alter user DW quota unlimited on HWM;

检查对象当前大小

select de.owner,de.segment_name,de.segment_type,de.tablespace_name,sum(de.blocks),sum(de.bytes)
from dba_extents de
where de.tablespace_name like 'DW_' and SEGMENT_name like '%CREDIT%'
group by de.owner,de.segment_name,de.segment_type,de.tablespace_name

用户

对象

类型

表空间

blocks

bytes

DW

F_CREDIT

TABLE

DWD

4736

38797312

DW

F_CREDIT_U1

INDEX

DWI

6400

52428800

2.1 移动普通表对象到新建表空间HWM

SQL> alter table F_CREDIT move tablespace HWM;

Move一个表到另外一个表空间时,索引不会跟着一块move,而且会失效。(LOB类型例外)

在创建失效的索引之前,使用到索引的查询语句将会报错。失效的索引需要使用rebuild来重现创建。

Alter index index_name rebuild;

Alter index pk_name rebuild;

如果我们需要move索引到另外一个表空间,则需要使用rebuild

Alter index index_name rebuild tablespace tbs_name;

Alter index pk_name rebuild tablespace tbs_name;

2.2 move分区表及索引

和普通表一样,索引也会失效,区别的仅仅是语法而已。

分区表move基本语法

如果是单级分区,则使用关键字partition,如果是多级分区,则使用subpartition替代partition。如果分区或分区索引比较大,可以使用并行move或rebuild,parallel(degree 2)。

select 'alter table '||owner||'.'||segment_name||' move partition ' ||partition_name||' tablespace HWM; ',bytes
 from dba_segments where segment_name = 'F_DISTRIBUTION'and segment_type = 'TABLE PARTITION'

alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P00 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P01 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P02 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P03 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P04 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P05 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P06 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P07 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P08 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P09 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P10 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P11 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P12 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_P13 tablespace HWM; 
alter table DW.F_DISTRIBUTION move partition F_DISTRIBUTION_PMAX tablespace HWM;

重建全局索引

Alter index global_index rebuild;

Alter index global_index rebuild tablespace tbs_name;

重建局部索引

Alter table tab_name modify partition partition_name rebuild unusable local indexes;

Alter index local_index_name rebuild partition partition_name tablespace tbs_name;

提示:
USER_PART_TABLES
USER_IND_PARTITIONS
USER_IND_SUBPARTITIONS
USER_LOB_PARTITIONS
USER_LOB_SUBPARTITIONS
USER_PART_INDEXES
USER_PART_LOBS
可查询分区相关内容,同时,分区对象,也是segment,所以也可在dba_segments里查的到。

三:move LONG,LOB类型
据说DBMS_REDEFINITION包可以提供一些方便,没用过。
IONG类型
long类型不能通过MOVE来传输
特别提示,尽量不要用LONG类型,特难管理。
参考:http://www.anysql.net/2005/12/long_vs_lob.html
1,LONG不能使用insert into ... select ...等带select的模式。

create table t123 (id int,en long);

insert into t123(id,en) select * from t123;
报告错误,可以用pl/sql来帮助解决,如:
declare 
cursor cur_t123 is select * from t123;
use_t123 cur_t123%rowtype;
begin

open cur_t123;
loop
fetch cur_t123 into use_t123;
exit when cur_t123%notfound;

insert into t123(id,en) values (use_t123.id,use_t123.en);

end loop;
close cur_t123;

end;
/

对有LONG类型字段的表的转移,可以使用:
create新表的方法。
* create一个新的表,存储在需要转移的表空间。
* 创建新的索引(使用tablespace 子句指定新的表空间)。
* 把数据转移过来
方法一:用COPY的方法:
copy from bigboar/bigboar@bigboar_sid insert t123(id,en) using select id,en from t123;
方法二:PL/SQL(如上)
方法三:直接就把LONG转换成CLOB类型
create table t321(id int,en clob) tablespace users; 
insert into t321(id,en) select id,to_lob(en) from t123; 
方法四:exp/imp
exp bigboar/bigboar file=a.dat tables=t123
imp bigboar/bigboar file=a.dat full=y IGNORE =y
* drop掉旧表。
* rename 新表为旧表表名。

IOB类型
在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type=LOBSEGMENT),另一个用来存

放索引(segment_type=LOBINDEX)。默认它们会存储在和表一起的表空间。
我们对表MOVE时,LOG类型字段和该字段的索引不会跟着MOVE,必须要单独来进行MOVE,语法如下如:
alter table t321 move tablespace users;
alter table t321 move lob(en) store as (tablespace users);

3,对一个表空间下的所有数据执行move table

CTL表空间的文件

使用movetable收缩表空间相关推荐

  1. oracle如何收缩表空间,ORACLE收缩表空间

    最近导一个空库到数据库后,发现占用的表空间非常大,执行表收缩(SHRINK SPACE CASCADE)后,发现实际占用的空间不到1%. 但是收缩表空间大小提示错误     ALTER DATABAS ...

  2. Oracle 收缩表空间一例

    备注: Oracle 11.2.0.4 文章目录 一. 需求 二. 解决方案 2.1 清理过期数据 2.2 收缩表空间 2.3 清理表碎片 2.4 直接把相关的表drop掉 2.5 把该表空间下其它的 ...

  3. oracle 默认表空间 10g,oracle 10G 收缩表空间

    如果经常在表上执行DML操作,会造成数据库块中数据分布稀疏,浪费大量空间.同时也会影响全表扫描的性能,因为全表扫描需要访问更多的数据块.从oracle10g开始,表可以通过shrink来重组数据使数据 ...

  4. mysql刷脏页的原理_Mysql脏页flush及收缩表空间原理解析

    mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过 ...

  5. hujingwei oracle_Oracle收缩表空间

    可以使用 alter database datafile 'file path...' resize xM 的命令来缩小数据文件. SELECT 'alter database datafile '' ...

  6. oracle如何收缩表空间文件,ORACLE 收缩表空间的数据文件

    方法一: 在实际的应用中经常会遇到TRUNCATE或者DELETE表中的数据后发现表空间并没有将空间进行释放,磁盘空间被告占用感觉空间白白被浪费掉了. 通过下面的SQL语句查看表空间总大小及实用大小, ...

  7. MySQL的表空间管理

    表空间: MySQL没有真正意义上的表空间管理. MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间. 一般来说,当数据量很小的时候建议使用共享表空间的管理方式. ...

  8. Oracle-临时表空间(组)解读

    以前的整理 哪些情况下的操作会使用到临时表空间 首先我们要明确下哪些情况下的操作会使用到临时表空间: 排序操作 比如select或dml(ddl)语句中包含order by之类; create ind ...

  9. [InnoDB系列] - InnoDB释放表空间

    前言:设置启动选项 innodb_file_per_table 即可启用独立表空间.不过,InnoDB总是需要共享标空间,.ibd文件对InnoDB不足以去运行,共享表空间包含熟悉的ibdata文件, ...

最新文章

  1. Apriori算法进行关联分析实战
  2. Genome Biology | 药物基因组学数据库
  3. IntelliJ IDEA 2018.1新特性
  4. kafka0.11.0.2安装 笔记
  5. java map key是否存在_java中如何判断map集合中是否存在key
  6. 【重难点】【JVM 03】CMS、G1、ZGC
  7. react组件卸载调用的方法_React调用子组件方法与命令式编程误区
  8. 代理服务器反向代理varnish配置文件解析
  9. 记录一次配置unix网络编程环境的过程和遇到的问题
  10. Android 学习JNI,用JAVA调用C
  11. Centos7 Putty SSH密钥登录
  12. Centos查看系统版本
  13. matlab gui系统设计,matlabgui系统设计
  14. 证明同步函数使用的this锁
  15. solidworks图纸模板添加_「solidworks工程图模板」solidworks怎么添加置工程图模板? - seo实验室...
  16. JSESSIONID 作用
  17. C++ 复数计算器 简单代码
  18. 固态硬盘linux提升,固态硬盘在Linux系统下提升使用率妙方
  19. Unity3d+百度AI 实现摄像头画面实时手势识别
  20. erfc函数、persistent、turbo码

热门文章

  1. 如何比较 Java 的字符串
  2. unity editor下选中GameObject粘贴复制pos信息
  3. ajax如何实现、readyState五中状态的含义
  4. Java面试总结系列之Collections.sort()
  5. iOS 在类实现定义中声明成员变量的怪异方式
  6. java collections读书笔记(4) stack
  7. [Serializable]序列化一句话理解
  8. 闲谈StringBuilder
  9. linux C++ 多线程编程
  10. ubuntu下vim + ctags + taglist配置和使