导出导入数据迁移方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文梗概:
本文主要描述了从oracle 9i至oracle 10g的单表大数据量的迁移过程,其间作者尝试了不同方法,对比之后,主要使用了DB Link。
正文:
由于公司服务器升级,原Oracle 9i RAC(裸设备)系统也升级到了Oracle 10g RAC(ASM),原数据库中的数据也要导入到新建的数据库中。
数据迁移要求:
环境原系统:Sun Slaris 8.0(UltraSPARC_64)
Oracle 9i R2 RAC
新系统:RHEL 5.5(x86_64)
Oracle 10g R2 RAC
要求全数据量迁移(约300G)
原系统数据库不可下线
Oracle的数据迁移有很多种方法:RMan的备份/恢复方式、EXP/IMP、DB Link + extent等。
RMan:
由于系统环境的差异(SPARC -> x86)和数据库版本的问题,RMAN不予考虑。
EXP/IMP
最开始使用此方式,实际上在TOAD中提供的exp/imp工具非常好用,基本无视数据库的编码格式和版本,图形化的界面,可以实时看到导入、导出的进度,可以导出数据库结构,但由于原数据库的某些表数据量较大,在导出时提示exp kgefec: fatal error 0,基本每表可以导出6G数据后,就会报这个错误。这个错误我想应该是与数据库有关,应该不是TOAD的问题。总之,数据部分导出和没导是一样的,所以该方式也被放弃了。
DB Link + extent
DB Link实际上是尝试的第一种方式,建立这种模式的DB Link请参考如下代码:
CREATE DATABASE LINK RC CONNECT TO CSDN IDENTIFIED BY
在建立好DB Link后,使用Insert into select ....
INSERT INTO tb SELECT * FROM tb@rc
问题大了!在第一试导入数据量在1.8G的表时,新数据库的UNDO表空间开始狂飙,最后占用到了6.5G,其间又手工为UNDO建立了一个新的数据文件,可是最后用不上了,删除也删除不了。
上网找方法,发现可以使用INSERT /**APPEND**/来避免UNDO激增的问题
INSERT /**APPEND**/ INTO tb SELECT * FROM tb@rc
但发现如果表的数据量很大的话,这一过程非常慢,一个7G左右的表,大概用时5个小时。后来发现原表中是建立了extent的,于想到了按区块导,多个进程并行。
注意:在导入前最好删除或禁止新表中的KEY和INDEX,这样导入会快得多。
操作:
1、在新数据库上建立一个ROW_ID表
create table MY_ROWID
(
ID NUMBER,
ROWID_MIN VARCHAR2(100),
ROWID_MAX VARCHAR2(100),
HAS_DEAL NUMBER
);
2、在原数据库上建立一个DB Link,主要用于向新数据库的ROW_ID表提供目标表数据区块列表
DBA_EXTENTS:
desc dba_segments
Name Type Nullable Default Comments
--------------- ------------ -------- ------- --------------------------------------------------------------------------------------------------------------------------------------
OWNER VARCHAR2(30) Y Username of the segment owner
SEGMENT_NAME VARCHAR2(81) Y Name, if any, of the
segment
PARTITION_NAME VARCHAR2(30) Y Partition/Subpartition Name, if any, of the segment
SEGMENT_TYPE VARCHAR2(18) Y Type of segment: "TABLE", "CLUSTER", "INDEX", "ROLLBACK",
"DEFERRED ROLLBACK", "TEMPORARY","SPACE HEADER", "TYPE2 UNDO"
or "CACHE"
TABLESPACE_NAME VARCHAR2(30) Y Name of the tablespace containing the segment
HEADER_FILE NUMBER Y ID of the file containing the segment header
HEADER_BLOCK NUMBER Y ID of the block containing the segment header
BYTES NUMBER Y Size, in bytes, of the segment
BLOCKS NUMBER Y Size, in Oracle blocks, of the segment
EXTENTS NUMBER Y Number of extents allocated to the segment
INITIAL_EXTENT NUMBER Y Size, in bytes, of the initial extent of the segment
NEXT_EXTENT NUMBER Y Size, in bytes, of the next extent to be allocated to the segment
MIN_EXTENTS NUMBER Y Minimum number of extents allowed in the segment
MAX_EXTENTS NUMBER Y Maximum number of extents allowed in the segment
PCT_INCREASE NUMBER Y Percent by which to increase the size of the next extent to be allocated
FREELISTS NUMBER Y Number of process freelists allocated in this segment
FREELIST_GROUPS NUMBER Y Number of freelist groups allocated in this segment
RELATIVE_FNO NUMBER Y Relative number of the file containing the segment header
BUFFER_POOL VARCHAR2(7) Y The default buffer pool to be used for segments blocks
rowid的组成结构为:
data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串)
3、导入目标表的区块列表,在原数据库执行