【循序渐进Oracle】Oracle的逻辑备份与恢复

编辑手记:针对最近发生的炉石及GitLab事件,我们不得不再次强调备份的重要性。DBA的四大守则,第一条就是备份重于一切。年初做好备份,愿你的系统17无恙。

本文介绍三种常见的逻辑备份与恢复的方式。本文选自《循序渐进Oracle》

1、使用EXP进行逻辑备份

导入/导出(IMP/EXP)是Oracle最古老的两个命令行工具,通过导出(EXP)工具可以将Oracle数据库中的数据提取出来,在恢复时可以将数据导入(IMP)进行恢复。但是需要注意的是,使用EXP备份的数据进行全库恢复时,需要重新创建数据库,导入备份的数据,恢复的过程可能会极为漫长。

逻辑导出(EXP)的使用方法在命令行通过exp –help命令可以直接得到:

C:\>exp -help Export: Release 10.2.0.1.0 - Production on 星期四 2月 1 11:21:14 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved.

通过输入 EXP 命令和您的用户名/口令, 导出,操作将提示您输入参数,例如: EXP SCOTT/TIGER

或者, 您也可以通过输入跟有各种参数的 EXP 命令来控制导出的运行方式。要指定参数, 您可以使用关键字:

格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

例如: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)

或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表,USERID 必须是命令行中的第一个参数。

OBJECT_CONSISTENT 只在对象导出期间设置为只读的事务处理 (N) FEEDBACK 每 x 行显示进度 (0) FILESIZE 每个转储文件的最大大小 FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间 QUERY 用于导出表的子集的 select 子句 RESUMABLE 遇到与空格相关的错误时挂起 (N) RESUMABLE_NAME 用于标识可恢复语句的文本字符串 RESUMABLE_TIMEOUT RESUMABLE 的等待时间 TTS_FULL_CHECK 对 TTS 执行完整或部分相关性检查 TABLESPACES 要导出的表空间列表 TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N) TEMPLATE 调用 iAS 模式导出的模板名

成功终止导出, 没有出现警告。

帮助部分详细介绍了EXP的使用方法,以上帮助内容来自Oracle 10gR2。接下来简要介绍几个关于EXP的注意事项及特殊用法:

1、EXP导出与字符集

在前面的章节中已经详细地介绍过,导出客户端的字符集的设置会影响导出数据,所以应该设置导出客户端字符集和数据库相一致。在Windows的命令行可以如下设置:

C:\>setnls_lang=AMERICAN_AMERICA.ZHS16GBK

在Linux/UNIX上Bash下通常可以如下设置:

[oracle@jumper oracle]$export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

数据库端使用的字符集可以通过如下查询获得:

SQL> select * from NLS_DATABASE_PARAMETERSwhere parameter='NLS_CHARACTERSET'; PARAMETER VALUE ------------------------------- ----------------- NLS_CHARACTERSET ZHS16GBK

2.带查询子句的部分导出

从Oracle 8i开始,EXP工具支持使用查询子句对特定表的部分数据执行导出,这个功能是通过EXP的query参数来实现的,在使用过程中可能最常见的错误是:

LRM-00112: multiplevalues not allowed for parameter 'query' EXP-00019: failed toprocess parameters, type 'EXP HELP=Y' for help EXP-00000: Exportterminated unsuccessfully

这通常是因为Query子句包含特殊字符导致的,由于特殊字符在命令行通常需要转义,所以导出的语法结构通常与众不同。在Windows上,通常可以使用如下方式指定Query子句:

exp ... query='wherecol=1000' exp ... query='wherecol=''1000''' exp ... query='wherecol"<"1000' exp ... query=\"wherecol < 1000\" exp ...query="'where col < 1000'"

以下是两个简单的范例:

在Linux/UNIX的Bash下,通常可以如下指定query参数:

exp .....query=\"where col \< 1000\" exp .....query=\"where col \< '1000'\"

以下是一个简单的举例:

3.参数文件的使用

对于类似以上的复杂处理,可以通过参数PARFILE来指定一个参数文件,具体的参数写在参数文件中,这样就可以避免复杂的转义等操作:

4. 使用通配符进行模糊导出

有时候,我们希望按条件导出部分表,EXP工具支持模糊查找,通配符可以在tables参数中使用,例如:

这样,以字母E开头的表都被导出了。

5、按日期区分文件名称的导出

很多时候,在导出备份时,我们希望在文件名中加入日期变量,以区分不同日期的导出文件,也可以防止覆盖。

在导出文件名中引入时间有很多不同的做法,本文主要介绍以下两种方法:

(1)通过数据库查询获取日期。

通过数据库查询可以获得需要的日期格式,在Windows上可以编写两个文件用于完成备份,一个是可执行的批处理文件,名称为startbak.bat,可以包含如下内容:

echo off set oracle_sid=eygle sqlplus eygle/eygle@expbydt.sql

第二个文件是expbydt.sql脚本:

column today new_valdt select to_char(sysdate, 'ddmmyyyy' ) today from dual; host expuserid=eygle/eygle file=exp_eygle_&dt..dmp log=exp_eygle_&dt..log exit

准备好了这两个文件之后,就可以通过命令行运行startbak.bat来执行逻辑备份了:

D:\backup>startbak.bat D:\backup>echooff

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production

With thePartitioning, OLAP and Data Mining options TODAY -------- 08022007 Export: Release 10.2.0.1.0- Production on 星期四 2月 815:55:07 2007 Copyright (c) 1982,2005, Oracle. All rights reserved.

连接到:

OracleDatabase 10gEnterprise Edition Release 10.2.0.1.0 -Production With thePartitioning, OLAP and Data Mining options 已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集 即将导出指定的用户... 正在导出 pre-schema 过程对象和操作 。。。。 即将导出 EYGLE 的对象... . 即将导出 EYGLE 的表通过常规路径... . . 正在导出表 EYGLE导出了 1 行 . . 正在导出表 EYGLE_BLOB导出了 8 行 . . 正在导出表 TEST导出了 15 行 . 正在导出同义词 …… . 正在导出统计信息 成功终止导出, 没有出现警告。

检查一下导出后的文件名称,如果备份计划无误,现在就可以通过Windows上的定时任务来定时执行这个任务了。

D:\backup>dir 2007-02-08 15:54 163 expbydt.sql 2007-02-08 15:55 1,699,840 exp_eygle_08022007.dmp 2007-02-08 15:55 1,091 exp_eygle_08022007.log 2007-02-08 15:51 64 startbak.bat

(2)通过操作系统获取日期。

时间变量也可以直接通过操作系统获得,在Windows上,我们可以通过如下命令获得:

D:\backup>echo%date:~0,10% 2007-02-08

当然,在Windows上的时间格式和区域设置有关,如果以上命令输出的日期格式存在问题,那么可以调整一下区域设置的日期。可以通过一个名为expbdt.bat的批处理文件来执行导出操作:

echo off set oracle_sid=eygle exp userid=eygle/eygle full=yfile=d:\backup\exp_eygle_%date:~0,10%.dmplog=d:\backup\exp_eygle_%date:~0,10%.log

执行的结果和上面的方法类似:

D:\backup>expbdt.bat D:\backup>echooff

连接到:

OracleDatabase 10gEnterprise Edition Release 10.2.0.1.0 -Production With the Partitioning,OLAP and Data Mining options

已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集 即将导出整个数据库... . 正在导出表空间定义 ....... . 正在导出 pre-schema 过程对象和操作 . 正在导出簇定义 . 即将导出 SYSTEM 的表通过常规路径... . . 正在导出表 DEF$_AQCALL导出了 0 行 . . 正在导出表 DEF$_AQERROR导出了 0 行 ....... . 正在导出默认值和系统审计选项 . 正在导出统计信息 成功终止导出, 没有出现警告。

导出的输出如下:

D:\backup>dir 2007-02-08 16:46 134 expbdt.bat 2007-02-08 16:47 11,440,128 exp_eygle_2007-02-08.dmp 2007-02-08 16:47 29,646 exp_eygle_2007-02-08.log

在Linux/UNIX上的时间定义就显得更为简单:

exp eygle/eyglefile=eygle_`date +%Y%M%d`

导出文件格式如下:

[oracle@jumperoracle]$ ls -l *.dmp

-rw-r--r-- 1 oracle dba 32768 Feb 8 16:41 eygle_20074008.dmp

2、使用IMP逻辑恢复

由于使用EXP备份的数据进行恢复时,一般需要重新创建数据库,导入备份的数据,恢复的过程可能会极为漫长;如果是做局部恢复(只对部分用户或部分表的恢复)则要相对简单。

EXP的工具帮助同样可以通过命令行查询得到:

C:\>imp -help Import: Release 10.2.0.1.0 - Production on 星期六 2月 3 17:07:39 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved.

通过输入 IMP 命令和您的用户名/口令, 导入,操作将提示您输入参数:

例如: IMP SCOTT/TIGER

或者, 可以通过输入 IMP 命令和各种参数来控制导入

的运行方式。要指定参数, 您可以使用关键字:

格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

例如: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N

或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表

USERID 必须是命令行中的第一个参数。

DESTROY 覆盖表空间数据文件 (N) INDEXFILE 将表/索引信息写入指定的文件 SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N) FEEDBACK 每 x 行显示进度 (0) TOID_NOVALIDATE 跳过指定类型 ID 的验证 FILESIZE 每个转储文件的最大大小 STATISTICS 始终导入预计算的统计信息 RESUMABLE 在遇到有关空间的错误时挂起 (N) RESUMABLE_NAME 用来标识可恢复语句的文本字符串 RESUMABLE_TIMEOUT RESUMABLE 的等待时间 COMPILE 编译过程, 程序包和函数 (Y) STREAMS_CONFIGURATION 导入流的一般元数据 (Y) STREAMS_INSTANTIATION 导入流实例化元数据 (N)

下列关键字仅用于可传输的表空间

TRANSPORT_TABLESPACE导入可传输的表空间元数据 (N) TABLESPACES 将要传输到数据库的表空间 DATAFILES 将要传输到数据库的数据文件 TTS_OWNERS 拥有可传输表空间集中数据的用户

成功终止导入, 没有出现警告。

帮助文件已经极为详尽,下面只对特殊情况作一点简要说明。

1.导入数据到不同的表空间

很多朋友在进行数据迁移时,希望把数据导入不同于原系统的表空间,在导入之后却往往发现,数据被导入了原表空间。这是因为如果缺省的原用户具有unlimited tablespace的权限,那么导入时会按照原来的位置导入数据,即导入到原表空间。

以下是一个测试范例,目标是将jive用户的数据倒入到bjbbs用户下,就可以通过fromuser和touser参数来将数据导入到不同用户下:

但是导入完成后发现,新导入的数据仍然被存储在了jive用户的缺省表空间USER中,并未按设想导入bjbbs用户的缺省表空间:

drop掉用户,重新创建并回收用户unlimited tablespace权限:

SQL> create user bjbbs identified by passwd 2 default tablespace bjbbs 3 temporary tablespace temp 4 / User created. SQL> grant connect,resource to bjbbs; Grant succeeded. SQL> grant dba to bjbbs; Grant succeeded. SQL>revoke unlimited tablespace from bjbbs; Revoke succeeded. SQL> alter user bjbbs quota 0 on users; User altered. SQL> alter user bjbbs quota unlimited onbjbbs; User altered.

重新导入数据:

imp bjbbs/passwd file=bj_bbs.dmp fromuser=jivetouser=bjbbs grants=n

再来查询,可以发现现在数据被导入到正确的用户表空间中:

SQL> select table_name,tablespace_name fromuser_tables; TABLE_NAME TABLESPACE_NAME ---------------------------- ------------------------------ HS_ALBUMINBOX BJBBS .... JIVETHREAD BJBBS JIVETHREADPROP BJBBS JIVEUSER BJBBS JIVEUSERPERM BJBBS TMZOLDUSER2 BJBBS

2、使用indexfile进行导入

在有些特殊的情况下(如创建对象时强制指定非缺省表空间),以上的方法可能还是不能奏效,那么IMP工具还有另外一个参数可以供使用,这个参数就是INDEXFILE,当执行导入时指定参数INDEXFILE后,系统就将创建表和索引等的语句写到一个文件,通过编辑这个文件,就可以修改对象的创建语句,将表空间更改为希望的目标表空间,然后运行这个脚本完成对象创建,之后导入数据时至需要指定INGNORE=Y忽略创建错误,Oracle就可以将数据导入到正确的表空间;如果需要变更用户,则还需要制定FROMUSER和TOUSER参数。

来看一个简单的测试,通过indexfile来执行一次导入(数据并不会被导入):

[oracle@jumper oracle]$imp eygle/eygle file=test.dmp indexfile=test.idx rows=n …… Export file createdby EXPORT:V09.02.00 via conventional path import done inZHS16GBK character set and AL16UTF16 NCHAR character set . . skipping table"TEST" Import terminatedsuccessfully without warnings.

检查indexfile:

缺省地,所有的数据都被标记为注释(REM),修改TABLESPACE信息并去掉REM注释后该文件就可以被SQL*Plus调用来创建对象了。

在执行导入数据的操作时,为了加快导入速度,可以指定commit=yes参数,在imp同时进行批量提交,避免导入事务过大,消耗过量的回滚段。

3、使用EXPDP/IMPDP

从Oracle 10g开始,Oracle引入了一个新的导入和导出工具数据泵(Oracle Data Pump),数据泵与传统的导入/导出(IMP/EXP)工具完全不同,它包含两个实用工具EXPDP和IMPDP,分别对应导出与导入工作。

1.关于数据泵的概述

在Oracle10g之前(从Oracle 7到Oracle 9i),导入和导出(IMP/EXP)都作为客户端程序运行,导出的数据由数据库实例读出,通过网络连接传输到导出客户程序,然后写到磁盘上。所有数据在整个导出进程下通过单线程操作,在很多情况下,这种单一导出进程的操作方式成为了一个瓶颈,而且如果在导出过程中发生网络终端或客户端程序异常,都会导致导出操作失败;在Oracle 10g中,数据泵(Data Pump)的所有工作都由数据库实例来完成,数据库可以并行来处理这些工作,不仅可以通过建立多个数据泵工作进程来读/写正在被导出/导入的数据,也可以建立并行I/O服务器进程以更快地读取(SELECT)或插入(INSERT)数据,从而,单进程瓶颈被彻底解决。

通过数据泵,以前通过EXP/IMP主要基于Client/Server的逻辑备份方式转换为服务器端的快速备份,数据泵(EXPDP/IMPDP)主要工作在服务器端,可以通过并行方式快速装入或卸载数据,而且可以在运行过程中调整并行的程度,以加快备份或减少资源耗用。

数据泵现在通过新的API来建立和管理,这些新的工作主要由DBMS_DATAPUMP来完成。新的导入/导出工具完全成为了一个客户端应用,通过IMPDP/EXPDP执行的命令实际上都是在调用Server端的API在执行操作,所以一旦一个任务被调度或执行,客户端就可以退出连接,任务会在Server端继续运行,随后就可以通过客户端实用程序从任何地方检查任务的状态和进行修改。

重新启动任务的功能是数据泵的一个重要特性。可以随时停止和重启动一个数据泵任务,比如为在线用户释放资源。还可以从文件系统的空间问题中轻松地恢复。如果一个12小时的导出任务在进行了11小时后因磁盘空间不够而失败,那么也不用从头开始重新启动该任务,再重复前面11小时的工作。而是可以连接到这个失败的任务,增加一个或多个新的转储(dump)文件,从失败的地方重新启动,这样只需1个小时就可以完成任务了。这在处理很大数据量时非常有用。

2.数据泵的使用

先简要地看一下EXPDP的帮助说明:

C:\>expdp -help Export: Release 10.2.0.1.0- Production on 星期日, 04 2月, 2007 18:24:24 Copyright (c) 2003,2005, Oracle. All rights reserved.

数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输

数据对象的机制。该实用程序可以使用以下命令进行调用:

示例: expdpscott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp

您可以控制导出的运行方式。具体方法是: 在 'expdp' 命令后输入

各种参数。要指定各参数, 请使用关键字:

格式: expdp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

示例: expdpscott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott

或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表

注意到与EXP不同,EXPDP增加了一个主要的新的参数:DIRECTORY。这个参数是用来定义一个路径,前面我们提到,数据泵主要在Server端工作,导出文件需要写出到Server端本地目录,这个DIRECTORY就对应的是Server端的路径。

可以自己创建一个DIRECTORY,也可以使用缺省的路径:

然后可以对相应的用户进行授权:

SQL> grantread,write on directory expdir to eygle;

授权成功。

接下来就可以通过EXPDP来执行导出操作了

C:\>expdp eygle/eygle dumpfile=eygle.dmpdirectory=expdir Export: Release 10.2.0.1.0- Production on 星期日, 04 2月, 2007 18:38:47 Copyright (c) 2003, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10gEnterprise Edition Release 10.2.0.1.0 -Production With the Partitioning, OLAP and Data Miningoptions 启动 "EYGLE"."SYS_EXPORT_SCHEMA_01": eygle/******** dumpfile=eygle.dmpdirectory=expdir 正在使用 BLOCKS 方法进行估计... 处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA 使用 BLOCKS 方法的总估计: 2.187 MB 处理对象类型 SCHEMA_EXPORT/USER 处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT 处理对象类型 SCHEMA_EXPORT/ROLE_GRANT 处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE 处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA 处理对象类型 SCHEMA_EXPORT/SEQUENCE/SEQUENCE 处理对象类型 SCHEMA_EXPORT/TABLE/TABLE 处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT 处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 处理对象类型 SCHEMA_EXPORT/TABLE/COMMENT 处理对象类型 SCHEMA_EXPORT/PROCEDURE/PROCEDURE 处理对象类型 SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE 处理对象类型 SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS . . 导出了"EYGLE"."EYGLE_BLOB" 1.587 MB 8 行 . . 导出了"EYGLE"."EYGLE" 4.921 KB 1 行 已成功加载/卸载了主表 "EYGLE"."SYS_EXPORT_SCHEMA_01" ****************************************************************************** EYGLE.SYS_EXPORT_SCHEMA_01 的转储文件集为: D:\ORACLE\EXPDIR\EYGLE.DMP 作业 "EYGLE"."SYS_EXPORT_SCHEMA_01" 已于18:39:55 成功完成 C:\>dir d:\oracle\expdir 2007-02-04 18:39 1,574 export.log 2007-02-04 18:39 1,855,488 EYGLE.DMP

3.EXPDP/IMPDP的停止与重启动

EXPDP和IMPDP的本质在于,通过API调用,把传统的EXP/IMP类交互模式的操作,转变成为数据库内部的job任务,从而实现了任务的可中止与重启动。

在数据库内部,重启动还依赖于另外一个数据结构MT(Master Table,任务主表),该表用于记录导出/导入任务的进度。

通过EXPDP的帮助说明,可以注意到这样一些参数:

  • CONTINUE_CLIENT:返回到记录模式。如果处于空闲状态,将重新启动作业。
  • START_JOB:启动/恢复当前作业。
  • STATUS:在默认值(0)将显示可用时的新状态的情况下,要监视的频率(以秒计)作业状态。STATUS=[interval]
  • STOP_JOB: 顺序关闭执行的作业并退出客户机。STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。

接下来通过实例来看一下这几个参数的作用。

首先启动EXPDP执行导出操作,这里可以指定一个job_name,这个名称将是数据库中创建的MT表的名称,如果忽略,Oracle会自动命名:

在这里,可以通过按下Ctrl + C组合键,退出当前交互模式,退出之后,导出操作不会停止,这不同于Oracle以前的EXP。以前的EXP,如果退出交互模式,就会出错终止导出任务。

在Oracle 10g中,由于EXPDP是数据库内部定义的任务,已经与客户端无关。退出交互之后,会进入export的命令行模式,此时支持status等查看命令:

^C Export> status Job: SYS_EXPORT_SCHEMA_01 Operation: EXPORT Mode:SCHEMA State: EXECUTING BytesProcessed: 0 Current Parallelism: 1 JobError Count: 0 DumpFile: /data3/backup/sms2.dmp bytes written: 716,800 Worker 1 Status: State:EXECUTING ObjectSchema: EYGLE ObjectName: MT_HIS ObjectType: SCHEMA_EXPORT/TABLE/TABLE_DATA Completed Objects: 1 TotalObjects: 140 Completed Rows: 6,957,868 WorkerParallelism: 1

如果此时想要停止该任务,可以发出stop_job命令,确认后停止:

Export> stop_job

Are you sure you wish to stop this job([yes]/no): yes

进入数据库,可以看到为执行导出任务所创建的MT表:

SQL> select * from tab wheretname='EXPFULL';

TNAME TABTYPE CLUSTERID

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

EXPFULL TABLE

接下来可以通过命令行再次连接到这个任务:

$ expdp eygle/eygleattach=expfull

通过expdp的start_job命令,我们甚至可以重新启动一个暂时被停止的导出操作:

Export> start_job

显示输出:

MT表中记录了导出过程的详细信息,包括任务设置、启动停止时间等。在数据库内部,Oracle是通过高级队列来控制任务进度的。Oracle在EXPDP完成以后,通过更新MT来修改相关对象的状态。

4.EXPDP的ESTIMATE_ONLY参数

在执行EXPDP导出操作时,可以通过PARALLEL参数并行提升性能,但是有时候ESTIMATE参数也会带来巨大的性能影响,该参数用于指定导出操作之前,估算导出的数据表占用的存储空间,该参数缺省值是BLOCKS,可选参数是STATISTICS,前者会按照对象使用的数据块来计算容量,后者会根据统计信息估算,在某些版本中,由于不同算法可能带来严重的性能差异(尤其是当某些Bug存在时)。

在评估导出容量和性能时,可以通过expdp的参数ESTIMATE_ONLY和ESTIMATE结合来进行,ESTIMATE_ONLY仅作评估不会导出数据,通过ESTIMATE参数指定statistics和blocks参数来测试两者的差异。

以下是Oracle 10.2.0.5中的测试数据输出,在这一版本中,并无明显的性能差异,评估时间在5~6秒左右.

测试主要的两条命令如下:

expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLEESTIMATE=statistics expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=blocks

引用部分测试数出:

在最近遇到的一则案例中发现,cursor_sharing参数对expdp的性能有着重要的影响,如果该参数设置为similar或force,可能导致expdp的时间几倍增加,在exact模式下30分钟的导出操作,在similar模式下可能需要1~2个小时时间。这一问题被标记为Bug,在10.2.0.4之后被修正。

5.IMPDP的fromuser/touser实现

在使用impdp时会发现,有很多参数选项与imp不同,比如说,找不到fromuser和touser参数,也找不到了ignore参数,indexes等参数也不再存在。

当然这些功能都还在,而且更加强大,impdp有了不少新的替代参数。以下三个参数极大的增强了用户转换及表空间转换的操作:

REMAP_DATAFILE Redefine datafile references in all DDL statements. REMAP_SCHEMA Objects from one schema are loaded into another schema. REMAP_TABLESPACE Tablespaceobject are remapped to another tablespace.

REMAP_SCHEMA可以定义用户的切换,其格式为: remap_schema=old_schema_name:new_schema_name REMAP_TABLESPACE可以定义切换对象的不同表空间,其格式为: rempa_tablesapce=old_tablespace_name:new_tablespace_name以前类似IGNORE的忽略创建错误,可以使用CONTENT参数:

CONTENT Specifies data to loadwhere the valid keywords are: (ALL), DATA_ONLY, andMETADATA_ONLY.

如果数据结构已经存在可以指定CONTENT=DATA_ONLY,仅导入数据。而关于索引的排除,可以使用EXCLUDE参数:

EXCLUDE Exclude specific objecttypes, e.g. EXCLUDE=TABLE:EMP.

IMPDP导入时忽略索引可以使用类似如下参数:

EXCLUDE=CONSTRAINTEXCLUDE=INDEX 如果导入时遇到如下错误,就需要调整REMAP_SCHEMA参数: ORA-39146: schema "SMS_MT" does not exist 遇到如下错误,那就需要制定REMAP_TABLESPACE参数: ORA-00959: tablespace 'SMS_MT' does not exist 以下是一个完整的使用范例:

impdp sms4/sms4dumpfile=08.dmp directory=impdp TABLES=smsmg REMAP_SCHEMA=SMS:SMS4REMAP_TABLESPACE=SMS_MT:SMS CONTENT=DATA_ONLY PARALLEL=8 EXCLUDE=CONSTRAINTEXCLUDE=INDEX

这条命令将原用户SMS的数据导入到SMS4用户下,存储从表空间SMS_MT映射到SMS表空间,导入通过并行进行,仅导入数据,排除了约束和索引的导入。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-02-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop数据仓库

HAWQ技术解析(六) —— 定义对象

        HAWQ本质上是一个数据库系统,所以这里所说的对象指的是数据库对象。和其它关系数据库类似,HAWQ中有数据库、表空间、表、视图、自定义数据类型、...

2595
来自专栏乐沙弥的世界

重新配置与卸载 11gR2 Grid Infrastructure

      Oracle 11g R2 Grid Infrastructure 的安装与配置较之前的版本提供了更多的灵活性。在Grid Infrastructu...

601
来自专栏数据和云

时过境迁:Oracle跨平台迁移之XTTS方案与实践

作者简介 ? 谢金融 云和恩墨东区交付部 Oracle 工程师,多年来从事 Oracle 第三方服务,曾服务过金融、制造业、物流、政府等许多行业的客户,精通数据...

43010
来自专栏北京马哥教育

没遇到过这十个MySQL 数据库经典错误,你一定不是个好工程师

笔者在刚开始学习数据库的时候,没少走弯路。经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决问题的办法。跟无头苍蝇一样,会不加思索地把错...

3927
来自专栏乐沙弥的世界

ORA-27102: out of memory 故障

      最近的UAT数据库迁移,由于是多个DB需要迁移到同一台机器,一部分完成后,启动后续数据库碰到了ORA-27102错误,提示内存超出,查看系统可用内存...

562
来自专栏乐沙弥的世界

Oracle 外部表

外部表只能在Oracle 9i 之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们

582
来自专栏乐沙弥的世界

数据泵 EXPDP 导出工具的使用

对于Oracle 数据库之间的导入导出,可以使用Oracle提供的导入导出工具EXP/IMP来实现。EXP/IMP是Oracle早期提供的数据导入导出工具。在...

1133
来自专栏架构师之旅

Oracle 数据泵详解附案例

一、EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)...

1755
来自专栏乐百川的学习频道

Python 爬虫获取某贴吧所有成员用户名

最近想用Python爬虫搞搞百度贴吧的操作,所以我得把原来申请的小号找出来用。有一个小号我忘了具体ID,只记得其中几个字母以及某个加入的贴吧。所以今天就用爬虫来...

17710
来自专栏北京马哥教育

两大Linux发行版迎来大幅更新 Debian 9及Fedora 26 Beta终于发布

Debian 9终于发布 Debian 发行版宣布正式释出代号为 Stretch 的 Debian 9,该版本将提供五年的支持。Stretch 将专门献给于 2...

2844

扫码关注云+社区