因为oracle数据库用户很多,统一用system用户进行导入/导出,导致普通用户的job作业停止工作
使用一下语句查看系统里所有的job
1 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字段的值
1 - -login sys as sysdba
2 update dba_jobs set log_user=‘username’,priv_user=‘username’ where schema_user=‘username’;
3 commit;
如果job的broken属性是Y,以job owner用户登录执行以下语句:
1 - -login as job’s owner,
2 BEGIN
3 FOR i IN (SELECT job FROM user_jobs WHERE broken=‘Y’)
4 LOOP
5 dbms_job.broken(i.job,false);
6 dbms_job.run(i.job,true);
7 END LOOP;
8 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’);,
问题解决,现在一切正常。
--------------------------------------------------------------------------------------------------
过程:以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;
/
* 不少参数要加引号。