yangtingkun
===========================================================
数据泵无法导入JOB
===========================================================

10g的数据泵在进行IMPDP的时候无法导入JOB


通过一个例子来说明这个问题:

SQL> CREATE USER A IDENTIFIED BY A DEFAULT TABLESPACE YANGTK;

用户已创建。

SQL> GRANT CONNECT, RESOURCE TO A;

授权成功。

SQL> CREATE OR REPLACE DIRECTORY D_OUTPUT AS 'E:';

目录已创建。

SQL> GRANT READ, WRITE ON DIRECTORY D_OUTPUT TO A;

授权成功。

SQL> CONN A/A@YTK102已连接。
SQL> DECLARE
2 V_JOB NUMBER;
3 BEGIN
4 DBMS_JOB.SUBMIT(V_JOB, 'NULL;', SYSDATE, 'SYSDATE + 1');
5 COMMIT;
6 END;
7 /

PL/SQL 过程已成功完成。

SQL> COL WHAT FORMAT A30
SQL> SELECT JOB, WHAT FROM USER_JOBS;

JOB WHAT
---------- ------------------------------
66 NULL;

下面用A用户执行数据泵的导出:

E:>expdp a/a@ytk102 directory=d_output dumpfile=a.dp

Export: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 9:49:18

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
启动
"A"."SYS_EXPORT_SCHEMA_01": a/********@ytk102 directory=d_output dumpfile=
a.dp
正在使用 BLOCKS 方法进行估计
...处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA使用 BLOCKS 方法的总估计: 0 KB处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA处理对象类型 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/JOB已成功加载/卸载了主表 "A"."SYS_EXPORT_SCHEMA_01"
******************************************************************************
A.SYS_EXPORT_SCHEMA_01
的转储文件集为
:
E:A.DP
作业 "A"."SYS_EXPORT_SCHEMA_01" 已于 09:49:37 成功完成

下面删除A用户下的JOB

SQL> EXEC DBMS_JOB.REMOVE(66)

PL/SQL 过程已成功完成。

SQL> COMMIT;

提交完成。

尝试通过数据泵IMPDP进行导入:

E:>impdp a/a@ytk102 directory=d_output dumpfile=a.dp

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 9:55:59

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
ORA-39154:
外部方案中的对象已从导入中删除
已成功加载/卸载了主表 "A"."SYS_IMPORT_FULL_01"启动 "A"."SYS_IMPORT_FULL_01": a/********@ytk102 directory=d_output dumpfile=a.
dp
处理对象类型
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA作业 "A"."SYS_IMPORT_FULL_01" 已于 09:56:01 成功完成

检查JOB是否导入:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

未选定行

JOB没有导入,其实观察上面导入操作的输出就可以看到问题。首先导入报错了,而错误信息是“外部方案中的对象已从导入中删除”。而从导入的对象类型中也看不到JOB的信息,似乎JOB被当前其他SCHEMA的对象被屏蔽了。

E:>impdp yangtk/yangtk@ytk102 directory=d_output dumpfile=a.dp remap_schema=a:a


Import: Release 10.2.0.1.0 - Production on
星期二, 29 1, 2008 10:25:52

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
已成功加载/卸载了主表
"YANGTK"."SYS_IMPORT_FULL_01"启动 "YANGTK"."SYS_IMPORT_FULL_01": yangtk/********@ytk102 directory=d_output d
umpfile=a.dp remap_schema=a:a
处理对象类型
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA处理对象类型 SCHEMA_EXPORT/JOB作业 "YANGTK"."SYS_IMPORT_FULL_01" 已于 10:25:54 成功完成

如果使用DBA用户执行导入,采用REMAP_SCHEMA方式,发现导入的时候处理了JOB,而且错误也消失了,那么是否问题解决了呢:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

未选定行

SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> SELECT JOB, LOG_USER, WHAT FROM DBA_JOBS;

JOB LOG_USER WHAT
---------- ---------------------- -----------------------------------
1 SYSMAN EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
66 YANGTK NULL;

JOB虽然导入了,但是没有导入A用户,而是导入了YANGTK用户。这显然不是预期的结果。说明Oracle在处理REMAP_SCHEMA的时候,根本没有把JOB当作SCHEMA A的对象。

既然可以用YANGTK导入,那么使用A导入的时候也是可以的,唯一的区别是A用户没有DBA权限。

SQL> EXEC DBMS_JOB.REMOVE(66)

PL/SQL 过程已成功完成。

SQL> COMMIT;

提交完成。

SQL> GRANT IMP_FULL_DATABASE TO A;

授权成功。

IMP_FULL_DATABASE角色授权给A用户,再次使用A用户执行导入:

E:>impdp a/a@ytk102 directory=d_output dumpfile=a.dp

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 10:43:22

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
已成功加载/卸载了主表
"A"."SYS_IMPORT_FULL_01"启动 "A"."SYS_IMPORT_FULL_01": a/********@ytk102 directory=d_output dumpfile=a.
dp
处理对象类型
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA处理对象类型 SCHEMA_EXPORT/JOB作业 "A"."SYS_IMPORT_FULL_01" 已于 10:43:24 成功完成

发现已经处理了JOB,检查数据库中JOB的情况:

SQL> SELECT JOB, LOG_USER, WHAT FROM DBA_JOBS;

JOB LOG_USER WHAT
---------- ------------------------ --------------------------------------------
1 SYSMAN EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
66 A NULL;

JOB已经成功导入。不过这种方式需要给用户授予一个远远超过自身需求的角色,存在比较大的安全问题,需要在导入结束后回收权限。而且对于多个用户的导出,采用这种方式将变得十分麻烦,必须对每个用户分别处理。

还有一种方式,采用NETWORK_LINK的方式可以解决JOB的导入问题:

SQL> CONN TEST/TEST@172.25.88.92/TESTZJ已连接。
SQL> DECLARE
2 V_JOB NUMBER;
3 BEGIN
4 DBMS_JOB.SUBMIT(V_JOB, 'NULL;', SYSDATE, 'SYSDATE + 1');
5 COMMIT;
6 END;
7 /

PL/SQL 过程已成功完成。

SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> REVOKE IMP_FULL_DATABASE FROM A;

撤销成功。

SQL> GRANT CREATE DATABASE LINK TO A;

授权成功。

SQL> CONN A/A@YTK102已连接。
SQL> CREATE DATABASE LINK TESTZJ CONNECT TO TEST IDENTIFIED BY TEST USING '172.25.88.92/TESTZJ';

数据库链接已创建。

SQL> SELECT * FROM GLOBAL_NAME@TESTZJ;

GLOBAL_NAME
-------------------------------------------
TESTZJ

在导入的时候指定NETWORK_LINK参数:

E:>impdp a/a@ytk102 directory=d_output remap_schema=test:a network_link=testzj
include=job

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 10:59:08

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
自动启用 FLASHBACK 以保持数据库完整性。
启动 "A"."SYS_IMPORT_SCHEMA_01": a/********@ytk102 directory=d_output remap_sch
ema=test:a network_link=testzj include=job
正在使用 BLOCKS 方法进行估计
...处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA使用 BLOCKS 方法的总估计: 0 KB处理对象类型 SCHEMA_EXPORT/JOB作业 "A"."SYS_IMPORT_SCHEMA_01" 已于 10:59:12 成功完成

查询用户的JOB,发现JOB已经导入:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

JOB WHAT
---------- ------------------------------
66 NULL;
42862 NULL;

不过这种方法有的时候并不适用。很多时候使用数据泵的原因就是网络无法连通,或者处于安全性的考虑也无法使用数据库链。因此,这种方法虽然很方便,但是使用范围比较有限。

查询了metalinkmetalink上有不少篇文章和这个问题类似,Oracle并没有给出什么好的解决方案,而是推荐使用SCHEDULE来替代JOB,或者使用IMP/EXP来替换数据泵。这显然是一种回避的方法。OracleBug No. 5856954中进行了描述。Oracle并没有给出具体FIX这个bug的版本。在10204计划修订bug列表中也没有找到fix这个问题的计划。

yangtingkun 发表于:2008.01.29 11:20 ::分类: ( ORACLE , Bug ) ::阅读:(681次) :: 评论 (2)
re: 数据泵无法导入JOB [回复]

我常用的做法是用IMP/EXP做数据结构及对象的逻辑备份,而是用DUMP做数据的逻辑备份。考虑到DUMP在备份恢复中常有的问题,不得已为之。

HEAP 评论于: 2008.03.31 09:30
re: 数据泵无法导入JOB [回复]

其实exp/imp进行逻辑备份也有不少问题

yangtingkun 评论于: 2008.03.31 18:32

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...