Oracle停止Expdp/Impdp任务

由于数据泵导入/导出命令是在数据库中生成了job运行,所以Oracle停止Expdp/Impdp任务时,是不可以如同exp/imp一样直接单单使用Ctrl+C的方式进行终止的,因为发送了Ctrl+C命令后,数据泵任务依旧是在后台执行的
如何正确的停止数据泵任务呢?

解决方案1:

用于这个例子中的作业:

  • 导出作业 SCOTT.EXPDP_20051121 是一个正在运行的 schema 级别的导出作业
  • 导出作业 SCOTT.SYS_EXPORT_TABLE_01 是一个表级别的异常导出作业
  • 导出作业 SCOTT.SYS_EXPORT_TABLE_02 是一个表级别的停止导出作业
  • 导出作业 SYSTEM.SYS_EXPORT_FULL_01 是一个被暂停的全库导出作业

第1步. 用 SQL*PLUS 判断在数据库中有哪些数据泵作业

%sqlplus /nolog  
CONNECT / as sysdba   
SET lines 200   
COL owner_name FORMAT a10;   
COL job_name FORMAT a20   
COL state FORMAT a12  
COL operation LIKE state   
COL job_mode LIKE state   
  
-- 查找数据泵作业:  
  
SELECT owner_name, job_name, operation, job_mode,   
state, attached_sessions   
FROM dba_datapump_jobs   
WHERE job_name NOT LIKE 'BIN$%'   
ORDER BY 1,2;   
 
OWNER_NAME JOB_NAME            OPERATION JOB_MODE  STATE       ATTACHED  
---------- ------------------- --------- --------- ----------- --------  
SCOTT      EXPDP_20051121      EXPORT    SCHEMA    EXECUTING          1  
SCOTT      SYS_EXPORT_TABLE_01 EXPORT    TABLE     NOT RUNNING        0   
SCOTT      SYS_EXPORT_TABLE_02 EXPORT    TABLE     NOT RUNNING        0   
SYSTEM     SYS_EXPORT_FULL_01  EXPORT    FULL      NOT RUNNING        0  

第2步. 确保在 dba_datapump_jobs 中列出的作业不是活动的数据泵作业: 状态应该是’NOT RUNNING’。

第3步. 同作业属主确认视图 dba_datapump_jobs 中状态为’NOT RUNNING’ 的作业不是被暂停,而失败的作业。(例如,SYSTEM 用户的全库导出作业不是一个失败的作业,而是一个被故意暂停的作业)

第4步. 通过 SQL*Plus 找到相关的 master 表:

-- 查找数据泵的 master 表:  
 
SELECT o.status, o.object_id, o.object_type,   
      o.owner||'.'||object_name "OWNER.OBJECT"   
 FROM dba_objects o, dba_datapump_jobs j   
WHERE o.owner=j.owner_name AND o.object_name=j.job_name   
  AND j.job_name NOT LIKE 'BIN$%' ORDER BY 4,2;   

STATUS   OBJECT_ID OBJECT_TYPE  OWNER.OBJECT   
------- ---------- ------------ -------------------------   
VALID        85283 TABLE        SCOTT.EXPDP_20051121   
VALID        85215 TABLE        SCOTT.SYS_EXPORT_TABLE_02   
VALID        85162 TABLE        SYSTEM.SYS_EXPORT_FULL_01  

第5步. 对于过去被终止的和根本不会再启动的作业,删除它的 master 表,例如,

DROP TABLE scott.sys_export_table_02;  
 
-- 对于启用了 recycle bin 的系统,需要额外运行:  
purge dba_recyclebin;  

第6步. 重新运行第1步和第4步对 dba_datapump_jobs 和 dba_objects 的查询。如果 dba_datapump_jobs 里仍然有作业列出,并且这些作业根本没有 master 表,我们就可以以作业属主的身份清除它们。例如,

CONNECT scott/tiger   
SET serveroutput on   
SET lines 100   
DECLARE   
 h1 NUMBER;   
BEGIN   
 h1 := DBMS_DATAPUMP.ATTACH('SYS_EXPORT_TABLE_01','SCOTT');   
 DBMS_DATAPUMP.STOP_JOB (h1);   
END;   
/  

注意:调用 STOP_JOB 过程以后,可能会花一点时间去清除作业,我们可以查询 user_datapump_jobs 检查作业是否已经被清除掉:

SELECT * FROM user_datapump_jobs;

第7步. 确认作业已经被清除

CONNECT / as sysdba   
SET lines 200    
COL owner_name FORMAT a10;    
COL job_name FORMAT a20    
COL state FORMAT a12    
COL operation LIKE state    
COL job_mode LIKE state    
  
-- 查找数据泵作业:  
  
SELECT owner_name, job_name, operation, job_mode,    
state, attached_sessions    
FROM dba_datapump_jobs    
WHERE job_name NOT LIKE 'BIN$%'    
ORDER BY 1,2;    
 
OWNER_NAME JOB_NAME            OPERATION JOB_MODE  STATE       ATTACHED   
---------- ------------------- --------- --------- ----------- --------   
SCOTT      EXPDP_20051121      EXPORT    SCHEMA    EXECUTING          1   
SYSTEM     SYS_EXPORT_FULL_01  EXPORT    FULL      NOT RUNNING        0   
  
-- 查找数据泵的 master 表:   
SELECT o.status, o.object_id, o.object_type,   
       o.owner||'.'||object_name "OWNER.OBJECT"   
  FROM dba_objects o, dba_datapump_jobs j   
 WHERE o.owner=j.owner_name AND o.object_name=j.job_name   
   AND j.job_name NOT LIKE 'BIN$%' ORDER BY 4,2;   

STATUS   OBJECT_ID OBJECT_TYPE  OWNER.OBJECT   
------- ---------- ------------ -------------------------   
VALID        85283 TABLE        SCOTT.EXPDP_20051121   
VALID        85162 TABLE        SYSTEM.SYS_EXPORT_FULL_01  

摘要:

  1. 异常数据泵作业不会影响新的数据泵作业. dba_datapump_jobs 是基于 gv d a t a p u m p j o b , o b j datapump_job, obj datapumpjob,obj, com , a n d u s e r , and user ,anduser 的一个视图。 这个视图显示仍在运行的数据泵作业,或者作业的 master 表仍然保留在数据库中,或者不正常结束的作业(异常作业)。如果一个新的数据泵作业启动, 会创建一条新的记录,与旧的数据泵作业无关。

  2. 当用系统自动生成的作业名启动一个新的数据泵作业时,我们会检查 dba_datapump_job 中现有的名称以保持惟一性。当然,启动这个作业的用户下需要有足够的空间来创建一个新的 master 表。

  3. 数据泵作业与用 DBMS_JOBS 包定义的作业不同, DBMS_JOBS 创建的作业使用它自己的进程。 数据泵作业使用一个 master 进程和一些 worker 进程。如果一个数据泵作业被暂停,数据泵作业会一直存在在数据库中(status: NOT RUNNING),这时,master 和 worker 进程会被停止,或者不再存在。客户端之后可以再次挂载到这个作业,并且继续作业的执行(START_JOB)。

  4. 如果活动的数据泵作业相关联的 master 表被删除,可能会导致不一致.

a. 如果是一个导出作业, 不太可能引起不一致,因为删除 master 表只会导致数据泵的 mater 和 worker 进程中止。这种情况类似于客户端发起的一个意外中止。

b. 如果这个作业是一个导入作业,那么情况就有所不同。删除掉 master 表会导致数据泵的 worker 和 mater 进程中断。这有可能会引起不完整的导入。 例如,没有导入表的所有数据, 或表,索引,视图等的导入不完整, 这种情况类似于意外中断导入的客户端。

删除 master 表本身不会引起任何数据字典的不一致。如果您在作业完成后还保留 master 表(使用非公开的参数:KEEP_MASTER=Y),以后再删除 master
表的操作不会造成任何不一致。

解决方案2:

1、EXPDP/IMPDP参数:
ATTACH连接到现有作业, 例如 ATTACH [=作业名]。
JOB_NAME可以通过dba_datapump_jobs来查询:

sql>select * from dba_datapump_jobs

OWNER_NAME                     JOB_NAME                       OPERATION
------------------------------ ------------------------------ ------------------------------------------------------------
JOB_MODE                                                     STATE                              DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
------------------------------------------------------------ ------------------------------ ---------- ----------------- -----------------
SYSTEM                         SYS_EXPORT_FULL_01         EXPORT
FULL                                                         EXECUTING                               1                 1                 3

样例1:

C:\Documents and Settings\Administrator>expdp system/sys attach=SYS_EXPORT_FULL_01

Export: Release 11.2.0.1.0 - Production on 星期六 7月 13 23:53:55 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
作业: SYS_EXPORT_FULL_01
  所有者: SYSTEM
  操作: EXPORT
  创建者权限: TRUE
  GUID: 7374DCC3E7D547B3B755865E4DB59F10
  开始时间: 星期六, 13 7月, 2013 23:53:57
  模式: FULL
  实例: tony
  最大并行度: 1
  EXPORT 个作业参数:
  参数名      参数值:
     CLIENT_COMMAND        system/******** directory=dir_dump dumpfile=dir_dump:bigtable.dmp logfile=dir_dump:bigtable.log full=y
  状态: IDLING
  处理的字节: 0
  当前并行度: 1
  作业错误计数: 0
  转储文件: d:\impdp\bigtable.dmp
    写入的字节: 5,177,344
Worker 1 状态:
  进程名: DW00
  状态: UNDEFINED
Export> stop_job
是否确实要停止此作业 ([Y]/N): y
是否确实要停止此作业 ([Y]/N): Y
是否确实要停止此作业 ([Y]/N): Y
是否确实要停止此作业 ([Y]/N): Y
是否确实要停止此作业 ([Y]/N): Y  ---------------就是停止不了,在dba_datapump_jobs还是能查到记录,只是JOB已经停止了。
-----已经解决了,需要输入YES

过一会儿,再次查看状态,State: WORK WAITING,任务已结束并进入等待状态
如果导出过程中出现异常中断,可能任务还残留在数据库中
可以通过DBA_DATAPUMP_JOBS或USER_DATAPUMP_JOBS视图查询
根据得到的表名删除任务

drop table hr.SYS_EXPORT_SCHEMA_01 purge;

这里的purge子句,是不将表放入Oracle回收站,彻底删除
Oracle回收站还可以用PURGE recyclebin来清空
也可PURGE TABLE tablename来指定清空之前删除并放入回收站的表

      Export> KILL_JOB
       是否确实要停止此作业 ([Y]/N): YES

在执行的时候CTL+C就可以进入交互模式,windows和LINUX下都是一样的。
对于state not running的可以直接删除既可

drop table system.SYS_EXPORT_SCHEMA_01 purge;(彻底删除table,不经过回收站)
SQL> select * from DBA_DATAPUMP_JOBS;
no rows selected

重新进入EXPDP/IMPDP,就可以执行下面的交互命令:

$expdp username/password,

交互模式常用命令:
CONTINUE_CLIENT返回到记录模式。假如处于空闲状态, 将重新启动作业。
START_JOB 启动恢复当前作业。
STATUS在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。
STATUS=[interval]
STOP_JOB顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
还有其他命令:
ADD_FILE向转储文件集中添加转储文件。
ADD_FILE=dirobjdumpfile-name
CONTINUE_CLIENT 返回到记录模式。假如处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
HELP总结交互命令。
KILL_JOB分离和删除作业。
PARALLEL更改当前作业的活动 worker 的数目。
PARALLEL=worker 的数目。
START_JOB 启动恢复当前作业。
STATUS在默认值 (0) 将显示可用时的新状态的情况下,
要监视的频率 (以秒计) 作业状态。
STATUS=[interval]
STOP_JOB顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值