今天用expdp&impdp迁移数据到另一个新库
迁移后有个定时任务执行失败如下
Errors in file /oracle/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_j001_3211.trc:
ORA-12012: 自动执行作业 150812 出错
ORA-23404: 刷新组 "ttd"."xxxx" 不存在
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.DBMS_REFRESH", line 23
ORA-06512: 在 "SYS.DBMS_REFRESH", line 195
ORA-06512: 在 line 1
Wed Oct 22 12:08:45 2014
查询刷新组,发现新环境刷新组不存在,原来环境有
select rowner, rname, job, interval from all_refresh;
对比原来的库的物化视图和新导入库物化视图的定义发现,新导入库中物化视图少了start with 和 next 子句的话,这样就导致没有创建刷新组,由于原来的job中的刷新任务导入到新库中,所以新库在调用dbms_refresh.refresh时报错
但是可以使用exec dbms_mview.refresh('mv');进行刷新
问题解决方法:
这个错误还需要从materialized view的创建开始追溯,因为如果在create materialized view语句中加入start with 和 next 子句的话,创建MV的过程中会自动创建一个job,制定定期刷新计划,例如:
create materialized view t1_mv refresh fast
start with to_date('21-07-2009 17:15:00', 'dd-mm-yyyy hh24:mi:ss')
next TRUNC(SYSDATE,'HH')+375/1440
with primary key
as select * from t1;
SQL> select job, schema_user, interval, what from all_jobs;
JOB SCHEMA_USER INTERVAL WHAT
---------- ------------------ ----------------------------------- ----------------------------------------------
21 WANGXIAOQI TRUNC(SYSDATE,'HH')+375/1440 dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"');
SQL>
可以看到,这个job中的执行内容是:dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"'); 而不是我们普通手动刷新MV时用的 dbms_mview.refresh 。
再来研究一下dbms_refresh这个数据包,这个包是用于产生一个刷新组以方便MV一组为单位统一刷新的。而当MV被制定刷新策略的方式指定时,会自动创建一个刷新组,并将该MV添加至这个刷新组中,所以job可以使用dbms_refresh.refresh来进行刷新。可以来看一下:
SQL> select rowner, rname, job, interval from all_refresh where rname = 'T1_MV';
ROWNER RNAME JOB INTERVAL
-------------------- ---------------- ---------- ----------------------------------------
WANGXIAOQI T1_MV 21 TRUNC(SYSDATE,'HH')+375/1440
再看这个组的成员:
SQL> select rowner, rname, job, interval from all_refresh_children where rname = 'T1_MV';
ROWNER RNAME JOB INTERVAL
-------------------- ---------------- ---------- ----------------------------------------
WANGXIAOQI T1_MV 21 TRUNC(SYSDATE,'HH')+375/1440
迁移后有个定时任务执行失败如下
Errors in file /oracle/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_j001_3211.trc:
ORA-12012: 自动执行作业 150812 出错
ORA-23404: 刷新组 "ttd"."xxxx" 不存在
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.DBMS_REFRESH", line 23
ORA-06512: 在 "SYS.DBMS_REFRESH", line 195
ORA-06512: 在 line 1
Wed Oct 22 12:08:45 2014
查询刷新组,发现新环境刷新组不存在,原来环境有
select rowner, rname, job, interval from all_refresh;
对比原来的库的物化视图和新导入库物化视图的定义发现,新导入库中物化视图少了start with 和 next 子句的话,这样就导致没有创建刷新组,由于原来的job中的刷新任务导入到新库中,所以新库在调用dbms_refresh.refresh时报错
但是可以使用exec dbms_mview.refresh('mv');进行刷新
问题解决方法:
删除新库中的物化视图,然后重新创建,同时删除job中的原来的刷新任务,因为再次创建物化视图时会重新创建job如果不删除就会有个定时任务
这个错误还需要从materialized view的创建开始追溯,因为如果在create materialized view语句中加入start with 和 next 子句的话,创建MV的过程中会自动创建一个job,制定定期刷新计划,例如:
create materialized view t1_mv refresh fast
start with to_date('21-07-2009 17:15:00', 'dd-mm-yyyy hh24:mi:ss')
next TRUNC(SYSDATE,'HH')+375/1440
with primary key
as select * from t1;
SQL> select job, schema_user, interval, what from all_jobs;
JOB SCHEMA_USER INTERVAL WHAT
---------- ------------------ ----------------------------------- ----------------------------------------------
21 WANGXIAOQI TRUNC(SYSDATE,'HH')+375/1440 dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"');
SQL>
可以看到,这个job中的执行内容是:dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"'); 而不是我们普通手动刷新MV时用的 dbms_mview.refresh 。
再来研究一下dbms_refresh这个数据包,这个包是用于产生一个刷新组以方便MV一组为单位统一刷新的。而当MV被制定刷新策略的方式指定时,会自动创建一个刷新组,并将该MV添加至这个刷新组中,所以job可以使用dbms_refresh.refresh来进行刷新。可以来看一下:
SQL> select rowner, rname, job, interval from all_refresh where rname = 'T1_MV';
ROWNER RNAME JOB INTERVAL
-------------------- ---------------- ---------- ----------------------------------------
WANGXIAOQI T1_MV 21 TRUNC(SYSDATE,'HH')+375/1440
再看这个组的成员:
SQL> select rowner, rname, job, interval from all_refresh_children where rname = 'T1_MV';
ROWNER RNAME JOB INTERVAL
-------------------- ---------------- ---------- ----------------------------------------
WANGXIAOQI T1_MV 21 TRUNC(SYSDATE,'HH')+375/1440