在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放lob数据,另一个用来存放lob索引,并且它们都会存储在对应表指定的表空间中。但是当我们用alter table tb_name move tablespace tbs_name; 对表做表空间之间迁移时只能迁移非lob字段以外的segment,而如果要在移动表数据同时移动lob相关字段,就必需用如下的含有特殊参数据的文句来完成:
alter table tb_name move tablespace tbs_name lob (column_lob1,column_lob2) store as(tablesapce tbs_name);实验如下:
C:\>set ORACLE_SID=icmnlsdb
C:\>sqlplus /nolog
SQL*Plus: Release 9.2.0.8.0 - Production on 星期五 6月 13 16:52:08
2008Copyright (c) 1982, 2002,
Oracle Corporation. All rights reserved.
SQL> conn / as sysdba;
已连接。
SQL> select file_name from dba_data_files;
FILE_NAME
-----------------------------------------------------------------------
D:\ORACLE\ORA92\ICMNLSDB\SYSTEM01.DBF
D:\ORACLE\ORA92\ICMNLSDB\UNDOTBS01.DBF
D:\ORACLE\ORA92\ICMNLSDB\INDX01.DBF
D:\ORACLE\ORA92\ICMNLSDB\TOOLS01.DBF
D:\ORACLE\ORA92\ICMNLSDB\USERS01.DBF
D:\ORACLE\ORA92\ICMNLSDB\ALAN.DBF
D:\ORACLE\ORA92\ICMNLSDB\MYCR.DBF
D:\ORACLE\ORA92\ICMNLSDB\LMT.DBF
D:\ORACLE\ORA92\ICMNLSDB\PERFSTAT.DBF
D:\ORACLE\ORA92\ICMNLSDB\MYTEXT01.DBF
已选择10行。
SQL> create tablespace HJP
2 datafile 'D:\ORACLE\ORA92\ICMNLSDB\hjp.dbf' size 100M
3 autoextend on
4 next 10M
5 maxsize unlimited;
表空间已创建。
SQL> conn alan/passw0rd@abc
已连接。
SQL> select segment_name,segment_type
2 from dba_segments
3 where wner='ALAN';
未选定行
SQL> create table test_lob
2 (id blob,
3 name clob);
表已创建。
SQL> select segment_name,segment_type,tablespace_name
2 from dba_segments
3 where wner='ALAN';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ --------------------
TEST_LOB TABLE USERS
SYS_IL0000026875C00001$$ LOBINDEX USERS
SYS_IL0000026875C00002$$ LOBINDEX USERS
SYS_LOB0000026875C00001$$ LOBSEGMENT USERS
SYS_LOB0000026875C00002$$ LOBSEGMENT USERS
SQL> alter table test_lob move tablespace hjp;
表已更改。
SQL> select segment_name,segment_type,tablespace_name
2 from dba_segments
3 where wner='ALAN';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------
TEST_LOB TABLE HJP
SYS_IL0000026875C00001$$ LOBINDEX USERS
SYS_IL0000026875C00002$$ LOBINDEX USERS
SYS_LOB0000026875C00001$$ LOBSEGMENT USERS
SYS_LOB0000026875C00002$$ LOBSEGMENT USERS
这里lob段并没有移动到指定的tablespace去。因此需要额外的命令进行移动
SQL>
alter table test_lob move tablespace hjp lob(id,name) store as(tablespace hjp);表已更改。
SQL> select segment_name,segment_type,tablespace_name
2 from dba_segments
3 where wner='ALAN';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
TEST_LOB TABLE HJP
SYS_IL0000026875C00001$$ LOBINDEX HJP
SYS_IL0000026875C00002$$ LOBINDEX HJP
SYS_LOB0000026875C00001$$ LOBSEGMENT HJP
SYS_LOB0000026875C00002$$ LOBSEGMENT HJP