ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库对象迁移表空间

数据库对象迁移表空间

原创 Linux操作系统 作者:regonly1 时间:2010-07-27 10:40:29 0 删除 编辑
今天做了一个数据库对象的表空间迁移,因为怀疑现在的一个表空间有问题(建表报错,而建到另外表空间则正常)。实施的步骤是先创建另外一个表空间,命名为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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1138618