Oracle exp/imp用户不同导致job停止工作

本文介绍Oracle数据库中因使用system用户进行导入/导出导致普通用户job出现问题的现象及解决方案,包括修复job属主信息、刷新实体化视图等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为oracle数据库用户很多,统一用system用户进行导入/导出,导致普通用户的job作业停止工作

使用一下语句查看系统里所有的job

SQL>select * from dba_jobs;

发现所有普通用户job的LOG_USER和PRIV_USER字段都变成了system,而SCHEMA_USER还是原来的用户的schema名字。这是由于imp导入用户与job的属主用户不同造成的。

解决方法之一用job属主用户进行导入,参考”Oracle Jobs与Exp/Imp

重新导入太麻烦了,也可以这样解决:

以sysdba角色登录,执行一下语句修正两个字段LOG_USER和PRIV_USER的值为SCHEMA_USER字段的值

- -login sys as sysdba
update dba_jobs set log_user=‘username’,priv_user=‘username’ where schema_user=‘username’;
commit;

如果job的broken属性是Y,以job owner用户登录执行以下语句:

- -login as job’s owner, 
BEGIN
  FOR i IN (SELECT job FROM user_jobs WHERE broken=‘Y’)
  LOOP
       dbms_job.broken(i.job,false);
       dbms_job.run(i.job,true); 
  END LOOP;
END;

或者这样执行
SQL>exec dbms_job.broken(job_id,false);
SQL>exec dbms_job.run(job_id);

这样就o了

----------------------------------------------------------------------------------------------

Oracle Jobs与Exp/Imp

最近因为一点儿小问题,用Exp/Imp做了一次数据恢复。恢复以后本来正常的snapshot刷新出了问题,job不工作了,本来一天要更新两次数据,现在数据停止更新了。
用system登录oracle,然后select * from dba_jobs;发现所有的jobs的LOG_USER和PRIV_USER变成了system用户,而SCHEMA_USER还是原来的用户,而且NEXT_DATE也变的面目全非。原来是Imp时jobs全部corrupt掉了。

出现这个情况的原因是Exp和Imp的时候都是使用的system用户,所以为带有jobs的用户做Exp/Imp时,一定要用这个用户自身来导入、导出。

因为用户已经删除没有机会再重新Exp,只好重新用拥有jobs的用户来进行Imp,一定要为该用户授予DBA角色,不然无法进行导入,会有错误提示:

“IMP-00013: 只有 DBA 才能导入由其它 DBA 导出的文件
IMP-00000: 未成功终止导入”

即使授予了DBA角色,仍然会有警告:

“警告: 此对象由 SYSTEM 导出, 而不是当前用户”

但并不影响正确的导入。

导入完成后,重新查看jobs发现已经都正常了。
手工刷新一次,仍然提示错误:

“已连接。
BEGIN proc_refreshsnapshot; END;

*
ERROR 位于第 1 行:
ORA-12034: “xxx”.”xxx” 上的实体化视图日志比上次刷新后的内容新
ORA-06512: 在”SYS.DBMS_SNAPSHOT”, line 803
ORA-06512: 在”SYS.DBMS_SNAPSHOT”, line 860
ORA-06512: 在”SYS.DBMS_SNAPSHOT”, line 841
ORA-06512: 在”xxx.PROC_REFRESHSNAPSHOT”, line 3
ORA-06512: 在line 1″

把所有snapshot table做一次完全刷新,exec dbms_snapshot.refresh(‘xxx’,'C’);,
问题解决,现在一切正常。

--------------------------------------------------------------------------------------------------

job在exp/imp中的表现

过程:以system用户登录用owner参数指定多个用户,在导入是用fromuser touser参数指定单个用户进行导入.

结果:过程中没有报错,但在第二天的日志中发现错误提示:job不能执行,没有相应的对象。

经查是用户的job在导入后其log_user,priv_user都变成了system但schema_user还是原来的用户名,因为system用户下没有相应的对象所以报错。

解决方法:在用户下重建job并删除system的job。

建议:以相同的用户名进行导入导出。

创建job

variable jobno number

begin

dbms_job.submit(:jobno,'yao zhi xing de ming ling huo cun cu guo cheng;',shijian,'jian ge shi jian');

[commit;]

end;

/

* 不少参数要加引号。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值