视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
oracle数据迁移方法
2025-09-29 08:47:11 责编:小OO
文档
Oracle数据迁移方案

数据迁移通俗的说就是将数据从一个地方转移到另一个地方。主要使用场景有:根据正式系统搭建测试环境、从内网复制到、数据库服务器硬件升级等。根据需要迁移的数据量大小、系统架构,可采取不同的迁移方法。

注:以下所说方法,不考虑数据的增量更新、不考虑数据的实时同步、不考虑数据的逻辑转换。如果有这些需求,建议使用第三方ETL工具或使用Oracle的其他数据同步技术。

一、常用示例

1.1 如何在客户现场搭建测试环境?

常规方案,使用imp/exp工具,先在源库执行直接路径导出操作,然后在目标库执行导入操作。IMP/EXP的执行速度主要受限于磁盘及网络。

数据量:1.5G

导出用时:5分钟

导入用时:23分钟

导出文件大小:1M

导出导入环境:单CPU,700M内存。为力求最大速度,使用直接路径导出、设置最大I/O缓冲、导入导出文件都放在服务器上执行。

1.2 还有没有更快的办法?

有,仍然使用impdp/expdp。只是不再将数据导出后导入,而是直接将数据从源库导入到目的库。

CMD> Impdp  testi@目标库  directory=DMPDIR  schemas=TESTI

network_link=源库dblink  remap_schema=TESTI:TESTA

上面语句的操作是将源库的TESTI用户的数据,导入到目标库的TESTA用户下。

这个操作是局域网内迁移数据最方便的工具,不过也可能是速度最慢的工具。

1.3 有没有还快一点的方法?

有,换用impdp/expdp。同样在源库执行导出,在目标库执行导入。操作速度能得到极大提升。IMPDP/EXPDP速度主要受限于磁盘,与网络无关。

原数据大小:1.5G

expdp导出操作用时:5分钟

impdp导入操作用时:22分钟

导出文件大小:588M

导出导入环境:单CPU,700M内存,并行度 = 1

你不是说这个会更快么?为什么速度跟3.1的imp/exp差不多啊?

请看第四部分总结的解释。

1.4 你还敢再快一点么?

使用表空间迁移。将表空间的元数据导出,和数据文件一起,复制到新库。执行元数据导入。一般来说,整个导入导出的数据量不到5M。速度相当快,但使用比较多。

导出时间:1分钟

导入时间:3分钟

导出文件:60M + 数据文件1.5G

1.5 如何将数据从linux环境转到windows环境?

查看v$transportable_platform,如果数据编码一致,可尝试直接复制数据文件。否则使用rman或impdp/expdp或imp/exp。

1.6 如果你有一个excel格式的数据表,需要远程更新到客户数据库上,怎么更新?

使用pl/sql developer,复制、粘贴、提交。

1.6 如果你需要将正式库的几张表,迁移到测试库来,怎么弄快些?

用dblink+脚本,或者使用impdp远程导入

二、局部数据的迁移

2.1、广域网的迁移

2.1.1 pl/sql developer

广域网下小数据量的迁移,常用pl/sql developer工具来完成。

在本地打开excel文件,复制数据。然后通过“远程桌面”,到远程服务器的pl/sql界面上粘贴,就可以了。操作简单方便。

第一步:在本地复制数据

第二步:打开远程桌面

第三步:在远程机器的pl/sql里面粘贴数据

第四步:保存数据

这种方法在小数据量下很好用。大数据量时,一个表一个表的粘贴比较麻烦,且一粘贴可能就卡在那里了,得等10来分钟。

2.1.2 imp/exp

广域网内大数据量的迁移,通常使用imp/exp工具。先在源库上使用exp工具,导出数据压缩包,通过网络发送到目标数据库。在目标数据库上再imp。

第一步:本机连接到源库上,执行exp

Exp一般使用直接路径导出,速度可以达到常规路径导出的3倍以上。

参数解释:

Parfile:指定导出的参数配置文件

Log:导出日志输出到哪个文件

recordlength=65535:设置最大I/O缓冲为K(该参数最大K)

Direct=y:数据经直接路径导出,不再经SGA导出

Owner=testi:仅导出用户testi的数据。

第二步:本机连接到目标库上,执行imp

Parfile:指定导入的参数配置文件

Log:导入日志输出到哪个文件

Feedback=1000:每导入1000行,在屏幕上输出一个”.”

Buffer=10000000:设置导入缓冲区大小

Fromuser=testi:仅导入testi用户的数据

Touser=testi:将数据导入到新用户testi下。

2.2、局域网内迁移

局域网内的数据迁移,方案比较灵活。常用的方法有:imp/exp、impdp/expdp、dblink+脚本、表空间迁移。

其中imp/exp在2.1.2已有介绍,这里主要介绍其他方法:

2.2.1 dblink+脚本

2.2.1.1 基本介绍

通过dblink将多个分布式数据库连接起来,对外提供统一的服务。可以实现在一个数据库上,访问多个分布式数据库。使用“dblink+脚本”的方法来转移数据,配置灵活,但脚本写起来比较麻烦。需要为每张表单独写脚本。

2.2.1.2 实施方案

主要配置分两步:

1) 创建数据库连接

create database link LINKNAME connect to DBUSER identified by password

    using '(DESCRIPTION =

                              (ADDRESS_LIST =

                                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.9)(PORT = 1521))

                            )

                            (CONNECT_DATA =

                                    (SERVICE_NAME =ORCL)

                              )

                  )';

2) 执行抽取脚本

如:将表B的数据抽取到表A中。

Create table A as select * from B@LINKNAME;

对每张需要同步的表分别写脚本。

2.2.2 impdp/expdp

2.2.2.1 基本介绍

Impdp/expdp就是imp/exp的升级版,在Oracle 10g开始引入。

其主要加强功能如下:

1) 性能优化,导入导出速度明显提升

2) 提供并行执行的能力,加快导入导出速度

3) 提供交互式界面,可随时暂停导入导出操作

4) 提供多种表加载策略,如:追加、替换、跳过等

5) 提供数据库对象间的直接交换功能。

6) 提供导出文件大小估计功能

7) 提供导入、导出进度查看功能

8) 自动在导出文件目录下生成导入、导出日志文件。

但impdp/expdp也有比较明显的。

        1) 与imp/exp工具生成的数据包不兼容

        2) 能远程调用,但导入导出文件必须放到服务器上

总体来说,impdp/expdp优势还是很明显的,所以能使用impdp/expdp时,尽量不使用imp/exp。

2.2.2.1 实施方案

Impdp/expdp的使用,主要分为三步:

1) 创建目录映射

在数据库上,创建到操作系统目录的映射:

Create directory DMPDIR as‘c:\\oracle\\dump\\’;

授予用户USER01对该目录的读写权限:

Grant read ,write on directoryDMPDIR toUSER01;

2) 执行导出脚本

导出:

参数解释:

Directory:数据文件导出到哪个路径下,这里是指定第一步创建的directory。

Dumpfile:导出文件名

Logfile:日志文件名

Parallel:设置导出job的并行度,如果对导出速度有较高要求,可设置CPU数 - 1

Job_name:为导出job命名

SCHEMAS:指定导出哪个用户的数据。

3) 执行数据导入脚本

首先仿照第一步,在目标库上创建操作系统目录映射。然后将第二步的导出文件拷贝到目标数据库对应目录下。然后执行以下脚本:

参数解释:

Directory:导入文件所在的路径

Dumpfile:导入文件名

Logfile:指定生成日志文件的存放位置

Parallel:指定操作并行度

job_name:指定导入job名称

SCHEMAS:指定要导入的用户名

REMAP_SCHEMA =TESTI:TESTB:指定将TESTI用户的数据,导入到TESTB用户下

TABLE_EXISTS_ACTION=REPLACE:如果要导入的表已经存在,直接替换。

2.2.2.3 界面介绍

1) 导出界面

可看到整个导出文件,约需要749.5M的存储空间。当然,expdp也支持只评估空间,不导出数据。

2) 状态查看界面

如果想要查看数据导入进度,新开一个窗口,执行以下脚本:

>expdp test@target  ATTACH=TESTIMP

> status

2.2.3 表空间迁移

2.2.3.1 基本介绍

表空间迁移,相当于将一个数据库的文件,直接用U盘拷贝到另一个数据库使用。虽然这个原理简单,但操作复杂。

这个操作比较多:

1) 原数据库与目标数据库数据库字符集相同、国家字符集必须相同。可查看视图v$nls_parameters确认;

2) 源库与目标数据库最好是同一Oracle版本;

3) 不能搬移SYS和SYSTEM用户对象所在表空间。

2.2.3.2 实施方案

表空间的迁移,可以用imp/exp或impdp/expdp来完成,主要分3步:

1) 完成表空间集的自包含检查

SQL> exec  dbms_tts.transport_set_check(‘TBS1’,true);

执行完成后,查询:select * from v$transport_set_violations;

如果没查出数据,表明可以执行表空间迁移。否则根据查询结果采取其他方法。

2) 执行表空间导出

SQL>alter tablespace users read only;

CMD>expdp test@orcl  directory=DMPDIR  dumpfile=tbs_dmp.dmp

transport_tablespace= USERS

3) 执行表空间导入

将第二步生成的tbs_dmp.dmp文件、表空间USERS对应的数据文件USER01.DBF通过U盘,拷贝到目标库,在目标库上执行导入:

CMD> impdp test@orcl  directory=DMPDIR  dumpfile=tbs_dmp.dmp

transport_tablespace=y  tablespaces=USERS  transport_datafiles=’c:\\...\\USER01.DBF’

SQL> alter tablespace users read write;

2.2.3.3 界面介绍

表空间传输,只是导出表空间的元数据,插入到新库中,因此速度很快。

三、整库迁移

整库迁移,一般用于环境的第一次搭建过程中。就是将整个数据库原封不动的挪到别的机器上。比较适合搭建的测试环境时使用。

整库迁移也可以使用前面介绍的imp/exp、impdp/expdp工具,但是速度奇慢,且经常报错。不如下面的方法好用。

3.1 冷备迁移

冷备迁移,就是将源数据库关闭,然后将数据文件拷贝到新机器的相同位置,直接打开新库就可以了。这个迁移过程,操作相对来说简单一些,也比较好控制,但有其局限性:不能跨操作系统硬件平台及数据库大版本。

-----------------------------------------------------------------------------------------------------------------------

Windows下的迁移步骤大致如下:

1) 关闭源数据库

2) 根据源库数据文件地址,在新机器上建立相应的操作系统目录

3) 将源库的数据文件、控制文件、参数文件、密码文件等拷贝到新库所在机器

4) 启动源数据库

5) 创建控制文件中记录的其他目录

6) 使用oradim创建实例

7) 启动目标数据库

8) 执行utlrp.sql脚本,编译所有无效对象。

3.2 RMAN迁移

用RMAN做整库迁移,比较方便,主要优点是可以跨操作系统硬件平台。

下面是一个将linux系统迁移到wimdows系统的具体实施步骤(当然在32位linux和32位windows之间,可以直接复制数据文件,无需这么麻烦,此处为举例演示):

1) 以read only模式打开数据库

SQL>startup open read only;

2) 转换数据文件

CMD> RMAN target /

RMAN> run{

convert database transport script '/home/Oracle/temp/transcript.sql'

on target platform convert script '/home/oracle/temp/convert.sql'

to platform 'Microsoft Windows IA (32-bit)'

db_file_name_convert('/oracle/oradata/orcl','/home/oracle/temp');

};

3) 将参数文件、数据文件、转换脚本,拷贝到windows平台上

4) 在windows平台上建立数据库实例,然后依次执行脚本convert.sql、transcript.sql

5) 打开数据库,执行utlrp.sql,编译无效数据库对象。

四、总结

4.1 如何选择迁移方案

不同的迁移方案,所花费的时间可能在10分钟+到10小时+之间波动……..

方案选对了,你可以分分钟搞定,否则就得熬夜加班了。

总的来说,如果你要迁移数据,考虑工具的优先顺序如下:

把本文档从后往前看,就得到下面这顺序了……..

1) 如果迁移整个数据库,首选冷备迁移和RMAN迁移。否则首选表空间迁移

2) impdp/expdp

3) imp/exp

4) dblink+脚本

具体选择哪种方案,要根据实施环境而定。也许你谋划很久的方案,环境并不支持。但总有一种适合你。

4.2 impdp/expdp与imp/exp到底有什么区别?

Impdp/expdp = imp/exp + direct mor + parallel

Impdp/expdp比imp/exp快,最主要就是因为它具有并行执行的特性,且默认是直接路径导出。

除了性能优势外,impdp/expdp还提供了几个比较诱人的功能:

1) 提供并行执行的能力,加快导入导出速度

2) 提供交互式界面,可随时暂停导入导出操作

3) 提供多种表加载策略,如:追加、替换、跳过等

4) 提供数据库对象间的直接交换功能。

5) 提供导出文件大小估计功能

6) 提供导入、导出进度查看功能

7) 自动在导出文件目录下生成导入、导出日志文件。

回到最开始的问题,为什么imp/exp和impdp/expdp的导入导出速度差不多?

因为本次测试使用impdp/expdp工具时,设置的并行度为1。丧失了最主要的特性,能快的起来么。

既然这个并行度这么重要,那设置多少合适呢?设置太高,服务器CPU直接飙升至100%,导入速度还得不到提升。设置太低,完全看不到提速的效果。推荐设置:等于服务器CPU数,但不要高于dmp文件的个数。

我刚做过的项目,11g,从HP-UX迁移到Linux。源服务器32CPU,目标服务器CPU。使用dblink读源数据,insert到本地表。起12个进程,600GB数据1个小时导完,然后建索引用了15分钟。导数据前目标数据库关闭archive log,删除表索引,insert使用append hint。用dblink的好处是不需要额外的文件读写,既节省了空间,又提高了速度。

之前考虑过用RMAN做跨平台迁移,试验成功了,但是性能不佳,因为拷贝(或恢复)数据文件、rman convert,重复地读写文件浪费了时间

physical standby 不行,因为是跨平台。logical standby据说可以跨平台,我没有尝试

Golden Gate是不错的方案,但是需要额外的License下载本文

显示全文
专题