# setup source schema ##################### create user WOMBAT identified by "NDbGvewNHVj8@#2FFGfz!De"; grant connect, resource to WOMBAT; alter user WOMBAT quota unlimited on USERS; connect WOMBAT/"NDbGvewNHVj8@#2FFGfz!De"; drop table T0 purge; drop table T1 purge; drop table T2 purge; drop table T3 purge; create table JOB ( id NUMBER GENERATED ALWAYS AS IDENTITY, d DATE not null ); alter table JOB add constraint JOB_PK_ID primary key (ID); create table T0 ( id NUMBER GENERATED ALWAYS AS IDENTITY, d DATE not null, c VARCHAR2(20), n NUMBER ) partition by range (d) interval (interval '1' MONTH) ( partition p0 values less than (DATE'2000-01-01') ) ; alter table T0 add constraint T0_PK_ID primary key (ID); create table T1 ( d DATE not null, c VARCHAR2(10), n1 NUMBER, n2 NUMBER ) partition by range (d) interval (interval '1' MONTH) ( partition p0 values less than (DATE'2000-01-01') ) ; create table T2 ( d DATE not null, n1 NUMBER, n2 NUMBER, n3 NUMBER ) partition by range (d) interval (interval '1' MONTH) ( partition p0 values less than (DATE'2000-01-01') ) ; create table T3 ( d DATE not null, n NUMBER, c1 VARCHAR2(10), c2 VARCHAR2(10), c3 VARCHAR2(10) ) partition by range (d) interval (interval '1' MONTH) ( partition p0 values less than (DATE'2000-01-01') ) ; CREATE OR REPLACE FUNCTION random_date( p_from IN DATE, p_to IN DATE ) RETURN DATE IS BEGIN RETURN p_from + DBMS_RANDOM.VALUE() * (p_to -p_from); END random_date; / CREATE OR REPLACE FUNCTION random_string( maxsize IN NUMBER ) RETURN VARCHAR2 IS BEGIN RETURN dbms_random.string('x',maxsize); END random_string; / CREATE OR REPLACE FUNCTION random_integer( maxvalue IN NUMBER ) RETURN NUMBER IS BEGIN RETURN trunc(dbms_random.value(1,maxvalue)); END random_integer; / # add some data into tables ########################### set timing ON DECLARE imax NUMBER default 100000; i number; begin dbms_random.seed (val => 0); for i in 1 .. imax loop insert /*+ APPEND */ into T0 (d,c,n) values (random_date(DATE'2000-01-01',SYSDATE),random_string(20),random_integer(999999999)); end loop; commit; end; / DECLARE imax NUMBER default 100000; i number; begin dbms_random.seed (val => 0); for i in 1 .. imax loop insert /*+ APPEND */ into T1 (d,c,n1,n2) values (random_date(DATE'2000-01-01',SYSDATE),random_string(10),random_integer(999999999),random_integer(999999999)); end loop; commit; end; / DECLARE imax NUMBER default 100000; i number; begin dbms_random.seed (val => 0); for i in 1 .. imax loop insert /*+ APPEND */ into T2 (d,n1,n2,n3) values (random_date(DATE'2000-01-01',SYSDATE),random_integer(999999999),random_integer(999999999),random_integer(999999999)); end loop; commit; end; / DECLARE imax NUMBER default 100000; i number; begin dbms_random.seed (val => 0); for i in 1 .. imax loop insert /*+ APPEND */ into T3 (d,n,c1,c2,c3) values (random_date(DATE'2000-01-01',SYSDATE),random_integer(999999999),random_string(10),random_string(10),random_string(10)); end loop; commit; end; / # run this PL/SQL block to generate living data ############################################### connect WOMBAT/"NDbGvewNHVj8@#2FFGfz!De"; DECLARE i number; begin loop sys.dbms_session.sleep(5); dbms_random.seed (val => 0); i:=random_integer(999999999); insert into JOB (d) values (sysdate); update T0 set c=random_string(20) where n=i; update T1 set c=random_string(20) where n2 between i-1000 and i+1000; update T2 set d=random_date(DATE'2000-01-01',SYSDATE) where n1 between i-1000 and i+1000; update T3 set c1=random_string(20),d=random_date(DATE'2000-01-01',SYSDATE) where n between i-1000 and i+1000; insert into T0 (d,c,n) values (random_date(DATE'2000-01-01',SYSDATE),random_string(20),random_integer(999999999)); insert into T1 (d,c,n1,n2) values (random_date(DATE'2000-01-01',SYSDATE),random_string(10),random_integer(999999999),random_integer(999999999)); insert into T2 (d,n1,n2,n3) values (random_date(DATE'2000-01-01',SYSDATE),random_integer(999999999),random_integer(999999999),random_integer(999999999)); insert into T3 (d,c1,c2,c3) values (random_date(DATE'2000-01-01',SYSDATE),random_string(10),random_string(10),random_string(10)); commit; exit when 1=0; end loop; end; / ## Golden Gate setup #################### # on source & destination alias gg='rlwrap /app/oracle/product/ogg21/ggsci' create user OGGADMIN identified by "eXtpam!ZarghOzVe81p@1"; # maybe too much grant DBA to OGGADMIN; Edit params ./GLOBALS #--> GGSCHEMA OGGADMIN #<-- # on source add credentialstore info credentialstore domain admin alter credentialstore add user OGGADMIN@//togoria:1521/ANDOPRD password "eXtpam!ZarghOzVe81p@1" alias ANDOPRD domain admin dblogin useridalias ANDOPRD domain admin # on destination add credentialstore info credentialstore domain admin alter credentialstore add user OGGADMIN@//bakura:1521/EWOKPRD password "Chan8em11fUwant!" alias EWOKPRD domain admin info credentialstore domain admin dblogin useridalias EWOKPRD domain admin # setup replication only for tables T0, T1 and T2 ################################################# # on source machine dblogin useridalias ANDOPRD domain admin list tables WOMBAT.* add trandata WOMBAT.T0 add trandata WOMBAT.T1 add trandata WOMBAT.T2 edit params extr_w1 --------------------------------> EXTRACT extr_w1 useridalias ANDOPRD domain admin EXTTRAIL ./dirdat/w1 LOGALLSUPCOLS UPDATERECORDFORMAT compact table WOMBAT.T0; table WOMBAT.T1; table WOMBAT.T2; <-------------------------------- dblogin useridalias ANDOPRD domain admin register extract extr_w1 database add extract extr_w1, integrated tranlog, begin now add exttrail ./dirdat/w1, extract extr_w1, megabytes 5 start extr_w1 info extr_w1 # on source, configure the datapump edit params dpump_w1 --------------------------------> EXTRACT dpump_w1 PASSTHRU RMTHOST bakura, MGRPORT 7809 RMTTRAIL ./dirdat/w1 table WOMBAT.T0; table WOMBAT.T1; table WOMBAT.T2; <-------------------------------- add extract dpump_w1, exttrailsource ./dirdat/w1 add rmttrail ./dirdat/w1, extract dpump_w1, megabytes 5 start dpump_w1 info dpump_w1 # on target, setup replcat but not start it edit params repl_w1 --------------------------------> REPLICAT repl_w1 ASSUMETARGETDEFS DISCARDFILE ./dirrpt/repl_w1.dsc, purge useridalias EWOKPRD domain admin MAP WOMBAT.T0, TARGET OTTER.T0; MAP WOMBAT.T1, TARGET OTTER.T1; MAP WOMBAT.T2, TARGET OTTER.T2; <-------------------------------- dblogin useridalias EWOKPRD domain admin add replicat repl_w1, integrated, exttrail ./dirdat/w1 # perform the intial LOAD ######################### # Note down the current scn of the source database SQL> select current_scn from v$database; CURRENT_SCN ----------- 4531616 # on destination, import tables create public database link ANDOPRD connect to OGGADMIN identified by "Chan8em11fUwant!" using '//togoria:1521/ANDOPRD'; select * from DUAL@ANDOPRD; # create target schema using same DDL defionotion as on source database create user OTTER identified by "50DbGvewN00K@@)2FFGfzKg"; grant connect, resource to OTTER; alter user OTTER quota unlimited on USERS; impdp userid=OGGADMIN/"Chan8em11fUwant!"@//bakura:1521/EWOKPRD logfile=MY:WOMBAT_01.log network_link=ANDOPRD tables=WOMBAT.T0,WOMBAT.T1,WOMBAT.T2 flashback_scn=4531616 remap_schema=WOMBAT:OTTER start repl_w1, aftercsn 4531616 # when LAG is catched, retart replcat stop repl_w1 start repl_w1 info repl_w1 # add 2 tables to SYNC ###################### # on source, add 2 tables to extract & datapump stop dpump_w1 stop extr_w1 # add new tables in extract & datapump parameter files edit params extr_w1 --------------------------------> EXTRACT extr_w1 useridalias ANDOPRD domain admin EXTTRAIL ./dirdat/w1 LOGALLSUPCOLS UPDATERECORDFORMAT compact table WOMBAT.T0; table WOMBAT.T1; table WOMBAT.T2; table WOMBAT.JOB; table WOMBAT.T3; <-------------------------------- # add trandata for new tables dblogin useridalias ANDOPRD domain admin list tables WOMBAT.* add trandata WOMBAT.JOB add trandata WOMBAT.T3 start extr_w1 info extr_w1 edit params dpump_w1 --------------------------------> EXTRACT dpump_w1 PASSTHRU RMTHOST bakura, MGRPORT 7809 RMTTRAIL ./dirdat/w1 table WOMBAT.T0; table WOMBAT.T1; table WOMBAT.T2; table WOMBAT.JOB; table WOMBAT.T3; <-------------------------------- start dpump_w1 info dpump_w1 # once extract & datapump are up and running, we will proceed with the initial load of the nexw tables using expdp/impdp # Note down the current scn of the source database SQL> select current_scn from v$database; CURRENT_SCN ----------- 4675686 impdp userid=OGGADMIN/"Chan8em11fUwant!"@//bakura:1521/EWOKPRD logfile=MY:WOMBAT_02.log network_link=ANDOPRD tables=WOMBAT.JOB,WOMBAT.T3 flashback_scn=4675686 remap_schema=WOMBAT:OTTER # on target, stop replicat, add new tables and start FROM THE GOOD SCN ON NEW TABLES stop repl_w1 edit params repl_w1 --------------------------------> REPLICAT repl_w1 ASSUMETARGETDEFS DISCARDFILE ./dirrpt/repl_w1.dsc, purge useridalias EWOKPRD domain admin MAP WOMBAT.T0, TARGET OTTER.T0; MAP WOMBAT.T1, TARGET OTTER.T1; MAP WOMBAT.T2, TARGET OTTER.T2; MAP WOMBAT.JOB, TARGET OTTER.JOB, filter(@GETENV ('TRANSACTION','CSN') > 4633243); MAP WOMBAT.T3, TARGET OTTER.T3, filter(@GETENV ('TRANSACTION','CSN') > 4633243); <-------------------------------- start repl_w1 info repl_w1 # wen lag is catched, remove SCN clauses from replicat and restart stop repl_w1 edit params repl_w1 --------------------------------> REPLICAT repl_w1 ASSUMETARGETDEFS DISCARDFILE ./dirrpt/repl_w1.dsc, purge useridalias EWOKPRD domain admin MAP WOMBAT.T0, TARGET OTTER.T0; MAP WOMBAT.T1, TARGET OTTER.T1; MAP WOMBAT.T2, TARGET OTTER.T2; MAP WOMBAT.JOB, TARGET OTTER.JOB; MAP WOMBAT.T3, TARGET OTTER.T3; <-------------------------------- start repl_w1 info repl_w1