导出导入数据迁移方案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.0.62)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RAC)))';

在建立好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、导入目标表的区块列表,在原数据库执行

相关文档
最新文档