move迁移表

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;
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值