暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

逻辑备份与恢复-使用数据泵(EXPDP/IMPDP)

原创 eygle 2019-11-08
3508

从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 © 2003, 2005, Oracle. All rights reserved.

数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输
数据对象的机制。该实用程序可以使用以下命令进行调用:

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

您可以控制导出的运行方式。具体方法是: 在 ‘expdp’ 命令后输入
各种参数。要指定各参数, 请使用关键字:

格式: expdp KEYWORD=value 或 KEYWORD=(value1,value2,…,valueN)
示例: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott
或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表

注意到与EXP不同,EXPDP增加了一个主要的新的参数:DIRECTORY。

这个参数是用来定义一个路径,前面我们提到,数据泵主要在Server端工作,导出文件需要写出到Server端本地目录,这个DIRECTORY就对应的是Server端的路径。

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

SQL> CREATE OR REPLACE DIRECTORY expdir  AS 'd:\oracle\expdir';

目录已创建。

SQL> select * from dba_directories where directory_name='EXPDIR';
OWNER      DIRECTORY_NAME                 DIRECTORY_PATH
---------- ------------------------------ --------------------
SYS        EXPDIR                         d:\oracle\expdir
SQL> select * from dba_directories where directory_name='DATA_PUMP_DIR';
OWNER      DIRECTORY_NAME                 DIRECTORY_PATH
---------- ------------------------------ ------------------------------
SYS        DATA_PUMP_DIR                  C:\oracle\admin\eygle\dpdump\

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

SQL> grant read,write on directory expdir to eygle;
授权成功。

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

C:\>expdp eygle/eygle dumpfile=eygle.dmp directory=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 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
启动 "EYGLE"."SYS_EXPORT_SCHEMA_01":  eygle/******** dumpfile=eygle.dmp directory=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会自动命名:

$ expdp eygle/eygle directory=dpdata dumpfile=full.dmp schemas=EYGLE job_name=expfull

Export: Release 10.2.0.2.0 - Production on Tuesday, 28 December, 2010 15:39:20
Copyright (c) 2003, 2005, Oracle.  All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
Starting "EYGLE"."SYS_EXPORT_SCHEMA_01":  eygle/******** directory=backup dumpfile=sms2.dmp schemas=EYGLE 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 22.54 GB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/DB_LINK
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/JOB

Export> 

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

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

^C
Export> status

Job: SYS_EXPORT_SCHEMA_01
  Operation: EXPORT                         
  Mode: SCHEMA                         
  State: EXECUTING                      
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /data3/backup/sms2.dmp
    bytes written: 716,800
  
Worker 1 Status:
  State: EXECUTING                      
  Object Schema: EYGLE
  Object Name: MT_HIS
  Object Type: SCHEMA_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 1
  Total Objects: 140
  Completed Rows: 6,957,868
  Worker Parallelism: 1

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

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

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

SQL> select * from tab where tname='EXPFULL';
TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
EXPFULL                        TABLE

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

$ expdp eygle/eygle attach=expfull

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

显示输出:

Export> continue_client
Job EXPFULL has been reopened at Monday, 26 April, 2004 19:55 
Restarting "EYGLE"."EXPFULL": eygle/******** directory=dpdata dumpfile=full.dmp full=y job_name=expfull 
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/PRE_TABLE_ACTION
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/GRANT/DE_S_TABLE_OWNER_OBJGRANT/OBJECT_GRANT
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/GRANT/DE_S_TABLE_NOTWGO_OBJGRANT/OBJECT_GRANT
. . exported "EYGLE"."BIG_TABLE" 9.008 MB 100000 rows
. . exported "EYGLE"."SP_TRANS_SUB" 6.886 MB 136659 rows
. . exported "EYGLE"."SP_ITEM" 3.171 MB 29770 rows
. . exported "EYGLE"."SP_RECEIVE_SUB" 3.869 MB 36742 rows
. . exported "EYGLE"."SP_CHK_SUB" 2.662 MB 36532 rows
. . exported "EYGLE"."SP_TRANS" 1.948 MB 34483 rows
. . exported "EYGLE"."SP_RECEIVE" 739.0 KB 7822 rows
. . exported "EYGLE"."T1" 819.3 KB 9152 rows
. . exported "EYGLE"."T2" 809.7 KB 9153 rows
............
. . exported "WMSYS"."WM$VERSIONED_TABLES_UNDO_CODE" 0 KB 0 rows
. . exported "WMSYS"."WM$VERSION_TABLE" 0 KB 0 rows
. . exported "WMSYS"."WM$VT_ERRORS_TABLE" 0 KB 0 rows
. . exported "WMSYS"."WM$WORKSPACE_SAVEPOINTS_TABLE" 0 KB 0 rows
Master table "EYGLE"."EXPFULL" successfully loaded/unloaded
******************************************************************************
Dump file set for EYGLE.EXPFULL is:
/opt/oracle/dpdata/full.dmp
Job "EYGLE"."EXPFULL" completed with 3 error(s) at 19:57

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=EYGLE ESTIMATE=statistics
expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=blocks

引用部分测试数出:

[oracle@oracle ~]$ expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=statistics

Export: Release 10.2.0.5.0 - 64bit Production on Wednesday, 29 December, 2010 12:29:14
Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  "/******** AS SYSDBA" ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=statistics 
Estimate in progress using STATISTICS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.  estimated "EYGLE"."EYGLEE_ISMG_CURRENT"             3.504 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M07"               1.702 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M06"               1.491 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M03"               1.377 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M05"               1.306 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M12"               1.296 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M08"               1.292 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M04"               1.290 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M01"               1.200 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M02"               1.187 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M11"               1.147 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M09"               1.132 GB
.  estimated "EYGLE"."EYGLEE_ISMG":"M10"               1.086 GB
.  estimated "EYGLE"."MONTH_BILLS"                     162.1 MB
.  estimated "EYGLE"."EYGLEE_ISMG2":"M07"              158.9 MB
。。。。。。。。。
Total estimation using STATISTICS method: 20.39 GB
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at 12:29:19

在最近遇到的一则案例中发现,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      Tablespace object 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 load where the valid keywords are:
(ALL), DATA_ONLY, and METADATA_ONLY.

如果数据结构已经存在可以指定CONTENT=DATA_ONLY,仅导入数据。而关于索引的排除,可以使用EXCLUDE参数:
EXCLUDE Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.

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

如果导入时遇到如下错误,就需要调整REMAP_SCHEMA参数:
ORA-39146: schema “SMS_MT” does not exist

遇到如下错误,那就需要制定REMAP_TABLESPACE参数:
ORA-00959: tablespace ‘SMS_MT’ does not exist

以下是一个完整的使用范例:
impdp sms4/sms4 dumpfile=08.dmp directory=impdp TABLES=smsmg REMAP_SCHEMA=SMS:SMS4 REMAP_TABLESPACE=SMS_MT:SMS CONTENT=DATA_ONLY PARALLEL=8 EXCLUDE=CONSTRAINT EXCLUDE=INDEX

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论