`
isiqi
  • 浏览: 16039853 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

不同类型的数据跨表空间迁移的解决办法

阅读更多

Oracle10g数据跨表空间迁移

因某些开发人员由于对oracle数据库理解的不够深入,往往在建表的时候指定了当前用户非默认的表空间,这样就导致了在exp及imp等操作时候问题很多,因此需要将这些表及相关的数据迁移回当前用户的默认表空间里.Oracle10g数据数据库提供了一个Move命令可以把这样的数据对象进行跨表空间的迁移,也可以对含有BLOB、CLOB这样的二进制大字段的表进行move。但是Move命令不支持含Long型字段的数据表,针对这种情况,我们还可以使用copy命令来进行数据迁移,后面会提到,在此不详细说明。

首先我们需要查出表空间名及相关信息
select username,default_tablespace from dba_users where default_tablespace not in ('SYSAUX','SYSTEM','USERS');
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
YDMM YDMM
YDSK YDSK


查询不同表空间的所有者及包含的数据对象
select distinct owner from dba_extents where tablespace_name='YDMM';
OWNER
---------
YDMM
YDSK

select distinct owner from dba_extents where tablespace_name='YDSK';
OWNER
---------
YDSK

从上面我们可以发现YDMM表空间还存放了YDSK用户的数据,接下来我们就来找出YDSK用户在YDMM表空间存在的数据对象,并将YDSK用户下的所有数据对象进行迁移到它对应的默认表空间YDSK里面去
select owner,segment_name,partition_name,segment_type from dba_segments where tablespace_name='YDMM' and owner='YDSK';

一般经常碰到的segment_type主要有TABLE,INDEX,TABLE PARTITION,INDEX PARTITION,LOBSEGMENT,LOBINDEX,LOB PARTITION等,下面我们就针对这些类型的数据段进行迁移
--移动表T1到YDSK表空间里
alter table T1 move tablespace YDSK;
--移动T1表的索引idx_t1到YDSK表空间里
alter index idx_t1 rebuild tablespace YDSK;
--移动含有BLOB、CLOB的字段的表T2到YDSK表空间
alter table T2 move tablespace YDSK lob(BLOB1,BLOB2) store as (tablespace YDSK); /其中BLOB1,BLOB2是表T2中包含的blob字段,CLOB类似,
移动BLOB、CLOB的字段语法
--alter table table_name move [tablespace tbs_name] lob(lob_field1,lob_field2) store as (tablespace new_tbs_name);
--如果LOB字段在分区表中,则增加partition关键字,如
--alter table table_name move [partition partname] [tablespace tbs_name] lob(field) store as (tablespace new_tbs_name);

当然,如果存在很多数据对象,我们可以通过构建SQL脚本的方式来进行迁移
根据上面所列的数据段类型,构造数据对象跨表空间的move命令语句如下。
set heading off;
set echo off;
set feedback off;
set termout on;
spool /home/oracle/move_table.sql;
--移动表
select distinct 'alter table YDSK.'|| segment_name || ' move tablespace YDSK;' from dba_extents where segment_type='TABLE' and tablespace_name='YDMM' and owner='YDSK';
--移动索引
select distinct 'alter index YDSK.'|| segment_name || ' rebuild tablespace YDSK;' from dba_extents where segment_type='INDEX' and tablespace_name='YDMM' and owner='YDSK';
--如果有分区表则需要移动分区表和分区表索引
--移动分区表
select distinct 'alter table YDSK.'|| segment_name || ' move partition '|| partition_name || ' tablespace YDSK;' from dba_extents where segment_type='TABLE PARTITION' and tablespace_name='YDMM' and owner='YDSK';
--移动分区索引
select distinct 'alter index YDSK.'|| segment_name || ' rebuild partition '|| partition_name || ' tablespace YDSK;' from dba_extents where segment_type='INDEX PARTITION' and tablespace_name='YDMM' and owner='YDSK';

spool off;
以sys/system身份登录数据库,就可以执行执行move_table.sql来进行数据的迁移了。

前面提到了Move命令不支持含Long型字段的数据表,那么我们该如何对这样的表进行迁移了?其实很简单,就是用一个copy命令,下面我们来看下copy命令的用法与优点:
COPY命令语法如下:
COPY FROM user/password@dbname1 TO user/password@dbname2 CREATE/APPEND/INSERT/REPLACE TABLE_NAME (COLUMN_NAME, ……) USING SELECT * from table_name;
简单地来描述一下上面语法中各子句的含义:
FROM和TO语句:分别描述从哪个数据库COPY到哪个数据库,FROM或TO指向当前数据库时,可以忽略,但不能同时忽略FROM和TO。
CREATE/APPEND/INSERT/REPLACE:COPY命令的四个选项,功能分别为创建表并插入数据/在已经存在的表的记录后面插入新数据/在空表中插入数据/删除表然后重建新表并插入新数据。
TABLE_NAME (COLUMN_NAME, ……):复制后的表名和列名,如果列名列表省略的话,则会根据后面查询语句来确定列的名称。
USING SELECT * from table_name:将该表查询的结果按照指定方法写入到前面的表中。

COPY命令的的几个主要优点:
1、支持LONG类型:由于CREATE TABLE AS和INSERT INTO SELECT都不支持LONG类型。这就导致了对LONG类型数据的处理十分麻烦,而使用存储过程的方法相对比较麻烦,利用EXP和IMP则有很多的限制条件。相对来说使用COPY是最简单快速的方法。
2、不需要建立数据库链,只要本地的TNSNAMES.ORA中配置了远端数据库就可以直接访问。操作方便快捷。而且也支持本数据库到本数据库的COPY。
3、语法灵活,支持目标表名列名与查询语句中不相符,而且还有多种数据处理方式。

下面我们将做一个简单的例子来进行copy的具体操作。(T3是含有long型字段的表)
创建一个含有long型字段的表T3
SQL> CREATE TABLE T3 (ID NUMBER, DEFAULT_VALUE LONG);
通过create table的方式进行复制
SQL> CREATE TABLE T AS SELECT * FROM T3;
CREATE TABLE T AS SELECT * FROM T3
*
ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型

通过insert into的方式进行复制
SQL> CREATE TABLE T (ID NUMBER, DEFAULT_VALUE LONG);
SQL> INSERT INTO T SELECT ID, DATA_DEFAULT FROM T3;
INSERT INTO T SELECT ID, DATA_DEFAULT FROM T3
*
ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型
从上面看,使用常用的表复制方式的不行的,下面我们来使用copy命令进行复制
SQL> DROP TABLE T;
表已丢弃。
SQL> COPY FROM YDMM/YDMM@ORCL TO YDSK/YDSKK@ORCL CREATE T USING SELECT * FROM T3;
数组读取/结合的大小为15。(数组大小为15)
将在完成时提交。(提交的复本为 0)
最长为80。(长度为80)
表T已创建。
0行选自YDMM@ORCL
0行被插入T。
0行已提交至T(位于YDSK@ORCL)。

其中每次读取数据数组大小有SET的ARRAYSIZE参数决定。每次提交的数据量由SET的COPYCOMMIT参数控制。COPY是否进行类型检查由SET的COPYTYPECHECK参数控制。COPY执行时LONG类型截取长度由SET的LONG参数控制。如果不希望LONG类型被截断,则保证LONG的值超过表中LONG类型的最长值。
SQL> SET ARRAYSIZE 1000
SQL> SET COPYCOMMIT 1000
SQL> SET COPYTYPECHECK OFF
SQL> SET LONG 100000
SQL> COPY FROM YDMM/YDMM@ORCL TO YDSK/YDSKK@ORCL CREATE T USING SELECT * FROM T3;
数组读取/结合的大小为1000。(数组大小为1000)
将在每1000个数组结合之后提交。(提交的复本为1000)
最长为100000。(长度为100000)
0行选自YDMM@ORCL
0行被插入T。
0行已提交至T(位于YDSK@ORCL)。

在使用COPY命令时,尽量只对用户自己的表进行操作。如果需要对其他用户下的表执行REPLACE操作时,仅仅拥有这个表的INSERT、DELETE权限是没有任何作用的,必须拥有CREATE ANY TABLE、DROP ANY TABLE和INSERT ANY TABLE系统权限。

分享到:
评论

相关推荐

    oracle详解

    表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成Dmp文件,这在有些时候是非常管用的,因为传输表空间移动数据就象复制...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    12.7.3跨平台数据迁移 12.7.4可传输表空间 12.7.5使用RMAN工具复制数据库 12.8本章小结 第13章 RAC恢复 13.1恢复技术基础 13.1.1恢复解决方案 13.1.2 SCN时间机制 13.1.3日志线程与联机Redo日志 13.1.4 ...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    MongoDB分片在部署与维护管理中常见的事项总结大全

    前言 分片(sharding)是MongoDB将大型集合分割到不同服务器(或者说集群)上所...大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差(+++里面的说明+++),查询则尽量避免跨分片查询。 使用分片的时机:

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    2.5.3 迁移旧版Visual Studio创建的网站 2.6 Visual Studio调试 2.6.1 单步调试 2.6.2 变量监视 2.6.3 高级断点 2.7 WebDevelopment Helper 2.8 总结 第3章 Web窗体 3.1 页面处理 3.1.1 HTML表单...

    解析深度学习:语音识别实践

    12.2.3 跨语言模型迁移185 12.3 语音识别中深度神经网络的多目标学习188 12.3.1 使用多任务学习的鲁棒语音识别188 12.3.2 使用多任务学习改善音素识别189 12.3.3 同时识别音素和字素(graphemes) 190 12.4 ...

    ASP.NET4高级程序设计(第4版) 3/3

    2.5.3 迁移旧版Visual Studio创建的网站 49 2.6 Visual Studio调试 51 2.6.1 单步调试 52 2.6.2 变量监视 54 2.6.3 高级断点 55 2.7 WebDevelopment Helper 56 2.8 总结 57 第3章 Web窗体 58 3.1 ...

    windowsnt 技术内幕

    理解Microsoft专家认证程序 理解Microsoft认证的不同等级和类型 选择成为MCP(Microsft认证专家)的考试科目 选择成为MCSD的考试科目 选择成为MCT的考试科目 MCSE认证考试的科目 选择合适的MCSE课程组合 核心课程考试 ...

Global site tag (gtag.js) - Google Analytics