编辑手记:针对最近发生的炉石及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表空间,导入通过并行进行,仅导入数据,排除了约束和索引的导入。
如何加入"云和恩墨大讲堂"微信群
搜索 盖国强(Eygle) :eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。
性能篇
新特性篇
MySQL篇
热点事件
云端起舞