MVIEW REFRESH REMOTE USING DBLINK

MVIEW REFRESH REMOTE USING DBLINK

Set the job queue process to 0 purposefully and donot set this in production system, since this may interrupt all scheduled jobs

kIsH@xHydra<>ALTER system set job_queue_processes=0;

System altered.

Create a database link from target to source. Before this, verify the tns connectivity and listener.

kIsH@xHydra<>conn kish/password
Connected.
kIsH@xHydra<>create database link mvremote connect to kish identified by "password" using 'db9zx';

Database link created.

kIsH@xHydra<>SELECT * from DUAL@mvremote;

D
-
X

Check the total records in base table from source

kIsH@Xhydra<>select count(*) from ytbl;

  COUNT(*)
----------
   16000000

Create materialized view in remote database using dblink

kIsH@xHydra<>CREATE MATERIALIZED VIEW mvremote
    BUILD IMMEDIATE
    REFRESH COMPLETE ON DEMAND
    AS SELECT * FROM KISH.YTBL@mvremote;

Materialized view created.
kIsH@xHydra<>select count(*) from mvremote;

  COUNT(*)
----------
  1000000

Create a scheduler job for complete refresh of mview

kIsH@xHydra<>BEGIN
    DBMS_SCHEDULER.CREATE_JOB
    (
    job_name            => 'MV_MVREMOTE_REFRESH1',
    job_type            => 'PLSQL_BLOCK',
    job_action          => 'BEGIN DBMS_MVIEW.REFRESH(''MVREMOTE'');END;',
    number_of_arguments => 0,
    start_date          => SYSTIMESTAMP,
    repeat_interval     => 'FREQ=DAILY;',
    end_date            => NULL,
    enabled             => TRUE,
    auto_drop           => FALSE,
    comments            => 'This job refresh MVREMOTE every day'
    );
END;
/  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16

PL/SQL procedure successfully completed.

Verify the job

kIsH@xHydra<>SELECT owner,job_name,program_name,job_type,job_action FROM dba_scheduler_jobs WHERE job_name LIKE '%MVREMOTE%';

OWNER                JOB_NAME             PROGRAM_NAME         JOB_TYPE             JOB_ACTION
-------------------- -------------------- -------------------- -------------------- --------------------
KISH                 MV_MVREMOTE_REFRESH1                      STORED_PROCEDURE     REFRESH_MVREMOTE

kIsH@xHydra<>col USERNAME for a20
kIsH@xHydra<>set lines 200 pages 1000
kIsH@xHydra<>select s.username,s.sid,s.serial#,s.program,p.spid from v$process p inner join v$session s on (s.paddr = p.addr) where s.username='KISH';

USERNAME                    SID    SERIAL# PROGRAM                                          SPID
-------------------- ---------- ---------- ------------------------------------------------ ------------------------
KISH                          1      51465 sqlplus@staxhost (TNS V1-V3)                     5182

Check dbms_scheduler functions which can be used to run a job manually

kIsH@xHydra<>col text for a80
kIsH@xHydra<>SELECT name,type,text FROM dba_source WHERE text LIKE '%DBMS_SCHEDULER%';

NAME                 TYPE         TEXT
-------------------- ------------ --------------------------------------------------------------------------------
DBMS_SCHEDULER       PACKAGE        logging_level           IN PLS_INTEGER  DEFAULT DBMS_SCHEDULER.LOGGING_RUNS,
DBMS_WORKLOAD_CAPTUR PACKAGE        --    Jobs (DBMS_SCHEDULER/DBMS_JOB) will not be captured, no matter how
E

DBMS_REFRESH         PACKAGE        --   or FALSE indicates that DBMS_SCHEDULER will be used to create the
DBMS_FEATURE_REGISTE PROCEDURE       * DBMS_SCHEDULER   HWM is number of jobs per day
R_ALLHWM

DBMS_FEATURE_REGISTE PROCEDURE         HWM_DBMS_SCHEDULER_STR CONSTANT VARCHAR2(1000) :=
R_ALLHWM

DBMS_FEATURE_REGISTE PROCEDURE          ('HWM_DBMS_SCHEDULER',
R_ALLHWM

DBMS_FEATURE_REGISTE PROCEDURE           HWM_DBMS_SCHEDULER_STR,
R_ALLHWM

SYSLSBY_EDS_DDL_TRIG TRIGGER               DBMS_SCHEDULER.CREATE_JOB(
MGMT_CONFIG          PACKAGE BODY         DBMS_SCHEDULER.SET_ATTRIBUTE (p_job_name || '_' || inst_id,'instance_id'
                                  ,inst_id);

MGMT_CONFIG          PACKAGE BODY       DBMS_SCHEDULER.ENABLE (p_job_name || '_' || inst_id);
MGMT_CONFIG          PACKAGE BODY       -- DBMS_SCHEDULER.RUN_JOB(p_job_name || '_' || inst_id,FALSE);
MGMT_CONFIG          PACKAGE BODY             DBMS_SCHEDULER.SET_ATTRIBUTE (p_job_name || '_2_' || inst_id,'instan
                                  ce_id',inst_id);

MGMT_CONFIG          PACKAGE BODY           DBMS_SCHEDULER.ENABLE (p_job_name || '_2_' || inst_id);
MGMT_CONFIG          PACKAGE BODY       DBMS_SCHEDULER.RUN_JOB(JOB_NAME);
MGMT_CONFIG          PACKAGE BODY       DBMS_SCHEDULER.RUN_JOB(STATS_JOB_NAME);

15 rows selected.

DBMS_SCHEDULER.RUN_JOB can trigger the mview refresh job immediately.

kIsH@xHydra<>BEGIN
               DBMS_SCHEDULER.RUN_JOB
               (
                job_name => 'MV_MVREMOTE_REFRESH1',
                USE_CURRENT_SESSION => FALSE
               );
          END;
          /
BEGIN
*
ERROR at line 1:
ORA-27492: unable to run job "KISH"."MV_MVREMOTE_REFRESH1": scheduler unavailable
ORA-06512: at "SYS.DBMS_ISCHED", line 242
ORA-06512: at "SYS.DBMS_SCHEDULER", line 566
ORA-06512: at line 2

Set the job queue process parameter to higher value and execute the procedure again in target.

kIsH@xHydra<>ALTER system set job_queue_processes=20;

System altered.


kIsH@xHydra<>BEGIN
               DBMS_SCHEDULER.RUN_JOB
               (
                job_name => 'MV_MVREMOTE_REFRESH1',
                use_current_session => FALSE
               );
          END;
          /  2    3    4    5    6    7    8

PL/SQL procedure successfully completed.

Monitor the refresh from target database and all that can be seen is "SQL*Net more data from dblink" in general, unless there is a scarcity of any resource.
kIsH@xHydra<>col CURRMVOWNER for a20
kIsH@xHydra<>col CURRMVNAME for a20
kIsH@xHydra<>select * from v$mvrefresh;

       SID    SERIAL# CURRMVOWNER          CURRMVNAME               CON_ID
---------- ---------- -------------------- -------------------- ----------
        77      51278 KISH                 MVREMOTE                      1

kIsH@xHydra<>col ACTION for a20
kIsH@xHydra<>col EVENT for a20
kIsH@xHydra<>col username for a20
kIsH@xHydra<>col module for a20
kIsH@xHydra<>SELECT username,sid,serial#,action,module,program,event FROM v$session WHERE action='MV_MVREMOTE_REFRESH1';

USERNAME                    SID    SERIAL# ACTION               MODULE               PROGRAM              EVENT
-------------------- ---------- ---------- -------------------- -------------------- -------------------- --------------------
KISH                         77      51278 SQL*Net more data from dblink

Target mview is refreshed successfully in remote database.
kIsH@xHydra<>select count(*) from mvremote;

  COUNT(*)
----------
  16000000

Leave a Reply

Discover more from XscalibaL

Subscribe now to keep reading and get access to the full archive.

Continue reading