微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle 收缩表空间

参考文章

Oracle调整表空间大小——ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据

ORACLE 收缩表空间的数据文件

收缩表空间-ORA-03297错误解决

 个人文章

创建表空间时,设置了最大表空间32G,自动扩展。

测试过程中导入了大量的数据导致表空间文件扩展到最大值,后删除测试数据,发现表空间文件占用空间不会自动减少。

网上查找资料收缩表空间的大小,在此过程中遇到不少问题,记录一下。

1、收缩表空间

ALTER DATABASE TEMPFILE  ‘表空间文件  RESIZE 1024M

直接执行该语句,会报错ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据,原因是“数据文件空间并不是连续使用的,你只能resize到high water mark处,要想收回完整空余空间需要进行move操作”

2、查询表空间high water mak

--1、查询表空间

SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 MB,FILE_NAME,FILE_ID
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME=表空间
GROUP BY TABLESPACE_NAME,FILE_ID

--2、查询表空间high water mak

SELECT MAX(BLOCK_ID) FROM DBA_EXTENTS WHERE TABLESPACE_NAME=表空间 AND FILE_ID=文件ID;

MAX(BLOCK_ID)*8191/1024/1024/1024G即为能RESIZE到的空间(使用数据库块大小为8192字节)。

high water mak远远大于了实际使用的表空间,所以采用将该表空间A的数据move到另外一个表空间B,这个过程完成后会降低表空间A的high water mak,此时再对A进行收缩,收缩完成后,再将移动到B的数据move回来,最后删除B。

3、移动表空间

--1、 移动表

select disTINCT alter table || segment_name ||  move tablespace B; from dba_extents where segment_type=TABLE and file_id=12;

执行该sql生成移动表的sql语句,执行移动表的sql语句。

--2、 移动索引

select disTINCT alter index || segment_name ||  rebuild tablespace B; from dba_extents where segment_type=INDEX and file_id=12;

执行该sql生成移动索引的sql语句,执行移动索引的sql语句。

--3、移动分区表

select disTINCT alter table || segment_name ||  move partition || partition_name ||  tablespace B; from dba_extents where segment_type=TABLE PARTITION and file_id=12;

执行该sql生成移动分区表的sql语句,执行移动分区表的sql语句。

--4、移动LOB数据

alter table 表名 modify default attributes tablespace B; 
alter table 表名 move partition T1_分区1 lob(LOB列名1) store as (tablespace B);
alter table 表名 move partition T1_分区2 lob(LOB列名1) store as (tablespace B);

LOB数据比较特殊,需要用这种方式来移动表空间。

第一行修改该表认表空间,第二三行分别移动改表不同分区的LOB列数据。

4、收缩表空间

执行完第3步后,可执行第2步再次查看表空间A的high water mak,此时high water mak已经下降(有可能表空间已经没有数据,查不到MAX(BLOCK_ID))。

ALTER DATABASE TEMPFILE  ‘表空间文件  RESIZE 1024M

执行成功。

5、将移动到B的数据,move回表空间A。如果需要删除表空间B,执行

alter tablespace B offline;
drop tablespace B including contents and datafiles;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐