zoukankan      html  css  js  c++  java
  • 如何清除 DBA_DATAPUMP_JOBS 视图中的异常数据泵作业

    解决方案  
      
    用于这个例子中的作业:  
    - 导出作业 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$datapump_job, obj$, com$, and user$ 的一个视图。 这个视图显示仍在运行的数据泵作业,或者作业的 master 表仍然保留在数据库中,或者不正常结束的作业(异常作业)。如果一个新的数据泵作业启动, 会创建一条新的记录,与旧的数据泵作业无关。  
      
    2. 当用系统自动生成的作业名启动一个新的数据泵作业时,我们会检查 dba_datapump_job 中现有的名称以保持惟一性。当然,启动这个作业的用户下需要有足够的空间来创建一个新的 master 表。  
      
    3. 数据泵作业与用 DBMS_JOBS 包定义的作业不同, DBMS_JOBS 创建的作业使用它自己的进程。 数据泵作业使用一个 master 进程和一些 worker 进程。如果一个数据泵作业被暂停,数据泵作业会一直存在在数据库中(status: NOT RUNNING),这时,master 和 worker 进程会被停止,或者不再存在。客户端之后可以再次挂载到这个作业,并且继续作业的执行(START_JOB)。  
      
    4. 如果活动的数据泵作业相关联的 master 表被删除,可能会导致不一致.  
      
    4.a. 如果是一个导出作业, 不太可能引起不一致,因为删除 master 表只会导致数据泵的 mater 和 worker 进程中止。这种情况类似于客户端发起的一个意外中止。  
      
    4.b. 如果这个作业是一个导入作业,那么情况就有所不同。删除掉 master 表会导致数据泵的 worker 和 mater 进程中断。这有可能会引起不完整的导入。 例如,没有导入表的所有数据, 或表,索引,视图等的导入不完整, 这种情况类似于意外中断导入的客户端。  
      
    删除 master 表本身不会引起任何数据字典的不一致。如果您在作业完成后还保留 master 表(使用非公开的参数:KEEP_MASTER=Y),以后再删除 master  
     表的操作不会造成任何不一致。  

    转自网络

  • 相关阅读:
    深入理解 RPC
    Redis 深度历险
    tomcat性能优化
    高性能IO之Reactor模式
    常用sql语句整理[SQL Server]
    SQLite遇到的关于x64、x86问题
    C#和Javascript的try…catch…finally的一点差别
    C#写Windows服务
    Windows_7_休眠按钮没有了_如何找回?
    XmlReader读取XML
  • 原文地址:https://www.cnblogs.com/polestar/p/6677355.html
Copyright © 2011-2022 走看看