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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |