Oracle 数据泵是 Oracle 数据库 10g 的一个新特性,该特性实现了数据库间数据与元数据的高速移动。此技术是 Oracle 新的数据移动实用程序“数据泵导出”和“数据泵导入”的基础。
数据泵一个非常卓越的特性就是重新启动作业的能力。重新启动“数据泵导出”或“数据泵导入”作业的功能对于那些负责移动大量数据尤其是需要很长时间才能完成的大型作业的 DBA 来说意义非常重大。数据泵作业在发生意外故障或从“导入”或“导出”交互模式发出 STOP_JOB 参数后会重新启动,但不会丢失或毁坏数据。
重新启动数据泵作业的一个非常常见的原因是某个故障(如电源故障、内部错误,或者某个意外的实例回弹)导致作业无法继续。发生故障的常见原因还可能是系统资源问题,如转储文件空间不足(在“数据泵导出”情况下),或者表空间资源不足(“数据泵导入”情况下)。发生数据泵作业故障时,DBA 或用户能够进行干预以修正问题。然后,可以发出数据泵重新启动命令 (START_JOB),使作业从发生故障的位置继续进行。
本技术说明用两个示例介绍数据泵重新启动功能,这两个示例分别使用“数据泵导出”和“数据泵导入”命令行实用程序。在这两个示例中,都需要为转储文件定义一个目录对象 DATA_PUMP_DIR。而且,数据泵用户(在我们的示例中为 SYSTEM)需要具备 exp_full_database 和 imp_full_database 角色。重新启动对于没有权限的用户同样起作用。(有关数据泵以及其目录对象用法的其他信息,请参阅 Oracle 数据库实用程序 10g Release 1 (10.1)。)
示例 1:重新启动“数据泵导出”
我们的第一个示例演示如何在“数据泵导出”过程中使用重新启动功能。我们将执行 HR 方案的“数据泵导出”,同时指定转储文件的最大大小。数据泵用户通常将指定最大转储文件大小 (filesize) 作为一个管理磁盘资源的机制。在此示例中,我们的作业会因为指定的转储文件大小太小而发生故障。
第 1 步:启动导出
在此示例中,我们将使用“expdp”客户机界面。在命令行指定了一个 job_name(可选),这样可以使您能够在稍后按照名称更容易地找到和连接该作业。
下面是导出命令:
> expdp system/manager schemas=hr directory=data_pump_dir logfile=example1.log filesize=300000 dumpfile=example1.dmp job_name=EXAMPLE1
输出将如下所示:
Export:Release 10.1.0.2.0 - Production on Tuesday, 06 July, 2004 6:37...Processing object type SCHEMA_EXPORT/SYSTEM_GRANTProcessing object type SCHEMA_EXPORT/ROLE_GRANT.. . exported "HR"."COUNTRIES" 6.078 KB 25 rows. . exported "HR"."DEPARTMENTS" 6.632 KB 27 rowsORA-39095:Dump file space has been exhausted:Unable to allocate 217088 bytesJob "SYSTEM"."EXAMPLE1" stopped due to fatal error at 06:38>
第 2 步:连接作业
我们的导出作业 (EXAMPLE1) 遇到了严重错误,客户机已经返回了操作系统提示符 (>)。我们可以通过调用下列查询来检查作业状态:
SQL> select job_name,state from dba_datapump_jobs;JOB_NAME STATE------------------------------ ------------------------------EXAMPLE1 NOT RUNNING
在这个简单的示例中,可以很明显地看出问题所在。对于该 HR 方案来说,指定的转储文件太小。我们可以通过查看显示在屏幕上或者数据泵日志文件中的客户机输出来确定该错误的原因。
为了修复此问题,我们需要再添加一个转储文件。我们使用名称“EXAMPLE1”来连接作业。成功连接作业时,会显示作业状态以及有关该作业的其他令人感兴趣的信息。
>expdp system/manager attach=EXAMPLE1 Export:Release 10.1.0.2.0 - Production on Tuesday, 06 July, 2004 6:38...Job:EXAMPLE1Owner:SYSTEMOperation:EXPORT . . .Total Objects: 7
Worker Parallelism: 1
第 3 步:添加转储文件
此时,可以在 Export> 提示符下发出 ADD_FILE 指令来添加转储文件。新的转储文件将自动创建在与原始转储文件相同的目录 (DATA_PUMP_DIR) 中。
Export>add_file=hr1.dmp
接下来,我们可以执行 status 命令,看到现在显示出这个添加的转储文件。
Export>statusJob:EXAMPLE1Operation:EXPORTMode:SCHEMAState:IDLINGBytes Processed: 55,944Percent Done: 99Current Parallelism: 1Job Error Count: 0Dump File:/work1/private/oracle/rdbms/log/example1.dmpsize: 303,104bytes written: 163,840Dump File:/work1/private/oracle/rdbms/log/hr1.dmpbytes written: 4,096
第 4 步:重新启动/继续作业
最后,我们发出 CONTINUE_CLIENT 命令。作业 EXAMPLE1 此时将恢复运行。
Export>continue_clientExport> Job EXAMPLE1 has been reopened at Tuesday, 06 July, 2004 6:38Restarting "SYSTEM"."EXAMPLE1":system/******** schemas=hr directory=data_pump_dir logfile=example1.log filesize=300000 dumpfile=example1.dmp job_name=EXAMPLE1Master table "SYSTEM"."EXAMPLE1" successfully loaded/unloaded******************************************************************************Dump file set for SYSTEM.EXAMPLE1 is:/work1/private/oracle/rdbms/log/example1.dmp/work1/private/oracle/rdbms/log/hr1.dmpJob "SYSTEM"."EXAMPLE1" completed with 1 error(s) at 06:38
我们也可以使用 START_JOB 命令。CONTINUE_CLIENT 命令将模式从交互式命令模式更改为记录模式,然后执行 START_JOB。
示例 2:重新启动数据泵导入 - 可恢复的等待超时
在示例 2 中,我们将通过执行重新映射表空间导入操作演示数据泵重新启动功能。我们的数据泵作业将经历一次所谓的可恢复等待。这种等待是由于目标表空间资源不足造成的。我们会说明 DBA 如何通过为数据库再添加一个文件来进行干预,并随后重新启动导入作业。
第 1 步:创建新的表空间
我们的转储文件包含了几个不同的方案,我们要将这些方案导入到一个新的表空间。我们已经启动并运行了目标数据库。首先,DBA 必须为我们的导入方案创建新的表空间。我们需要启动 SQL*Plus,并执行下列命令:
SQL> create tablespace example2
datafile '/work1/private/rdbms/dbs/example2.f'
size 1M extent management local
第 2 步:启动导入作业
既然已经创建了目标表空间,我们就可以使用下列命令执行“数据泵导入”作业了:
>impdp system/manager dumpfile=example2.dmp remap_tablespace=system:example2 logfile=example2imp.log job_name=example2Import:Release 10.1.0.2.0 - Production on Tuesday, 06 July, 2004 6:54...Processing object type SCHEMA_EXPORT/TABLE/TABLEORA-39171:Job is experiencing a resumable wait.ORA-01658:unable to create INITIAL extent for segment in tablespace EXAMPLE2
第 3 步:停止作业 - 添加表空间文件
我们的导入作业已经进入了可恢复等待状态,并且已经挂起。此作业将保持可恢复等待状态,直到停止该作业或者可恢复等待期间(默认为两个小时)到期。此时,DBA 可以通过向 EXAMPLE2 表空间再添加一个文件来进行干预。停止作业的一个十分充分的理由就是,DBA 在添加第二个转储文件时需要对磁盘子系统进行维护。一般情况下没必要停止作业。
在我们的示例中,我们要在可恢复等待到期之前使用 Control-C 停止该作业。
^C
Import>stop_job=immediate
第 4 步:向表空间添加文件
我们可以调用 SQL*Plus,向 EXAMPLE2 表空间添加文件。
SQL>alter tablespace example2 add datafile '/work1/private/rdbms/dbs/example2b.f'
size 1m autoextend on maxsize 50m;
第 5 步:连接作业
现在,我们就可以连接作业,并重新启动导入了。请注意,我们是按 job_name 连接作业的;在这里为 EXAMPLE2。
>impdp system/manager attach=example2Import:Release 10.1.0.2.0 - Production on Tuesday, 6 July, 2004 07:01Copyright (c) 2003, Oracle.All rights reserved. . . .Job Error Count: 0Dump File:/work1/private/oracle/rdbms/log/example2.dmpWorker 1 Status:State:UNDEFINEDObject Schema:HRObject Name:COUNTRIESObject Type:SCHEMA_EXPORT/TABLE/TABLECompleted Objects: 15Worker Parallelism: 1
第 6 步:重新启动作业
现在我们就可以重新启动作业了。这次我们将使用 START_JOB。
Import> start_job
第 7 步:检查作业状态
我们可以随意地查看作业的状态。
Import> statusJob:EXAMPLE2Operation:IMPORTMode:SCHEMAState:EXECUTINGBytes Processed: 2,791,768Percent Done: 99Current Parallelism: 1Job Error Count: 0Dump File:/work1/private/oracle/rdbms/log/example2.dmpWorker 1 Status:State:EXECUTINGObject Type:SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSWorker Parallelism: 1
作业完成后,您可以查看 example2imp.log 文件,获取作业状态和其他信息。
在示例 2 中,我们演示了如何重新启动一个数据泵导入作业。请注意,通常情况下,添加第二个转储文件时没有必要停止作业(第 3 步)。可以在另一个会话中向表空间添加该文件。换句话说,我们可以跳过第 3、5、6、7、8 步。在这种情况下将自动恢复作业。
总结
如果您使用数据泵时遇到故障,则可以轻松修复该问题,然后使用不会导致任何数据丢失的数据泵重新启动功能,而不必完全重新执行该操作。