分类: Oracle
2010-05-05 10:48:34
JOB在导入导出的时候比较特殊,今天就碰到了一个没有想到的问题,正好整理记录一下。
Oracle生成的JOB的id在整个数据库中是唯一的。所有的JOB信息都存储在SYS的JOB$表中,主键ID由SYS.JOBSEQ生成。这样就保证了所有用户下的JOB都不会重复。
导入导出没有单独导入导出JOB的功能,只有在全库和用户模式下会导入导出JOB。JOB在导入导出过程中,最容易出现的错误就是JOB的id重复。由于在导出的时候,Oracle会记录每个JOB的ID,因此如果导入的时候在JOB id已经存在,则无法导入。
最可能出现这种问题的情况是把一个用户导入到当前库中的另一个用户中。那么由于JOB id已经存在,所以用户所有的JOB都无法导入。
今天碰到的情况是,从一个全库导出的DMP文件,以用户模式导入的话,不会导入该用户的JOB信息。
SQL> CONN YANGTK/YANGTK@TEST1已连接。
SQL>
SQL> CREATE USER A IDENTIFIED BY A;
用户已创建
SQL> GRANT CONNECT, RESOURCE TO A;
授权成功。
SQL> CREATE TABLE A.T AS SELECT ROWNUM ID FROM TAB;
表已创建。
SQL> CONN A/A@TEST1已连接。
SQL> DECLARE
2 V_JOB NUMBER;
3 BEGIN
4 DBMS_JOB.SUBMIT(V_JOB, 'NULL;', SYSDATE, 'SYSDATE + 1/24
5 COMMIT;
6 END;
7 /
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@TEST1已连接。
SQL> CREATE USER B IDENTIFIED BY B;
用户已创建
SQL> GRANT CONNECT, RESOURCE TO B;
授权成功。
E:>exp a/a@test1 file=a.dmp
Export: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:32:26 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
. 正在导出 pre-schema 过程对象和操作
. 正在导出用户 A 的外部函数库名称
. 导出 PUBLIC 类型同义词
. 导出私有类型同义词
. 正在导出用户 A 的对象类型定义即将导出 A 的对象 ...
. 正在导出数据库链接
. 正在导出序号
. 正在导出群集定义
. 即将导出 A 的表通过常规路径 ...
. . 正在导出表 T 0 行被导出
. 正在导出同义词
. 正在导出视图
. 正在导出存储的过程
. 正在导出运算符
. 正在导出引用完整性约束条件
. 正在导出触发器
. 正在导出索引类型
. 正在导出位图, 功能性索引和可扩展索引
. 正在导出后期表活动
. 正在导出实体化视图
. 正在导出快照日志
. 正在导出作业队列
. 正在导出刷新组和子组
. 正在导出维
. 正在导出 post-schema 过程对象和操作
. 正在导出统计在没有警告的情况下成功终止导出。
E:>imp yangtk/yangtk@test1 file=a.dmp fromuser=a touser=b
Import: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:33:57 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
警告: 此对象由 A 导出, 而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将A的对象导入到 B
. . 正在导入表 "T" 0行被导入
IMP-00017: 由于 ORACLE 的 1 错误,以下的语句失败
"BEGIN DBMS_JOB.ISUBMIT(JOB=>1,WHAT=>'NULL;',NEXT_DATE=>TO_DATE('2005-09-0"
"7:19:26:29','YYYY-MM-DD:HH24:MI:SS'),INTERVAL=>'SYSDATE + 1/24',NO_PARSE=>T"
"RUE); END;"
IMP-00003: 遇到 ORACLE 错误 1
ORA-00001: 违反唯一约束条件 (SYS.I_JOB_JOB)
ORA-06512: 在"SYS.DBMS_JOB", line 97
ORA-06512: 在line 1成功终止导入,但出现警告。
E:>
由于JOB ID已经存在,导致了上面的错误,删掉JOB后重试:
SQL> CONN A/A@TEST1已连接。
SQL> EXEC DBMS_JOB.REMOVE(1)
PL/SQL 过程已成功完成。
SQL> COMMIT;
提交完成。
SQL> CONN YANGTK/YANGTK@TEST1已连接。
SQL> DROP USER B CASCADE;
用户已丢弃
SQL> GRANT CONNECT, RESOURCE TO B IDENTIFIED BY B;
授权成功。
E:>imp yangtk/yangtk@test1 file=a.dmp fromuser=a touser=b
Import: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:37:50 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
警告: 此对象由 A 导出, 而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将A的对象导入到 B
. . 正在导入表 "T" 0行被导入成功终止导入,但出现警告。
SQL> COL WHAT FORMAT A40
SQL> COL LOG_USER FORMAT A10
SQL> COL PRIV_USER FORMAT A10
SQL> COL SCHEMA_USER FORMAT A10
SQL> SELECT JOB, LOG_USER, PRIV_USER, SCHEMA_USER, WHAT FROM USER_JOBS;
JOB LOG_USER PRIV_USER SCHEMA_USE WHAT
---------- ---------- ---------- ---------- -------------------------------
1 YANGTK YANGTK B NULL;
SQL> SHOW USER
USER 为"YANGTK"
发现JOB居然导入到B用户下,而是JOB却在YANGTK用户下运行。如果想要正确的导入JOB则只能采用下面的方法:
SQL> DROP USER B CASCADE;
用户已丢弃
SQL> GRANT CONNECT, RESOURCE TO B IDENTIFIED BY B;
授权成功。
E:>imp b/b@test1 file=a.dmp full=y
Import: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:52:28 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
警告: 此对象由 A 导出, 而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将A的对象导入到 B
. . 正在导入表 "T" 0行被导入成功终止导入,但出现警告。
SQL> SELECT JOB, LOG_USER, PRIV_USER, SCHEMA_USER, WHAT FROM DBA_JOBS;
JOB LOG_USER PRIV_USER SCHEMA_USE WHAT
---------- ---------- ---------- ---------- ----------------------------
1 B B B NULL;
下面来看从全库中导入的情况:
E:>exp yangtk/yangtk@test1 file=full.dmp full=y
Export: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:41:37 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出整个数据库...
. 正在导出表空间定义
. 正在导出配置文件
. 正在导出用户定义
. 正在导出角色
. 正在导出资源成本
. 正在导出回退段定义
. 正在导出数据库链接
. 正在导出序号
. 正在导出目录别名
. 正在导出上下文名空间
. 正在导出外部函数库名称
. 导出 PUBLIC 类型同义词
. 导出私有类型同义词
. 正在导出对象类型定义
. 正在导出系统过程对象和操作
. 正在导出 pre-schema 过程对象和操作
. 正在导出群集定义
. 即将导出 SYSTEM 的表通过常规路径 ...
. . 正在导出表 AQ$_INTERNET_AGENTS 0 行被导出
. . 正在导出表 AQ$_INTERNET_AGENT_PRIVS 0 行被导出
. . 正在导出表 DEF$_AQCALL 0 行被导出
. . 正在导出表 DEF$_AQERROR 0 行被导出
. . 正在导出表 DEF$_CALLDEST 0 行被导出
. . 正在导出表 DEF$_DEFAULTDEST 0 行被导出
. . 正在导出表 DEF$_DESTINATION 0 行被导出
. . 正在导出表 DEF$_ERROR 0 行被导出
. . 正在导出表 DEF$_LOB 0 行被导出
. . 正在导出表 DEF$_ORIGIN 0 行被导出
. . 正在导出表 DEF$_PROPAGATOR 0 行被导出
. . 正在导出表 DEF$_PUSHED_TRANSACTIONS 0 行被导出
. . 正在导出表 DEF$_TEMP$LOB 0 行被导出
. . 正在导出表 HELP 918 行被导出
. . 正在导出表 LOGSTDBY$APPLY_MILESTONE 0 行被导出
. . 正在导出表 LOGSTDBY$APPLY_PROGRESS
. . 正在导出分区 P0 0 行被导出
. . 正在导出表 LOGSTDBY$EVENTS 0 行被导出
. . 正在导出表 LOGSTDBY$PARAMETERS 0 行被导出
. . 正在导出表 LOGSTDBY$PLSQL 0 行被导出
. . 正在导出表 LOGSTDBY$SCN 0 行被导出
. . 正在导出表 LOGSTDBY$SKIP 0 行被导出
. . 正在导出表 LOGSTDBY$SKIP_TRANSACTION 0 行被导出
. . 正在导出表 REPCAT$_AUDIT_ATTRIBUTE 2 行被导出
. . 正在导出表 REPCAT$_AUDIT_COLUMN 0 行被导出
. . 正在导出表 REPCAT$_COLUMN_GROUP 0 行被导出
. . 正在导出表 REPCAT$_CONFLICT 0 行被导出
. . 正在导出表 REPCAT$_DDL 0 行被导出
. . 正在导出表 REPCAT$_EXCEPTIONS 0 行被导出
. . 正在导出表 REPCAT$_EXTENSION 0 行被导出
. . 正在导出表 REPCAT$_FLAVORS 0 行被导出
. . 正在导出表 REPCAT$_FLAVOR_OBJECTS 0 行被导出
. . 正在导出表 REPCAT$_GENERATED 0 行被导出
. . 正在导出表 REPCAT$_GROUPED_COLUMN 0 行被导出
. . 正在导出表 REPCAT$_INSTANTIATION_DDL 0 行被导出
. . 正在导出表 REPCAT$_KEY_COLUMNS 0 行被导出
. . 正在导出表 REPCAT$_OBJECT_PARMS 0 行被导出
. . 正在导出表 REPCAT$_OBJECT_TYPES 28 行被导出
. . 正在导出表 REPCAT$_PARAMETER_COLUMN 0 行被导出
. . 正在导出表 REPCAT$_PRIORITY 0 行被导出
. . 正在导出表 REPCAT$_PRIORITY_GROUP 0 行被导出
. . 正在导出表 REPCAT$_REFRESH_TEMPLATES 0 行被导出
. . 正在导出表 REPCAT$_REPCAT 0 行被导出
. . 正在导出表 REPCAT$_REPCATLOG 0 行被导出
. . 正在导出表 REPCAT$_REPCOLUMN 0 行被导出
. . 正在导出表 REPCAT$_REPGROUP_PRIVS 0 行被导出
. . 正在导出表 REPCAT$_REPOBJECT 0 行被导出
. . 正在导出表 REPCAT$_REPPROP 0 行被导出
. . 正在导出表 REPCAT$_REPSCHEMA 0 行被导出
. . 正在导出表 REPCAT$_RESOLUTION 0 行被导出
. . 正在导出表 REPCAT$_RESOLUTION_METHOD 19 行被导出
. . 正在导出表 REPCAT$_RESOLUTION_STATISTICS 0 行被导出
. . 正在导出表 REPCAT$_RESOL_STATS_CONTROL 0 行被导出
. . 正在导出表 REPCAT$_RUNTIME_PARMS 0 行被导出
. . 正在导出表 REPCAT$_SITES_NEW 0 行被导出
. . 正在导出表 REPCAT$_SITE_OBJECTS 0 行被导出
. . 正在导出表 REPCAT$_SNAPGROUP 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_OBJECTS 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_PARMS 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_REFGROUPS 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_SITES 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_STATUS 3 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_TARGETS 0 行被导出
. . 正在导出表 REPCAT$_TEMPLATE_TYPES 2 行被导出
. . 正在导出表 REPCAT$_USER_AUTHORIZATIONS 0 行被导出
. . 正在导出表 REPCAT$_USER_PARM_VALUES 0 行被导出
. . 正在导出表 SQLPLUS_PRODUCT_PROFILE 0 行被导出
. 即将导出 OUTLN 的表通过常规路径 ...
. . 正在导出表 OL$ 0 行被导出
. . 正在导出表 OL$HINTS 0 行被导出
. . 正在导出表 OL$NODES 0 行被导出
. 即将导出 DBSNMP 的表通过常规路径 ...
. 即将导出 WMSYS 的表通过常规路径 ...
. . 正在导出表 WM$ADT_FUNC_TABLE 0 行被导出
. . 正在导出表 WM$ENV_VARS 1 行被导出
. . 正在导出表 WM$INSTEADOF_TRIGS_TABLE 0 行被导出
. . 正在导出表 WM$LOCKROWS_INFO 0 行被导出
. . 正在导出表 WM$MODIFIED_TABLES 0 行被导出
. . 正在导出表 WM$MW_TABLE
. . 正在导出表 WM$NESTED_COLUMNS_TABLE 0 行被导出
. . 正在导出表 WM$NEXTVER_TABLE 0 行被导出
. . 正在导出表 WM$REPLICATION_TABLE 0 行被导出
. . 正在导出表 WM$RESOLVE_WORKSPACES_TABLE 0 行被导出
. . 正在导出表 WM$RIC_TABLE 0 行被导出
. . 正在导出表 WM$RIC_TRIGGERS_TABLE 0 行被导出
. . 正在导出表 WM$TMP_DBA_CONSTRAINTS 0 行被导出
. . 正在导出表 WM$UDTRIG_DISPATCH_PROCS 0 行被导出
. . 正在导出表 WM$UDTRIG_INFO 0 行被导出
. . 正在导出表 WM$VERSIONED_TABLES 0 行被导出
. . 正在导出表 WM$VERSIONED_TABLES_UNDO_CODE 0 行被导出
. . 正在导出表 WM$VERSION_HIERARCHY_TABLE 1 行被导出
. . 正在导出表 WM$VERSION_TABLE 0 行被导出
. . 正在导出表 WM$VT_ERRORS_TABLE 0 行被导出
. . 正在导出表 WM$WORKSPACES_TABLE 1 行被导出
. . 正在导出表 WM$WORKSPACE_PRIV_TABLE 8 行被导出
. . 正在导出表 WM$WORKSPACE_SAVEPOINTS_TABLE 0 行被导出
. 即将导出 YANGTK 的表通过常规路径 ...
. 即将导出 A 的表通过常规路径 ...
. . 正在导出表 T 0 行被导出
. 即将导出 B 的表通过常规路径 ...
. . 正在导出表 T 0 行被导出
. 正在导出同义词
. 正在导出视图
. 正在导出引用完整性约束条件
. 正在导出存储的过程
. 正在导出运算符
. 正在导出索引类型
. 正在导出位图, 功能性索引和可扩展索引
. 正在导出后期表活动
. 正在导出触发器
. 正在导出实体化视图
. 正在导出快照日志
. 正在导出作业队列
. 正在导出刷新组和子组
. 正在导出维
. 正在导出 post-schema 过程对象和操作
. 正在导出用户历史记录表
. 正在导出默认值和系统审计选项
. 正在导出统计在没有警告的情况下成功终止导出。
E:>
SQL> CONN B/B@TEST1已连接。
SQL> EXEC DBMS_JOB.REMOVE(1)
PL/SQL 过程已成功完成。
SQL> COMMIT;
提交完成。
SQL> CONN YANGTK/YANGTK@TEST1已连接。
SQL> GRANT CONNECT, RESOURCE TO C IDENTIFIED BY C;
授权成功。
E:>imp yangtk/yangtk@test1 file=full.dmp fromuser=b touser=c
Import: Release 9.2.0.1.0 - Production on 星期三 9月 7 19:57:48 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将B的对象导入到 C
. . 正在导入表 "T" 0行被导入成功终止导入,但出现警告。
E:>
SQL> SELECT * FROM DBA_JOBS;
未选定行
从 全库逻辑备份按用户导入时,Oracle没有导入JOB,不知道这个是Oracle的bug,还是故意这样实现的。这个问题在导入的用户名和导出的用户名 不同时出现,如果导入的用户名和导出的用户名一致,则不会出现这个问题。怀疑是Oracle调用DBMS_IJOB包时出现的问题。
总之,EXP/IMP的时候需要考虑JOB,并在操作结束后检查JOB信息是否已经正确的导入。
文章来自互联网,感谢作者!