Oracle Advanced Replication

26 Aug

I. Tujuan
Seandainya kita memiliki kantor cabang dan diinginkan untuk mengetahui perubahan transaksi yang terjadi di kantor cabang. Selain itu kantor pusat sesekali harus juga mengupdate data kantor cabang sedangkan jaringan yang menghubungkan antara kantor cabang dan pusat terbatas bandwidth dan performancenya (sering putus), maka salah satu solusinya adalah menggunakan Oracle advance replikasi. Berikut acuan untuk prosedur instalasi Oracle 10g advance replikasi, pada contoh di bawah ini 2 site akan memiliki data yang sama pada interval tertentu. Pada pembahasan ini tidak disertakan konfigurasi VPN.
II. Cara Pengerjaan

1. Install 2 site dengan oracle 10g (dalam contoh ini O/S menggunakan Oracle Enterprise Linux 5), setelah berhasil melakukan instalasi oracle 10g, jangan lupa untuk mengatur agar tnsnames.ora juga dapat mengakses site lawannya.

ISCATM
2. Unlock user scott dan setup global
ORACLE_SID=iscatm; export ORACLE_SID
sqlplus / as sysdba
alter user scott account unlock;
alter user scott identified by tiger;
conn scott/tiger;
conn system/ORACLE0@iscatm
alter system set global_names=TRUE;
alter system set job_queue_processes = 1;

3. create admin replikasi dan menyiapkan grant yang dibutuhkan
CREATE USER repadmin IDENTIFIED BY repadmin;

BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => ‘repadmin’);
END;
/

GRANT SELECT ANY DICTIONARY TO repadmin;

BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => ‘repadmin’);
END;
/

BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => ‘repadmin’,
privilege_type => ‘receiver’,
list_of_gnames => NULL);
END;
/

4. Membuat Schedule job yang digunakan untuk melakukan push transaksi dari master sesuai dengan interval yang diatur, sesuaikan dengan bandwidth, kualitas jaringan.
CONNECT repadmin/repadmin@iscatm

BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
— interval 1 jam
interval => ‘SYSDATE + 1/24’,
delay_seconds => 0);
END;
/

ISCATM2
5. Ulangi langkah 2 s/d 4 untuk site lawannya
6. unlock user scott dan setup global
ORACLE_SID=iscatm2; export ORACLE_SID
sqlplus / as sysdba
alter user scott account unlock;
alter user scott identified by tiger;
conn scott/tiger;

conn system/ORACLE0@iscatm2
alter system set global_names=TRUE;
alter system set job_queue_processes = 1;

7. create admin replikasi dan menyiapkan grant yang dibutuhkan

CREATE USER repadmin IDENTIFIED BY repadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => ‘repadmin’);
END;
/

GRANT SELECT ANY DICTIONARY TO repadmin;

BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => ‘repadmin’);
END;
/

BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => ‘repadmin’,
privilege_type => ‘receiver’,
list_of_gnames => NULL);
END;
/

8. Membuat Schedule job yang digunakan untuk melakukan push transaksi dari master sesuai dengan interval yang diatur, sesuaikan dengan bandwidth, kualitas jaringan.

CONNECT repadmin/repadmin@iscatm2

BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
— interval 1 jam
interval => ‘SYSDATE + 1/24’,
delay_seconds => 0);
END;
/

ISCATM
9. Membuat private db links

conn system/ORACLE0@iscatm
create public database link iscatm2 using ‘iscatm2’;
conn repadmin/repadmin@iscatm
create database link iscatm2 connect to repadmin identified by repadmin;

conn repadmin/repadmin@iscatm
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => ‘ISCATM2.LOCALDOMAIN’,
— interval 10 menit
interval => ‘SYSDATE + (1/144)’,
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
/
ISCATM2
10. Ulangi untuk membuat private db links pada site lawan.
conn system/ORACLE0@iscatm2
create public database link iscatm using ‘iscatm’;
conn repadmin/repadmin@iscatm2
create database link iscatm connect to repadmin identified by repadmin;

conn repadmin/repadmin@iscatm2
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => ‘ISCATM.LOCALDOMAIN’,
— interval 10 menit
interval => ‘SYSDATE + (1/144)’,
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
/

ISCATM
11. membuat replication group untuk MASTERDEF site, Register objects dan menambahkan master desination site. Dalam contoh pembahasan ini tabel – tabel yang direplikasi adalah scott.dept dan scott.emp.

conn repadmin/repadmin@iscatm
begin
dbms_repcat.create_master_repgroup (
gname => ‘scott_repg’);
end;
/

BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => ‘scott_repg’,
type => ‘TABLE’,
oname => ‘EMP’,
sname => ‘scott’,
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/

BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => ‘scott_repg’,
type => ‘TABLE’,
oname => ‘DEPT’,
sname => ‘scott’,
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/

BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => ‘scott_repg’,
master => ‘iscatm2’,
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => ‘ASYNCHRONOUS’);
END;
/

conn repadmin/repadmin@iscatm
SELECT DBLINK FROM DBA_REPSITES WHERE GNAME = ‘SCOTT_REPG’;

conn repadmin/repadmin@iscatm
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => ‘scott’,
oname => ’emp’,
type => ‘TABLE’,
min_communication => TRUE);
END;
/

BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => ‘scott’,
oname => ‘dept’,
type => ‘TABLE’,
min_communication => TRUE);
END;
/

ISCATM dan ISCATM2
12. Membuat skrip repmon.sql seperti dibawah ini untuk masing – masing site, skrip ini berguna melakukan monitoring replikasi.

rem ————————————————————-
rem http://www.orafaq.com/scripts/advrepl/repmon.txt
rem ————————————————————-
rem Filename: repmon.sql
rem Purpose: Monitor replication status, sites and groups
rem Date: 03-Oct-2000
rem Author: Frank Naude, Oracle FAQ
rem ————————————————————-
connect repadmin/repadmin
set pages 50000
col sname format a20 head “SchemaName”
col masterdef format a10 head “MasterDef?”
col oname format a20 head “ObjectName”
col gname format a20 head “GroupName”
col object format a35 trunc
col dblink format a35 head “DBLink”
col message format a25
col broken format a6 head “Broken?”

prompt Replication schemas/ sites
select sname, masterdef, dblink
from sys.dba_repschema;

prompt RepCat Log (after a while you should see no entries):
select request, status, message, errnum
from sys.dba_repcatlog;

prompt Entries in the job queue
select job, last_date, last_sec, next_date, next_sec, broken, failures,
what
from sys.dba_jobs
where schema_user = ‘REPADMIN’;

prompt Replication Status:
select sname, master, status
from sys.dba_repcat;

— Returns all conflict resolution methods
— select * from all_repconflict;

— Returns all resolution methods in use
— select * from all_represolution;

prompt Objects registered for replication
select gname, type||’ ‘||sname||’.’||oname object, status
from sys.dba_repobject;

ISCATM
13. Memulai replikasi, dengan terlebih dulu memeriksa apakah DBA_REPCATLOG sudah bernilai 0, jika belum replikasi belum dapat dijalankan. Pantau terus sampai kondisi bernilai 0.

conn repadmin/repadmin@iscatm
SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = ‘SCOTT_REPG’;

14. Start Replikasi
conn repadmin/repadmin@iscatm
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => ‘scott_repg’);
END;
/

15. status replikasi, ada beberapa status replikasi :
a. NORMAL: Normal unquiesced state.
b. QUIESCING: Being quiesced, but some non-DBA sessions are still active.
c. QUIESCED: Quiesced; no non-DBA sessions are active or allowed.

conn repadmin/repadmin@iscatm
SELECT GNAME, STATUS FROM DBA_REPGROUP;
conn repadmin/repadmin@iscatm2
SELECT GNAME, STATUS FROM DBA_REPGROUP;

16. Untuk menghentikan replikasi
conn repadmin/repadmin@iscatm
BEGIN
DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY (
gname => ‘scott_repg’);
END;
/

17. test replikasi salah satu site
conn scott/tiger@iscatm
select * from dept;
insert into dept values (50,’DUMMY’,’DUMMY’);
commit;
select * from dept;
select * from dept@iscatm2;

18. jika isi data antara 2 site belum sama, kemungkinan interval job belum terlampaui (job belum dijalankan), untuk memaksa agar job segera dijalankan. Maka terlebih dulu harus mengetahui no job, jalankan repmon.sql.

conn repadmin/repadmin@iscatm
@repmon.sql;

BEGIN
dbms_job.run(49);
dbms_job.run(50);
dbms_job.run(51);
END;
/

conn scott/tiger@iscatm2
select * from dept order by deptno;

ISCATM2
19. Terlihat isi tabel dept di antara 2 site kini telah sama, sebaliknya kita juga dapat melakukan proses insert, update dan delete dari site lawan.

conn scott/tiger@iscatm2
delete dept where deptno > 40;
commit;
select * from dept;
select * from dept@iscatm;

20. Sama dengan langkah no 18, jika isi data antara 2 site belum sama, kemungkinan interval job belum terlampaui (job belum dijalankan), untuk memaksa agar job segera dijalankan. Maka terlebih dulu harus mengetahui no job, jalankan repmon.sql.

conn repadmin/repadmin@iscatm2
@repmon.sql;
BEGIN
dbms_job.run(49);
dbms_job.run(50);
dbms_job.run(51);
END;
/

8 Responses to “Oracle Advanced Replication”

  1. buluxan December 15, 2008 at 3:30 am #

    WOW keren tutornya

    thank bro

    • setijoagus December 16, 2008 at 12:33 am #

      terima kasih
      smoga ada manfaatnya

  2. komsi January 13, 2009 at 2:14 am #

    Mohon petunjuknya pak.
    sudah saya coba tutorial di atas pak, tetapi belum sementara ini belum jalan setelah saya jalankan repmon.sql keluar sebagai berikut :

    Replication schemas/ sites

    SchemaName MasterDef? DBLink
    ——————– ———- ———————————–
    SCOTT_REPG N FEBCLI.REGRESS.RDBMS.DEV.US.ORACLE.COM
    SCOTT_REPG Y FEBUGM.REGRESS.RDBMS.DEV.US.ORACLE.COM

    RepCat Log (after a while you should see no entries):

    REQUEST STATUS MESSAGE
    —————————– ————– ————————-
    ERRNUM
    ———-
    GENERATE_INTERNAL_PKG_SUPPORT AWAIT_CALLBACK
    GENERATE_INTERNAL_PKG_SUPPORT READY
    COPY_FLAVOR_DEFINITIONS AWAIT_CALLBACK
    CREATE_MASTER_REPOBJECT AWAIT_CALLBACK
    CREATE_MASTER_REPOBJECT AWAIT_CALLBACK
    ADD_MASTER_DATABASE AWAIT_CALLBACK
    ADD_MASTER_DATABASE READY
    END_GEN_INTERNAL_PKG_SUPPORT READY
    GENERATE_INTERNAL_PKG_SUPPORT AWAIT_CALLBACK
    GENERATE_INTERNAL_PKG_SUPPORT READY
    END_GEN_INTERNAL_PKG_SUPPORT READY
    RESUME_MASTER_ACTIVITY AWAIT_CALLBACK
    RESUME_MASTER_ACTIVITY READY
    RESUME_MASTER_ACTIVITY AWAIT_CALLBACK
    RESUME_MASTER_ACTIVITY READY
    15 rows selected.

    Entries in the job queue
    JOB LAST_DATE LAST_SEC NEXT_DATE NEXT_SEC Broken FAILURES
    ———- ——— ——– ——— ——– —— ———-
    WHAT
    ——————————————————————————–
    42 13-JAN-09 00:13:28 14-JAN-09 00:00:00 N 0
    declare rc binary_integer; begin rc := sys.dbms_defer_sys.purge( delay_seconds=>
    0); end;
    62 13-JAN-09 07:35:27 13-JAN-09 07:55:29 N 0
    declare rc binary_integer; begin rc := sys.dbms_defer_sys.push(destination=>’FEB
    SMS.LOCALDOMAIN’, execution_seconds=>1500, delay_seconds=>1200, parallelism=>1);
    end;
    63 13-JAN-09 07:55:29 13-JAN-09 08:05:29 N 0
    dbms_repcat.do_deferred_repcat_admin(‘”SCOTT_REPG”‘, FALSE);

    Replication Status:
    SchemaName M STATUS
    ——————– – ———
    SCOTT_REPG Y QUIESCED

    no rows selected

    no rows selected

    Objects registered for replication
    GroupName OBJECT STATUS
    ——————– ———————————– ———-
    SCOTT_REPG TABLE SCOTT.DEPT VALID
    SCOTT_REPG TABLE SCOTT.EMP VALID

    SQL> SELECT DBLINK FROM DBA_REPSITES WHERE GNAME = ‘SCOTT_REPG’;

    DBLink
    ———————————–
    FEBCLI.REGRESS.RDBMS.DEV.US.ORACLE.COM
    FEBUGM.REGRESS.RDBMS.DEV.US.ORACLE.COM

    kedua Oracle yg saya pake versi 10.2.0 saya create FEBCLI (server remote sebagai mirrornya), akan tetapi setelah saya insert data di table scott.dept belum menimbulkan efek replikasi di server remote (FEBCLI), job saya ekekusi manual juga belum ada efek replikasi.
    Trima kasih banyak atas bantuannya pak.

  3. sikomo January 16, 2009 at 3:08 am #

    setelah perjuangan lama dan melelahkan dengan menyatukana beberapa literatur advance replikasi, akhirnya bisa juga replikasiku berjalan. trima kasih buat smuanya.

  4. dwi July 13, 2009 at 3:03 am #

    Dear pak agus..
    sy dwi mau tanya nih (moga dijawab)
    di company sy
    1. memiliki multiple mv
    2. msite ada di krw
    mview ada di bdg
    3. refresh group dijalankan di bdg dgn syntax dbms_refresh
    per 8 jam atau manual
    4. querynya rewrite
    5. hari selasa kemarin sy , mendrop salah satu mv di bdg,
    misal mx
    ini contoh mvnya :

    CREATE MATERIALIZED VIEW “ABC”.”MV_XX”
    ORGANIZATION HEAP
    PCTFREE 10
    PCTUSED 40
    INITRANS 1
    MAXTRANS 255
    NOCOMPRESS
    LOGGING
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
    TABLESPACE “XYZ”
    BUILD IMMEDIATE
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
    TABLESPACE “SOM”
    REFRESH FORCE ON DEMAND START WITH sysdate+0 NEXT sysdate + 6/24
    WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT
    USING ENFORCED CONSTRAINTS FOR UPDATE DISABLE QUERY REWRITE
    AS SELECT *
    FROM
    “ABC”.”TABLE_XX”@ERP “C”
    WHERE
    “C”.”HIERARCHY_ID”=’010104′

    6. saya mau modifikasi MV itu,
    dengan
    menambah where tsb….dgn kriteria tertentu
    setelah sy drop MV_XX ( lognya tidak sy hapus)
    dan create lagi MV_XX tsb,

    masalahnya,setelah itu…setelah sy melakukan
    refresh group
    dgn : dbms_refresh.refresh(“GROUP_XX”)
    tetapi data di 2 tempat tsb tidak refresh..
    kenapa ya pak?
    mohon bantuannya ya pak..
    Rgds
    Dwi

    • setijoagus July 14, 2009 at 9:38 am #

      kalau bisa pasti saya jawab………….he…he………
      kalau diijinkan konfigurasi secara detailnya bagaimana ?, kalau kepanjangan bisa kirim ke email setijo@gmail.com
      atau mau ym-an ? alamat ke setijo_a@yahoo.com

      untuk sementara secara “mudah” untuk kasus edit “mv” lebih cenderung tidak dilakukan, kl pun dilakukan pakai tools OEM bawaan oracle 10g yang GUI based “banget”, disana error 2x yang terjadi kelihatan.

  5. dwi July 23, 2009 at 2:40 pm #

    malam mas agus,thank sebelumnya atas pencerahannya selama ini. setelah kemarin sy oprek,skrg sudah lancar kembali.ternyata hapus mv,otomatis hapus register mv,walaupun dilihat dr dict di repobject tetap ada,sehingga trigger internal=n,yg artinya tdk punya internal trigger.langkah yg sy lakukan 1. drop_mview_repobject 2. create materialized view 3. create_mview_repobject 4. add mview to refresh group. jgn bosen kalo sy tanya ya. rgds dwi

    • setijoagus July 24, 2009 at 1:43 am #

      senang, mendengar kabar baik dari Bapak.
      kl sempat dan bisa pasti dibantu, sebaliknya mohon bantuannya jika saya kesulitan karena “diatas langit ada langit lagi, dibawah neraka ada neraka lagi…..”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: