迁移long类型对象

在帮客户进行数据库巡检时发现,客户的库是从8i升级到9i的,因此,很多表空间仍然使用了原有的字典管理表空间模式,而这种模式的空间管理性能很差,因此建议客户将这些表空间全部换成本地管理的表空间,经过沟通,客户也认可此建议,因此,今晚开始实施。
实施之前,对整个数据库进行了备份,这是传统,也是本能(希望以后做dba的朋友们也能养成这样的习惯,当然,这次的备份倒是没派上什么用处)
丢弃字典管理表空间换成本地管理倒也不难,新创建本地管理表空间,然后把原来字典管理表空间上的存储对象移动过来就是了,对于表可以使用move,对于索引可以使用rebuild。
一切都很顺利,直到遇到了long类型字段。在move一个table时遇到了一个错误,这个表包含了long类型字段,因此无法直接move到新的位置,此时的处理方式大概有下面几个:
1、如果表中没有数据,呵呵,最简单的情况,可以直接将该表的定义用dbms_metadata.get_ddl取出,然后将表删除,修改刚才取出的ddl语句中的表空间名称定义,然后重新创建表在新的表空间上即可。当然,有数据这样作就不一定合适了
2、用exp导出,然后将原表删除,创建表到本地管理表空间上,然后导入数据,在导入的时候使用选项ignore=y(因为表已经存在)
也可以在导入之前将用户的默认表空间指向新的本地管理表空间,并且将原字典管理表空间的quota设置为0,导入也会将表生成在新的表空间上
3、在新表空间上创建出新表,使用sqlplus中的copy命令将原表数据插入新表,然后删除原表,再将新表名改为原表名(当然表上相关的索引、约束、触发器的定义要事先保存好,以便重建)。例如:
SQL> create table test(c1 varchar2(20),c2 long);

表已创建。

SQL> insert into test values('abc','abc');

已创建 1 行。

SQL> commit;

提交完成。

SQL> create table test1
2 as
3 select * from test;
select * from test
*
ERROR 位于第 3 行:
ORA-00997: 非法使用 LONG 数据类型

SQL> create table test1
2 (c1 varchar2(20),c2 long)
3 tablespace users;

SQL> copy from hr/hr@ora9i INSERT test1 using select * from test;

数组读取/结合的大小为15。(数组大小为15)
将在完成时提交。(提交的复本为 0)
最长为80。(长度为80)
1行选自hr@ora9i
1行被插入TEST1。
1行已提交至TEST1(位于DEFAULT HOST连接)。

SQL> drop table test;

表已丢弃。

SQL> rename test1 to test;

表已重命名。

4、将long类型数据修改为lob类型(Oracle也建议以后用lob取代long,但需要考虑对应用是否有影响),然后再执行move
SQL> alter table test move tablespace users;
alter table test move tablespace users
*
ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型

SQL> alter table test modify(c2 clob);

表已更改。
SQL> create table test2
2 as
3 select * from test;

表已创建。
SQL> alter table test move tablespace users;

表已更改。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20034375/viewspace-1003858/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20034375/viewspace-1003858/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值