今天做了一个数据库对象的表空间迁移,因为怀疑现在的一个表空间有问题(建表报错,而建到另外表空间则正常)。实施的步骤是先创建另外一个表空间,命名为htable2,将原表空间的所有对象迁移到此。
通过如下SQL生成迁移语句:
select s.owner, s.segment_name, s.partition_name, s.tablespace_name,
case s.segment_type
when 'TABLE' then 'alter table ' || s.owner || '.' || s.segment_name || ' move tablespace fund_htable;'
when 'INDEX' then
case d.iot_type
when 'IOT' then 'alter table ' || d.owner || '.' || d.table_name || ' move tablespace fund_htable'
else 'alter index ' || s.owner || '.' || s.segment_name || ' rebuild tablespace fund_htable;' end
when 'TABLE PARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move partition ' || s.partition_name || ' tablespace fund_htable;'
when 'TABLE SUBPARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move subpartition ' || s.partition_name || ' tablespace fund_htable;'
end ss
from dba_segments s,
(select ind.index_name, ind.owner, dt.iot_type, dt.table_name
from dba_indexes ind, dba_tables dt
where ind.owner = dt.owner
and ind.table_name = dt.table_name
and dt.iot_type = 'IOT') d
where d.index_name(+) = s.segment_name
and d.owner(+) = s.owner
and s.tablespace_name = 'FUND_HTABLE';
此语句可以生成将以上几种类型的数据库对象迁移到目标表空间的SQL语句。
其中IOT表的情况比较特殊,是直接迁移表而不是迁移主键索引来实现。而表没有实际的segment,因此通过dba_indexes进行关联,再将表进行move tablespace。
然后删除原表空间:
drop tablespace htable;
由于9i没有重命名表空间的功能,所以只好再创建一个htable表空间,然后将htable2上的对象迁移到此(还是用上面的脚本迁移)
再将htable2表空间删除:
drop tablespace htable2 including contents and datafiles;
差不多工作已经完成,除了还有一个无用的数据文件还未删除。
这个数据文件就是原来htable下的那个。现在麻烦了,好像不能直接删除:
alter database datafile 'xxx' offline drop;
这个命令只是把文件给offline,但是在控制文件中还是存在的(虽然启动的时候也不会去检查),因此不能直接从操作系统上将此文件直接删除。
那怎么办呢?我绕了一圈,首先创建一个表空间,重用该数据文件,然后再用including contents and datafiles选项删除该表空间,就去掉这个文件了:
drop tabelspace temm including contents and datafiles;
另外,如何重命名表空间呢?
10g里面,有如下命令:
alter tablespace xxx rename to yyyy;
9i下没有这样的命令。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12932950/viewspace-669577/
,如需转载,请注明出处,否则将追究法律责任。