Move 表、索引、Lob、Long

 
Move表、索引、LOB / Long   [ zt ]




move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效。(LOB类型例外)

表move,我们分为:
* 普通表move
* 分区表move
* LONG ,LOB大字段类型move来进行测试和说明。

索引的move,我们通过rebuild来实现
SQL
>   select   *   from  v$version;
Oracle9i Enterprise Edition Release 
9.2 . 0.6 . 0   -  64 bit  Production
PL
/ SQL Release  9.2 . 0.6 . 0   -  Production
CORE 
9.2 . 0.6 . 0  Production
TNS 
for  Solaris: Version  9.2 . 0.6 . 0   -  Production
NLSRTL Version 
9.2 . 0.6 . 0   -  Production

一:move普通表、索引基本语法:
alter   table  tab_name move tablespace tbs_name;

move过的普通表,在不用到失效的索引的操作语句中,语句执行正常,但如果操作的语句用到了索引(主键当做唯一索引),则此时报告用到的索引失效,语句执行失败,其他如外键,非空约束,缺省值等不会失效。

我们需要重新创建主键或索引,基本语法为:
alter   index  index_name rebuild;
alter   index  pk_name rebuild;

如果我们需要move索引,则使用rebuild语法:
alter   index  index_name rebuild tablespace tbs_name;
alter   index  pk_name rebuild tablespace tbs_name;

提示:查询表所具有的索引,可以使用user_indexes视图(索引和主键都在这个视图里可找到)。

二:move分区表及索引和普通表一样,索引会失效,区别的仅仅是语法而已。

分区基本语法:特别提醒注意,如果是单级分区,则使用关键字PARTITION,如果是多级分区,则使用SUBPARTITION替代PARTITION。
如果分区或分区索引比较大,可以使用并行move或rebuild,PARALLEL (DEGREE 
2 );如:
ALTER   TABLE  PART_ALARMTEXTDATA move SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE  2 );
ALTER   INDEX  GLOBAL_ALARMTEXTDATA REBUILD tablespace users PARALLEL (DEGREE  2 );
ALTER   INDEX  LOCAL_ALARMTEXTDATA REBUILD SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE  2 );

移动表的某个分区:
================
ALTER   TABLE  tab_name move PARTITION partition_name TABLESPACE tbs_name;

重建全局索引:
================
ALTER   INDEX  global_index REBUILD;或
ALTER   INDEX  global_index REBUILD tablespace tbs_name;
[ xsb注: 分区操作时可以带上with update global indexes选项更新全局索引。 ]  

重建局部索引:
================
ALTER   TABLE  tab_name MODIFY PARTITION partition_name REBUILD UNUSABLE LOCAL INDEXES;或
ALTER   INDEX  local_index_name REBUILD PARTITION partition_name TABLESPACE tbs_name;

提示:
USER_PART_TABLES
USER_IND_PARTITIONS
USER_IND_SUBPARTITIONS
USER_LOB_PARTITIONS
USER_LOB_SUBPARTITIONS
USER_PART_INDEXES
USER_PART_LOBS可查询分区相关内容,同时,分区对象,也是segment,所以也可在dba_segments里查的到。

三:move 
LONG ,LOB类型(据说DBMS_REDEFINITION包可以提供一些方便,没用过。)

I:LONG类型
long类型不能通过MOVE来传输特别提示,尽量不要用LONG类型,特难管理。参考:http:
// www.anysql.net / 2005 / 12 / long_vs_lob.html
1 ,LONG不能使用insert  into  ...  select  ...等带select的模式。如
create   table  t123 (id  int ,en  long );则
insert   into  t123(id,en)  select   *   from  t123;报告错误,可以用pl / sql来帮助解决,如:
declare  
cursor  cur_t123  is   select   *   from  t123;
use_t123 cur_t123
% rowtype;
begin
open  cur_t123;
loop
fetch  cur_t123  into  use_t123;
exit   when  cur_t123 % notfound;
insert   into  t123(id,en)  values  (use_t123.id,use_t123.en);
end  loop;
close  cur_t123;
end ;
/

对有LONG类型字段的表的转移,可以使用:
create新表的方法。
*  create一个新的表,存储在需要转移的表空间。
*  创建新的索引(使用tablespace 子句指定新的表空间)。
*  把数据转移过来
方法一:用COPY的方法:
copy 
from  bigboar / bigboar @bigboar_sid   insert  t123(id,en) using  select  id,en  from  t123;
方法二:PL
/ SQL(如上)
方法三:直接就把LONG转换成CLOB类型
create   table  t321(id  int ,en clob) tablespace users; 
insert   into  t321(id,en)  select  id,to_lob(en)  from  t123; 
方法四:
exp / imp
exp  bigboar / bigboar  file = a.dat tables = t123
imp bigboar
/ bigboar  file = a.dat  full = y IGNORE  = y
*  drop掉旧表。
*  rename 新表为旧表表名。

II:LOB类型在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type
= LOBSEGMENT),另一个用来存放索引(segment_type = LOBINDEX)。默认它们会存储在和表一起的表空间。我们对表MOVE时,LOG类型字段和该字段的索引不会跟着MOVE,必须要单独来进行MOVE,语法如下如:
alter   table  t321 move tablespace users;
alter   table  t321 move lob(en) store  as  (tablespace users);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,备份含有longlong raw、blob、clob等大对象类型的时,可能会出现错误提示“非法数据类型long”或“非法数据类型long raw”等。这是因为在Oracle中,这些大对象类型的数据不同于普通的数据类型,需要特殊处理才能备份和恢复。 要备份含有大对象类型的,可以使用Oracle提供的exp和imp工具。具体步骤如下: 1. 确定需要备份的名和所在的schema。 2. 使用exp工具备份,命令格式如下: ``` exp userid=用户名/密码@数据库实例名 file=备份文件名.dmp tables=名 ``` 其中,`用户名`是数据库用户的名称,`密码`是用户的密码,`数据库实例名`是Oracle数据库的实例名,`备份文件名.dmp`是备份文件的名称,`名`是需要备份的的名称。 在备份过程中,如果提示“是否导出long列”,选择“是”,将long类型数据导出到单独的文件中。 3. 在恢复之前,需要先手动创建。可以使用如下命令: ``` create table 名(列定义); ``` 4. 在中插入数据。如果中有long类型的列,需要使用如下命令: ``` insert into 名(列名) values (empty_clob()); ``` 然后,使用如下命令将long类型数据插入到中: ``` declare v_clob clob; begin dbms_lob.createtemporary(v_clob, false); dbms_lob.fileopen(v_clob, 'long类型数据文件路径', 'r'); dbms_lob.loadfromfile(v_clob, 'long类型数据文件路径', dbms_lob.getlength(v_clob)); dbms_lob.fileclose(v_clob); update 名 set 列名 = v_clob where ...; dbms_lob.freetemporary(v_clob); end; ``` 其中,`long类型数据文件路径`是导出long类型数据的文件路径。 5. 使用imp工具恢复数据,命令格式如下: ``` imp userid=用户名/密码@数据库实例名 file=备份文件名.dmp full=y ``` 在恢复过程中,如果提示“是否导入long列”,选择“是”,将long类型数据导入到中。 通过以上步骤,可以备份和恢复含有大对象类型的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值