另外9i上创建快照,已设置了job及snapshot等初始参数。能手动刷新,但job自动刷新时总是出错,请问是何原因?

解决方案 »

  1.   

    如果自动刷新可以成功,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截取一下,以保证不会超长。
      

  2.   

    qiuyang_wang(小数点) 你好
    我在运行日志文件dbalert找到了快照刷新的错误,说是权限不足,未给出口令,登录被拒绝。在查找远程对象时出错:[email protected]。其中mainuser是用户模式,但是我刷新的也都是该用户下的快照和刷新组,怎么会权限不够呢?
      

  3.   

    看你的情况可能是dblink的原因,因为你创建dblink时Connection Details选项用的不是Fixed User,很可能是Connected User,所以,建议你将dblink:lddb.us.oracle.com设为Fixed User并输入正确的用户名和口令。
      看你的情况,你的远程数据库的用户名和你当前用户名同名而且口令一样,因此你手动刷新时没有问题。不知我说的对不对。
      

  4.   

    insert into tab_err(time,errs) values (sysdate,SQLERRM);
    的用法恐怕有问题。
    SQLERRM需要先给本地变量,然后才用于sql语句。
      

  5.   

    刷新快照需要什么权限?或者赋予什么决策就可以?以下是我遇到的问题:
    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
      

  6.   

    qiuyang_wang(小数点),你好,好像我建 的db_link没有问题,是固定的用户名和密码。我想不一定非要是sys用户吧:)。怎么会要远程访问sys对象呢,我不明白:(,不知哪位在9i上创建过自动刷新的快照,把详细步骤写下来,好吗
      

  7.   

    grant execute on DBMS_MVIEW  to ams