1.move要做什么
把原表空间的所有表移动到新的表空间
要求
新的表空间不能小于原来的表空间
2.
原表空间
TEST
新表空间
NEWTEST
SELECT OWNER AS OWNER
,SEGMENT_NAME AS SEGMENT_NAME
,SEGMENT_TYPE AS SEGMENT_TYPE
,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME='TEST'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
ORDER BY 4;
查询原表空间的对象---为move迁移做准备
col OWNER for a20
col SEGMENT_NAME for a45
col SEGMENT_TYPE for a20
set linesize 300
set pagesize 500
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='NEWTEST'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
ORDER BY 4;
查询某个表空间的对象---为move迁移做准备
SEGMENT_TYPE有:
INDEX
TABLE
LOBSEGMENT
TABLE PARTITION
INDEX PARTITION
只查询table , index,lob 三种
SELECT OWNER AS OWNER
,'TABLE' AS SEGMENT_TYPE
,TABLE_NAME AS SEGMENT_NAME
FROM DBA_TABLES
WHERE TABLESPACE_NAME='TEST'
UNION ALL
SELECT OWNER AS OWNER
,'INDEX' AS SEGMENT_TYPE
,INDEX_NAME AS SEGMETN_NAME
FROM DBA_INDEXES
WHERE TABLESPACE_NAME='TEST'
UNION ALL
SELECT OWNER AS OWNER
,'LOBSEGMENT' AS SGEMENT_TYPE
,SEGMENT_NAME AS SEGMENT_NAME
FROM DBA_LOBS
WHERE TABLESPACE_NAME='TEST';
3.
move分区表
select 'alter table '||TABLE_OWNER||'.'||table_name||' move partition '||partition_name||' tablespace NEWTEST;' from dba_tab_partitions where table_name ='ID_ONEIDX_MK' and TABLESPACE_NAME='TEST'
命令类似
alter table OMC_DET_OWNER.ID_ONEIDX_MK move partition ONEIDX_2016_08 tablespace NEWTEST;
'||TABLE_OWNER||'.'||table_name||'=TABLE_OWNER.table_name
||之间的内容是从dba_tab_partitions where table_name ='ID_ONEIDX_MK' and TABLESPACE_NAME='TEST';查出来的 ||
条件为table_name ='ID_ONEIDX_MK' and TABLESPACE_NAME='TEST'里面的分区表 移动到表空间NEWTEST里
move 普通表
select 'alter table '||OWNER||'.'||SEGMENT_NAME||' move tablespace NEWTEST;' FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='NEWTEST' and SEGMENT_TYPE='TABLE';
可以生成类似如下的命令
alter table SG_BAM.PUB_DOC_CONTENT move tablespace NEWTEST;
但是如果move表要从小到大的顺序来的话,就不太合适
就需要
1.查原表空间的所有table类型的表
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='NEWTEST' and SEGMENT_TYPE='TABLE'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
ORDER BY 4;
然后用excel表拼接出move命令
A B C D E
添加固定的 OWNER 添加固定的 SEGMENT_NAME 添加固定的 最终命令(=A2&&B2&&C2&&D2&&E2)
alter table CALC_OWNER . D_IDX_TIME move tablespace NEWTEST; alter table CALC_OWNER.ID_IDX_TIME move tablespace NEWTEST;
然后分批创建脚本
例如500条命令为一批
vi 1.sql
把命令添加进来
执行:
SYS@oraods SQL> @/home/oracle/table715/1.sql
执行/home/oracle/table715/目录下的1.sql
move lob字段表
Lob段(LobSegment)对应的是存放在数据表lob列上的数据。在Oracle的lob类型数据列,有两种保存位置结构。一个是in-row storage,也就是每一行的lob数据同其他列的数据以行的形式一起保存在数据块中。这种情况的lob列取值较小。而另一种为out-of-row storage,当lob对象较大,不能保存在一个数据块中时,可以将其放置在一个独立lobsegment中进行保存。而out-of-row storage时数据行中lob列上保存的只是一个指向lobsegment对应位置的指针引用。
Lob索引段(LobIndex)是Oracle为每一个lob类型列强制生成的索引,主要作用是用于进行lob类型数据检索加速的操作。Lobindex与lob列共生,如果强制进行删除操作,是会报错的。
查原表空间的所有LOBSEGMENT类型的表
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='NEWTEST' and SEGMENT_TYPE LIKE'%LOB%'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
ORDER BY 4;
例如查到SEGMENT_NAME='SYS_LOB0000618642C00036$$
lob查询
select owner,table_name,column_name,tablespace_name,index_name from dba_lobs where SEGMENT_NAME='SYS_LOB0000618642C00036$$';
OWNER TABLE_NAME COLUMN_NAME TABLESPACE INDEX_NAME
---------- ------------------------------ -------------------- ---------- ------------------------------
SG_BAM PLAN_TABLE OTHER_XML TEST SYS_IL0000618642C00036$$
命令类似
alter table SG_BAM.PLAN_TABLE move lob(OTHER_XML) store as (tablespace NEWTEST);
拼接命令 即这个TEST表空间下的所有lob 移动到这个NEWTEST表空间
select 'alter table '||owner||'.'||table_name||' move lob('||column_name||') store as (tablespace NEWTEST);' from dba_lobs where TABLESPACE_NAME='TEST';
如果move过程中有报错没关系,只要命令没问题,把错误记录下来,先把所有需要move的表执行一次,然后去原表空间查看哪些没已过去
拷贝出来继续move
重建索引 因为move后索引失效需要重建
select 'alter index '||owner||'.'||index_name || ' rebuild tablespace NEWTEST parallel 8;' from dba_indexes where status='UNUSABLE' and (table_owner,table_name) in (select distinct table_owner,table_name from dba_indexes where tablespace_name='TEST' and status='UNUSABLE');
结果类似这样
alter index SG_BAM.PK_BAM_VIOC_VIORULEDETAIL rebuild tablespace NEWTEST parallel 8;