电脑空间不够用了,发现本机的表空间数据文件有点儿大,想缩减下,看了下使用率,10G的普通表空间用了500M,6G的user表空间用了50M,
于是查询:
alter database datafile 'D:\ORACLE\ORADATA\ORCL\test01.DBF' resize 512M;
这条语句用在普通表空间上奏效了,但是用在user上报错了
alter database datafile 'D:\ORACLE\ORADATA\ORCL\USERS01.DBF' resize 512M;
ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
什么鬼?
于是找度娘几番搜寻找到了解决方法。
1. 查询文件对应的文件号
select file#,name from v$datafile;
找到对应file#,我的是4号文件
(有一说移动表前先对表空间做整理:alter tablespace ic_data coalesce;)
2. 在dba_extents找到与ID=4的数据文件相关的表及索引
select segment_name,partition_name,segment_type from dba_extents where file_id=4;
3.对id=4的文件上的表和索引移动位置
将需缩小表空间上的内容转移到user_test表空间中
--需移动的表数据
select DISTINCT 'alter table '|| owner||'.'||segment_name || ' move tablespace user_test;' from dba_extents where segment_type='TABLE' and file_id=4;
--需移动的索引数据
select DISTINCT 'alter index '|| owner||'.'|| segment_name || ' rebuild tablespace user_test;' from dba_extents where segment_type='INDEX' and file_id=4;
--需移动的分区表数据
select DISTINCT 'alter table '|| owner||'.'|| segment_name || ' move partition '|| partition_name || ' tablespace user_test;' from dba_extents where segment_type='TABLE PARTITION' and file_id=4;
--需移动的分区表索引数据
select DISTINCT 'alter index '|| owner||'.'|| segment_name || ' rebuild partition '|| partition_name || ' tablespace user_test;' from dba_extents where segment_type='INDEX PARTITION' and file_id=4;
4.执行以上查到的对应sql即可
5.执行缩小命令,问题解决
alter database datafile 'D:\ORACLE\ORADATA\ORCL\USERS01.DBF' resize 512M;
参考:
https://www.cnblogs.com/wenlong/archive/2011/10/22/2221025.html
https://blog.youkuaiyun.com/u013551961/article/details/73939236