如果自动刷新可以成功,job自动刷新也应该没有问题。 出错原因: 1、创建Job时的用户的权限不够,如果运行:Refresh_all()来刷新快照,则必须有alter all snapshot的权限,而且Job可能就所属某个权限不够用户。 2、Job的设置可能错误,调试一下Job中的what是否正确。 3、自动刷新启动时,网络可能没有接通。 4、如果Job启动时使用的回滚段太小,而需要刷新的数据量又太大,则可能会出现回滚段不够的错误。另外,你可以将错误弄出来: 方法:在Job的What中增加异常处理部分,将错误保存在指定表中,例如: Begin --快找刷新部分 Refre.... --异常处理部分 EXCEPTION WHEN OTHERS THEN insert into tab_err(time,errs) values (sysdate,SQLERRM); commit; end;其中的SQLERRM就是错误的说明,这样你可以看到出错的原因,便于调试。 应该注意insert into tab_err(time,errs) values (sysdate,SQLERRM);语句不能出错,保存错误的列要足够长,sqlerrm的长度大概是500多点,你可以用substr截取一下,以保证不会超长。
出错原因:
1、创建Job时的用户的权限不够,如果运行:Refresh_all()来刷新快照,则必须有alter all snapshot的权限,而且Job可能就所属某个权限不够用户。
2、Job的设置可能错误,调试一下Job中的what是否正确。
3、自动刷新启动时,网络可能没有接通。
4、如果Job启动时使用的回滚段太小,而需要刷新的数据量又太大,则可能会出现回滚段不够的错误。另外,你可以将错误弄出来:
方法:在Job的What中增加异常处理部分,将错误保存在指定表中,例如:
Begin
--快找刷新部分
Refre....
--异常处理部分
EXCEPTION
WHEN OTHERS THEN
insert into tab_err(time,errs) values (sysdate,SQLERRM);
commit;
end;其中的SQLERRM就是错误的说明,这样你可以看到出错的原因,便于调试。
应该注意insert into tab_err(time,errs) values (sysdate,SQLERRM);语句不能出错,保存错误的列要足够长,sqlerrm的长度大概是500多点,你可以用substr截取一下,以保证不会超长。
我在运行日志文件dbalert找到了快照刷新的错误,说是权限不足,未给出口令,登录被拒绝。在查找远程对象时出错:[email protected]。其中mainuser是用户模式,但是我刷新的也都是该用户下的快照和刷新组,怎么会权限不够呢?
看你的情况,你的远程数据库的用户名和你当前用户名同名而且口令一样,因此你手动刷新时没有问题。不知我说的对不对。
的用法恐怕有问题。
SQLERRM需要先给本地变量,然后才用于sql语句。
SQL> execute DBMS_MVIEW.REFRESH('AMS.MV_AMSTASKLST', 'A', '', TRUE, FALSE,0,0,0, FALSE);
BEGIN DBMS_MVIEW.REFRESH('AMS.MV_AMSTASKLST', 'A', '', TRUE, FALSE,0,0,0, FALSE); END;*
ERROR 位于第 1 行:
ORA-30439: 'AMS.MV_AMSTASKLST' 刷新失败,因为ORA-30456: 'AMS.MV_AMSTASKLST'
cannot be refreshed because of insufficient privilege
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 617
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 674
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 654
ORA-06512: 在line 1