Installation:-
==============
1. GG Installation.
a) GG home - eg /db/gg_trace/golden_gate --> untar the tar file ( tar -xvf software_file_name)
b) ggsci
> create subdirs
2. Connect to the db and create the golden gate admin user.
SQL> create tablespace golden_gate datafile '/db/oracle/oradata/NSBLSIT12/golden_gate01.dbf' size 2g;
Tablespace created.
SQL> create user ggate identified by Gate_123 default tablespace golden_gate;
User created.
grant connect, resource to ggate;
grant dba to ggate;
grant select any dictionary to ggate;
grant insert any table, select any table, delete any table, update any table to ggate;
grant flashback any table to ggate;
grant execute on dbms_flashback to ggate;
grant execute on utl_file to ggate;
grant create any table to ggate;
grant create sequence to ggate;
grant drop any table to ggate;
SQL> alter database add supplemental log data (all) columns;
Database altered.
SQL> @marker_setup.sql
SQL> @ddl_setup.sql
SQL> @role_setup
SQL> grant GGS_GGSUSER_ROLE to ggate;
Grant succeeded.
SQL> @ddl_enable
SQL> @ddl_pin ggate
Solution: Grant these privieleges to ggate
=======================================================
1. Run package to grant Oracle Streams admin privilege.
exec dbms_streams_auth.grant_admin_privilege('ggate');
exec dbms_goldengate_auth.grant_admin_privilege('ggate');
2. Grant INSERT into logmnr_restart_ckpt$.
grant insert on system.logmnr_restart_ckpt$ to ggate;
3. Grant UPDATE on streams$_capture_process.
grant update on sys.streams$_capture_process to ggate;
4. Grant the 'become user' privilege.
grant become user to ggate;
=======================================================
Examples:-
---------
Server: 10.41.66.187 - Source
Server: 10.14.24.152 - Target
Source database : NPTLPVT
target database : NTESTSRV
GG owner - GGATE
-- Initial Load
--> Direct load -- Extract sends data directly to Replicat to apply using SQL
(During the load, the records are applied to the target database one record at a time, so this
method is considerably slower than any of the other initial load methods)
Extract Parameters (RMTHOST, RMTTASK REPLICAT, GROUP) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters ADD REPLICAT GRP SPECIALRUN
--> Direct bulk load -- Replicat uses the Oracle SQL*Loader API.
Extract Parameters (RMTHOST, RMTTASK REPLICAT, GROUP) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters (BULKLOAD / ADD REPLICAT GRP SPECIALRUN)
--> File to Replicat -- Extract writes to a file (Trail File) that Replicat applies using SQL.
Extract Parameters (RMTHOST, RMTFILE) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters ADD REPLICAT GRP SPECIALRUN
--> File to database utility -- Extract writes to a file formatted for a DB bulk load utility.
Extract parameters (RMTFILE, FORMATASCII SQLLOADER / ADD EXTRACT GRP SOURCEISTABLE)
Replicat Parameters (GENLOADFILES) tO generate controlfile and runfile
Seting up the environment on source
-----------------------------------
--Setup the checkpoint table for whole instance.
GGSCI (S66CJ187) 2> dblogin userid ggate password Gate_123
Successfully logged into database.
GGSCI (S66CJ187) 9> ADD CHECKPOINTTABLE
ERROR: Missing checkpoint table specification.
GGSCI (S66CJ187) 10> EDIT PARAMS ./GLOBALS
GGSCHEMA GGATE
CHECKPOINTTABLE GGATE.CHKPTBL
GGSCI (S66CJ187) 2> ADD CHECKPOINTTABLE
No checkpoint table specified, using GLOBALS specification (GGATE.CHKPTBL)...
Successfully created checkpoint table GGATE.CHKPTBL.
--Setup the MGR Process
GGSCI (S66CJ187) 12> EDIT PARAMS MGR
PORT 7810
DYNAMICPORTLIST 7900-7950
GGSCI (S66CJ187) 13> START MGR
Manager started.
GGSCI (S66CJ187) 14> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
I) Load using initital load where the source and target table are having mismtach in columns.
SQL> desc GG_SOURCE.GG_SYNC_TBL1;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
-- Target table
SQL> desc GG_TARGET.GG_SYNC_TBL1_TGT;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER
ENAME VARCHAR2(30)
-- As we can see the source table GG_SYNC_TBL_1 has 3 columns and the target table GG_SYNC_TBL1_TGT
is having 2 columns, we can use the defgen (definition generator) utility to map this.
Create a parameter file first.
GGSCI (S66CJ187) 4> edit params defgen
DEFSFILE ./dirsql/GG_SYNC_TBL1.sql
USERID GGATE password Gate_123
TABLE GG_SOURCE.GG_SYNC_TBL1;
$ ./defgen PARAMFILE ./dirprm/defgen.prm REPORTFILE ./dirrpt/defgen.rpt
A GG_SYNC_TBL1.sql is generated under dirsql directory which looks like
*+- Defgen version 2.0, Encoding hp-roman8
*
* Definitions created/modified 2014-01-15 16:31
*
* Field descriptions for each column entry:
*
* 1 Name
* 2 Data Type
* 3 External Length
* 4 Fetch Offset
* 5 Scale
* 6 Level
* 7 Null
* 8 Bump if Odd
* 9 Internal Length
* 10 Binary Length
* 11 Table Length
* 12 Most Significant DT
* 13 Least Significant DT
* 14 High Precision
* 15 Low Precision
* 16 Elementary Item
* 17 Occurs
* 18 Key Column
* 19 Sub Data Type
*
Database type: ORACLE
Character set ID: UTF-8
National character set ID: UTF-16
Locale: neutral
Case sensitivity: 14 14 14 14 14 14 14 14 14 14 14 14 11 14 14 14
*
Definition for table GG_SOURCE.GG_SYNC_TBL1
Record length: 128
Syskey: 0
Columns: 3
EMPNO 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
ENAME 64 30 56 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
DETAILS 64 30 92 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
End of definition
ftp/scp the GG_SYNC_TBL1.sql to the target server under the dirsql directory of GG software home.
Extract on the source side
--------------------------
GGSCI (S66CJ187) 20>
GGSCI (S66CJ187) 20> EDIT PARAMS EXT1
EXTRACT DIR_1
USERID GGATE, PASSWORD Gate_123
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTASK REPLICAT, GROUP DIR_R1
TABLE GG_SOURCE.GG_SYNC_TBL2;
GGSCI (S66CJ187) 20> ADD EXTRACT EXT1, SOURCEISTABLE
Replicat on the target side
---------------------------
-- Setup the environment (CHECKPOINTABLE and MGR Process as per above).
GGSCI (S24BF152) 1> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
GGSCI (S24BF152) 2> EDIT PARAMS REP1
REPLICAT REP1
USERID GGATE, PASSWORD Gate_123
SOURCEDEFS ./dirsql/GG_SYNC_TBL1.sql
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_TARGET.GG_SYNC_TBL1_TGT, COLMAP (EMPNO=EMPNO ENAME=ENAME);
GGSCI (S24BF152) 3> ADD REPLICAT REP1, SPECIALRUN
Start the Loading
-----------------
On the source side start the Extract prcoess , since it is a initial load the replicat
will be started automatically on the target side.
GGSCI (S66CJ187) 2> START EXTRACT EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
GGSCI (S66CJ187) 9> INFO EXT1
EXTRACT EXT1 Last Started 2014-01-16 08:10 Status RUNNING
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL1
2014-01-16 08:10:45 Record 1
Task SOURCEISTABLE
GGSCI (S66CJ187) 10> !
INFO EXT1
EXTRACT EXT1 Last Started 2014-01-16 08:10 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL1
2014-01-16 08:10:46 Record 1000
Task SOURCEISTABLE
GGSCI (S66CJ187) 11> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
--as above 1000 records been loaded and then the extract process is stopped.
--Check the count on the target side..
SQL> select count(*) from gg_target.gg_sync_tbl1_tgt;
COUNT(*)
----------
1000
II) Change Data Capture.
------------------------
Source Extract Process
----------------------
GGSCI (S66CJ187) 4> EDIT PARAMS EXT1
EXTRACT EXT1
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE@NPTLPVT, PASSWORD GATE_123
EXTTRAIL ./dirdat/XO
DDL INCLUDE MAPPED EXCLUDE OBJTYPE TRIGGER
--TRANLOGOPTIONS DBLOGREADER # IF LOG FILES ARE STORED IN ASM (Supported 10.2.0.5 and higher and 11.2.0.2 & Higher Not 11gr1)
--TRANLOGOPTIONS ASMUSER SYS@, ASMPASSWORD # IF LOG FILES ARE STORED IN ASM (10g)
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 5> ADD TRANDATA GG_SOURCE.GG_SYNC_TBL1
Logging of supplemental redo log data is already enabled for table GG_SOURCE.GG_SYNC_TBL1.
GGSCI (S66CJ187) 6> ADD EXTRACT EXT1, TRANLOG, BEGIN NOW
EXTRACT added.
GGSCI (S66CJ187) 8> ADD EXTTRAIL ./dirdat/XO, EXTRACT EXT1, MEGABYTES 20
EXTTRAIL added.
GGSCI (S66CJ187) 10> START EXTRACT EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
GGSCI (S66CJ187) 19> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:01
Source Pump Process
-------------------
GGSCI (S66CJ187) 20> EDIT PARAMS PMP1
EXTRACT PMP1
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTRAIL ./dirdat/XO
PASSTHRU
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 23> ADD EXTRACT PMP1 , EXTTRAILSOURCE ./dirdat/XO
EXTRACT added.
GGSCI (S66CJ187) 25> ADD RMTTRAIL ./dirdat/XO , EXTRACT PMP1, MEGABYTES 20
RMTTRAIL added.
GGSCI (S66CJ187) 26> START EXTRACT PMP1
Sending START request to MANAGER ...
EXTRACT PMP1 starting
GGSCI (S66CJ187) 41> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:04
EXTRACT RUNNING PMP1 00:00:00 00:00:22
-- Check whether the file is transfered to the target server.
/app/oracle/golden_gate/dirdat> ls -lrt
total 0
-rw-rw-rw- 1 oracle oinstall 0 Jan 16 09:38 XO000000
-- Add some records in the source table.
SQL> begin
2 for i in 1001..2000 loop
3 insert into gg_sync_tbl1 values (i, dbms_random.string('U',30), DBMS_RANDOM.STRING('U',30));
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select count(*) from gg_source.gg_sync_tbl1;
COUNT(*)
----------
2000
-- Register the extract so that rman will not delete the archived log files if the data is not captured by
the extract process.
GGSCI (S66CJ187) 7> REGISTER EXTRACT EXT1 LOGRETENTION
2014-01-16 10:59:48 ERROR OGG-01754 Cannot register or unregister EXTRACT EXT1 because the Extract is currently running. Stop the Extract and retry the command.
GGSCI (S66CJ187) 8> STOP EXTRACT EXT1
Sending STOP request to EXTRACT EXT1 ...
Request processed.
GGSCI (S66CJ187) 9> REGISTER EXTRACT EXT1 LOGRETENTION
2014-01-16 11:00:07 INFO OGG-01749 Successfully registered EXTRACT EXT1 to start managing log retention at SCN 59178692.
GGSCI (S66CJ187) 11> START EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
Target Replicat process
-----------------------
GGSCI (S24BF152) 7> DELETE REPLICAT REP1
Deleted REPLICAT REP1.
GGSCI (S24BF152) 2> EDIT PARAMS REP1
REPLICAT REP1
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE, PASSWORD Gate_123
SOURCEDEFS ./dirsql/GG_SYNC_TBL1.sql
DISCARDFILE ./dirrpt/REP1.dsc , append
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_TARGET.GG_SYNC_TBL1_TGT, COLMAP (EMPNO=EMPNO ENAME=ENAME);
GGSCI (S24BF152) 8> ADD REPLICAT REP1 , EXTTRAIL ./dirdat/XO
REPLICAT added.
GGSCI (S24BF152) 9> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT STOPPED REP1 00:00:00 00:00:06
GGSCI (S24BF152) 10> START REPLICAT REP1
Sending START request to MANAGER ...
REPLICAT REP1 starting
GGSCI (S24BF152) 16> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:17:03 00:00:06
GGSCI (S24BF152) 17> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:04
-- Now there is no lag.. let check the count in the target.
SQL> select count(*) from gg_target.gg_sync_tbl1_tgt;
COUNT(*)
----------
2000
III) Initial Load using Direct Bulk load
------------------------------------------------
Source Table :- GG_SYNC_TBL2
Target Table :- GG_SYNC_TBL2
Source
------
SQL> DESC GG_SYNC_TBL2;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
SQL> insert into GG_SYNC_TBL2 select * from GG_SYNC_TBL1;
2000 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from GG_SYNC_TBL2;
COUNT(*)
----------
2000
GGSCI (S66CJ187) 3> dblogin userid ggate password Gate_123
Successfully logged into database.
GGSCI (S66CJ187) 22> EDIT PARAMS DIR_1
EXTRACT DIR_1
USERID GGATE, PASSWORD Gate_123
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTASK REPLICAT, GROUP DIR_R1
TABLE GG_SOURCE.GG_SYNC_TBL2;
GGSCI (S66CJ187) 4> ADD EXTRACT DIR_1, SOURCEISTABLE
EXTRACT added.
Replicat Side
-------------
SQL> DESC GG_SYNC_TBL2;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
GGSCI (S24BF152) 3> EDIT PARAMS DIR_R1
REPLICAT DIR_R1
USERID GGATE , PASSWORD Gate_123
ASSUMETARGETDEFS
BULKLOAD
MAP GG_SOURCE.GG_SYNC_TBL2, TARGET GG_TARGET.GG_SYNC_TBL2;
GGSCI (S24BF152) 8> ADD REPLICAT DIR_R1 SPECIALRUN
REPLICAT added.
-------
Start the extract from the Source side.
GGSCI (S66CJ187) 4> START EXTRACT DIR_1
Sending START request to MANAGER ...
EXTRACT DIR_1 starting
GGSCI (S66CJ187) 8> INFO DIR_1
EXTRACT DIR_1 Last Started 2014-01-17 10:24 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL2
2014-01-17 10:24:54 Record 2000
Task SOURCEISTABLE
Report file - of Replicat process.
==================================================================
Report at 2014-01-17 10:25:00 (activity since 2014-01-17 10:24:54)
From Table GG_SOURCE.GG_SYNC_TBL2 to GG_TARGET.GG_SYNC_TBL2:
# inserts: 2000
# updates: 0
# deletes: 0
# discards: 0
-- Lets check the count.
SQL> select count(*) from gg_target.gg_sync_tbl2;
COUNT(*)
----------
2000
IV) Usinig Logdump Utility.
---------------------------
Desc Command Eg
------------------------------------------------------------------------------------------
Open a Trail File - open Logdump 1 > open ./dirdat/XO000000
To view Trail file header - fileheader on Logdump 2 > fileheader on
To view Record header - ghdr on Logdump 3 > ghdr on
To view Column information - detail on Logdump 4 > detail on
To View column values - detail data Logdump 5 > detail data
To control the length of value - reclen Logdump 6 > reclen 300
To move to first records - pos Logdump 7 > pos 0
To move to next record - next or n Logdump 8 > next (or just n)
To move to the starting point
or good header - scanforheader (sfh) Logdump 9 > sfh
To move to previous good header - sfh prev Logdump 10> sfh prev
Record header - (TransInd : . (x00)
00 - Begining of the transaction.
01 - Middle of the transaction.
02 - Last of the transaction.
03 - Whole of the transaction.
Count records in trail - count Logdump 61 > count
Using Filter Options:-
----------------------
Eg.
SQL> update gg_sync_tbl1 set ename = 'MANZOOR' where empno = 1678;
1 row updated.
SQL> commit
Commit complete.
SQL> begin
2 for i in 2001..2500 loop
3 insert into gg_sync_tbl1 values (i,dbms_random.string('U',30), dbms_random.string('U',30));
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> delete from gg_sync_tbl1 where ENAME = 'MANZOOR';
1 row deleted.
SQL> commit;
Commit complete.
-- Lets find out this delete tractions using filter option in trail file.
Logdump 175 >open ./dirdat/XO000000
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000000
Logdump 176 >GHDR ON
Logdump 177 >DETAIL ON
Logdump 178 >DETAIL DATA
Logdump 179 >FILEHEADER ON
Logdump 180 >FILTER INCLUDE FILENAME GG_SOURCE.GG_SYNC_TBL1 # Filter the table name
Logdump 181 >FILTER INCLUDE RECTYPE DELETE # Filter the delete operation
Logdump 182 >SHOW FILTER # Display the current filter condition.
Data filters are ENABLED
Include Match ANY
Rectypes : Delete
Filename-0 : GG_SOURCE.GG_SYNC_TBL1
Exclude Match ANY
Logdump 183 >FILTER MATCH ALL # Instruciting to find the records which matches all the condition can use FILTER MATCH ANY for any of the one condition.
Logdump 184 >N # To start search (next)
Filtering suppressed 1001 records
Logdump 185 >NT # The record is not present in this trail file, to continue searching in next trail enter NT (next trail)
LogTrail /db/oracle/golden_gate/dirdat/XO000000 closed
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000001
Logdump 186 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 12 (x000c) IO Time : 2014/01/18 08:36:30.000.000
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.000.000 Delete Len 12 RBA 108695
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 | ........1678
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Filtering suppressed 503 records
## Now we have found the delete operation.
-------------------------------------------------------------------------------
Logging lodump session LOG TO LOG TO MYSESSIONLOG.TXT
Stop logging session LOG STOP LOG STOP
Reverse Utitlity (Reversal of Transaction)
----------------------------------------------------------
1. Used to extract the before data and backout the changes.
2. It can use either trailfile or transaction logs (archive logs).
Restrictions
------------
1. Long and LOB columns are not reversed if before values are not stored in db.
2. XML TYPE tables are not supported.
Lets backout the happend from the below update statment... around (500 Transactions).
update gg_sync_tbl1 set ename = 'MANZOOR' where empno = 1678;
1) Get the time from and to backout the transaction.
Logdump 194 >open ./dirdat/XO000000
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000000
Logdump 195 >GHDR ON
Logdump 196 >DETAIL ON
Logdump 197 >DETAIL DATA
Logdump 198 >FILEHEADER ON
Logdump 199 >FILTER INCLUDE RECTYPE 15; FILTER INCLUDE FILENAME GG_SOURCE.GG_SYNC_TBL1; FILTER MATCH ALL
Logdump 200 >SHOW FILTER
Data filters are ENABLED
Include Match ALL
Rectypes : FieldComp
Filename-0 : GG_SOURCE.GG_SYNC_TBL1
Exclude Match ANY
Logdump 201 >
Logdump 201 >n
Filtering suppressed 1001 records
Logdump 202 >nt
LogTrail /db/oracle/golden_gate/dirdat/XO000000 closed
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000001
Logdump 203 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 65 (x0041) IO Time : 2014/01/17 12:27:51.000.000
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:51.000.000 FieldComp Len 65 RBA 1012
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
The Time of the transaction is 2014/01/17 12:27:51.000.000
The time of last transaction is 2014/01/18 08:36:30.000.000
Lets backuout all the transaction happend between these time.
Process
-------
a) Create a parameter file for extract process.
b) Run the reverse utility.
c) Run replicat process.
Parameter file (Pre OGG 11.2 )
SPECIALRUN, TRANLOG
USERID GGATE Password Gate_123
BEGIN 2014-01-17 12:27:51
END 2014-01-18 08:36:30
GETUPDATEBEFORES
NOCOMPRESSDELETES
--RMTHOST 10.41.66.187 MGRPORT 7810 # IF the file has to be generated on remote system
--RMTFILE ./dirdat/REV.dat # IF the file has to be generated on remote system
EXTFILE ./dirdat/REV.dat
TABLE GG_SOURCE.GG_SYNC_TBL1;
Run from os shell ( ./extract paramfile ./dirprm/ext_1.prm)
Pameter file (From OGG 11.2)
GGSCI (S66CJ187) 9> EDIT PARAMS EXT_1
EXTRACT EXT_1
USERID GGATE Password Gate_123
END 2014-01-18 08:36:30
GETUPDATEBEFORES
NOCOMPRESSDELETES
--RMTHOST 10.14.24.152 MGRPORT 7810 # IF the trail file has to be generated on remote system
--RMTTRAIL ./dirdat/RE # IF the trail file has to be generated on remote system
EXTTRAIL ./dirdat/RE
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 10> ADD EXTRACT EXT_1, TRANLOG, BEGIN 2014-01-17 12:27:00
EXTRACT added.
GGSCI (S66CJ187) 13> ADD EXTTRAIL ./dirdat/RE , extract EXT_1
EXTTRAIL added.
GGSCI (S66CJ187) 14> START EXTRACT EXT_1
Sending START request to MANAGER ...
EXTRACT EXT_1 starting
GGSCI (S66CJ187) 27> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:01
EXTRACT RUNNING EXT_1 43:53:36 00:07:40
EXTRACT RUNNING PMP1 00:00:00 00:00:06
GGSCI (S66CJ187) 28> INFO EXT_1
EXTRACT EXT_1 Last Started 2014-01-19 08:29 Status RUNNING
Checkpoint Lag 44:01:18 (updated 00:00:01 ago)
Log Read Checkpoint Oracle Redo Logs
2014-01-17 12:27:51 Seqno 180, RBA 60378112
SCN 0.0 (0)
GGSCI (S66CJ187) 30> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:10
EXTRACT STOPPED EXT_1 23:52:44 00:00:12
EXTRACT RUNNING PMP1 00:00:00 00:00:05
Once the extraction is completed the extract process is stopped.
--Below is the snap from the REPORT FILE.
From Table GG_SOURCE.GG_SYNC_TBL1:
# inserts: 500
# updates: 1
# befores: 1
# deletes: 1
# discards: 0
--Lets review the trail file to find the first record, as per above the first record should be
update.
$ ls -lrt RE*
total 10816
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:46 RE000000
Logdump 314 >open RE000000
Current LogTrail is /db/oracle/golden_gate/dirdat/RE000000
Logdump 315 >GHDR ON
Logdump 316 >DETAIL ON
Logdump 317 >DETAIL DATA
Logdump 318 >FILEHEADER ON
Logdump 319 >POS 0
Reading forward from RBA 0
Logdump 320 >N
Logdump 321 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 88 (x0058) IO Time : 2014/01/17 12:27:50.910.232
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x00) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:50.910.232 FieldComp Len 88 RBA 954
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G b
0000 0008 0000 0004 3136 3738 0001 0022 0000 001e | ........1678..."....
4b59 4857 5055 5255 4d43 4551 5a53 544b 5954 5947 | KYHWPURUMCEQZSTKYTYG
5a50 4e5a 4158 4e5a 424d 0002 0022 0000 001e 5241 | ZPNZAXNZBM..."....RA
4154 4c46 4756 4f42 5853 4b50 4454 4748 4246 4356 | ATLFGVOBXSKPDTGHBFCV
4d4e 444b 5656 5652 | MNDKVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 34 (x0022)
0000 001e 4b59 4857 5055 5255 4d43 4551 5a53 544b | ....KYHWPURUMCEQZSTK
5954 5947 5a50 4e5a 4158 4e5a 424d | YTYGZPNZAXNZBM
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
--- We could see this is the BEFORE image of the update statement we required to rollback the update.
---Check the last statment in the trail..
Logdump 322 >POS LAST
Reading forward from RBA 109018
Logdump 323 >n
Logdump 324 >pos rev
Reading in reverse from RBA 109018
Logdump 325 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 65 (x0041) IO Time : 2014/01/18 08:36:30.019.919
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.019.919 Delete Len 65 RBA 108826
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
--- The statment is delete ...
-- Now the extract process extracted the transactions happend during the mentioned time period.
Now we need to reverse the operation to rollback, i.e. insert becomes deletes, delete become inserert,
update become update with before image. This can be done using the REVERSE utility.
Execute the below command to reverse the operation using reverse utility.
$ pwd
/db/oracle/golden_gate/dirdat
$ ls -lrt
total 10816
-rw-rw-rw- 1 oracle oinstall 189979 Jan 16 11:00 XO000000
-rw-rw-rw- 1 oracle oinstall 5103031 Jan 17 10:22 XT000000
-rw-rw-rw- 1 oracle oinstall 108834 Jan 19 08:05 XO000001
-rw-rw-rw- 1 oracle oinstall 1012 Jan 19 08:05 XO000002
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:46 RE000000 <--- extracted="" file.="" p="" the="" this="">
$ cd ..
$ ./reverse ./dirdat/RE* ./dirdat/RV*
Oracle GoldenGate Dynamic Rollback
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230
HP/UX, IA64, 64bit (optimized) on Apr 23 2012 23:15:02
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
*Warning* Source file contained Deletes which maybe compressed
Reversed ./dirdat/RE000000 to /db/oracle/golden_gate/dirdat/RV000000
Total Data Bytes 44218
Avg Bytes/Record 87
Delete 1
Insert 500
FieldComp 2
Before Images 2
After Images 501
$ cd dirdat
$ ls -lrt
total 11040
-rw-rw-rw- 1 oracle oinstall 189979 Jan 16 11:00 XO000000
-rw-rw-rw- 1 oracle oinstall 5103031 Jan 17 10:22 XT000000
-rw-rw-rw- 1 oracle oinstall 108834 Jan 19 08:05 XO000001
-rw-rw-rw- 1 oracle oinstall 1012 Jan 19 08:05 XO000002
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:58 RE000000
-rw-r--r-- 1 oracle oinstall 109018 Jan 19 09:15 RV000000
-- Lets view the content of the trail file..
-- First Record..
Logdump 333 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 65 (x0041) IO Time : 2014/01/18 08:36:30.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.000.000 Insert Len 65 RBA 954
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
-- As we can see the delete reversed to insert.
-- Next record
Logdump 349 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 88 (x0058) IO Time : 2014/01/18 08:35:51.000.000
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193298448
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:35:51.000.000 Delete Len 88 RBA 1146
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3235 3030 0001 0022 0000 001e | ........2500..."....
4146 4a42 5558 524e 5052 424c 4d5a 4e49 5551 5345 | AFJBUXRNPRBLMZNIUQSE
5149 4656 5056 594c 5943 0002 0022 0000 001e 5747 | QIFVPVYLYC..."....WG
4e56 4a4c 4146 4a55 5347 5548 5954 4751 4e52 4248 | NVJLAFJUSGUHYTGQNRBH
565a 5351 4148 4e54 | VZSQAHNT
Column 0 (x0000), Len 8 (x0008)
0000 0004 3235 3030 | ....2500
Column 1 (x0001), Len 34 (x0022)
0000 001e 4146 4a42 5558 524e 5052 424c 4d5a 4e49 | ....AFJBUXRNPRBLMZNI
5551 5345 5149 4656 5056 594c 5943 | UQSEQIFVPVYLYC
Column 2 (x0002), Len 34 (x0022)
0000 001e 5747 4e56 4a4c 4146 4a55 5347 5548 5954 | ....WGNVJLAFJUSGUHYT
4751 4e52 4248 565a 5351 4148 4e54 | GQNRBHVZSQAHNT
-- Insert reversed to delete.
--Last record.
Logdump 352 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 88 (x0058) IO Time : 2014/01/17 12:27:51.000.000
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x02) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:51.000.000 FieldComp Len 88 RBA 108802
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G e
0000 0008 0000 0004 3136 3738 0001 0022 0000 001e | ........1678..."....
4b59 4857 5055 5255 4d43 4551 5a53 544b 5954 5947 | KYHWPURUMCEQZSTKYTYG
5a50 4e5a 4158 4e5a 424d 0002 0022 0000 001e 5241 | ZPNZAXNZBM..."....RA
4154 4c46 4756 4f42 5853 4b50 4454 4748 4246 4356 | ATLFGVOBXSKPDTGHBFCV
4d4e 444b 5656 5652 | MNDKVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 34 (x0022)
0000 001e 4b59 4857 5055 5255 4d43 4551 5a53 544b | ....KYHWPURUMCEQZSTK
5954 5947 5a50 4e5a 4158 4e5a 424d | YTYGZPNZAXNZBM
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
-- Update has been updated with old value.
-- Setup a replicat process to replicat these changes.
GGSCI (S66CJ187) 4> EDIT PARAMS REP_1
REPLICAT REP_1
END RUNTIME
USERID GGATE PASSWORD Gate_123
ASSUMETARGETDEFS
DISCARDFILE ./dirrpt/rep_1.dsc, append
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 5> ADD REPLICAT REP_1, EXTTRAIL ./dirdat/RV
REPLICAT added.
GGSCI (S66CJ187) 6> START REPLICAT REP_1
Sending START request to MANAGER ...
REPLICAT REP_1 starting
GGSCI (S66CJ187) 10> INFO REP_1
REPLICAT REP_1 Last Started 2014-01-19 09:27 Status STOPPED
Checkpoint Lag 00:00:00 (updated 00:00:36 ago)
Log Read Checkpoint File ./dirdat/RV000000
2014-01-17 12:27:51.000000 RBA 109018
--- Extract from report file.
=============================================================
From Table GG_SOURCE.GG_SYNC_TBL1 to GG_SOURCE.GG_SYNC_TBL1:
# inserts: 1
# updates: 1
# deletes: 500
# discards: 0
=============================================================
As we can see from the snap above,
-- 500 insert becomes deletes
-- 1 delete becomes insert
-- 1 update become update with before image.
-- Lets look at the db.
SQL> select count(*) from gg_source.gg_sync_tbl1;
COUNT(*)
----------
2000
- TRANLOG specifies the transaction log as the data source.
- GETUPDATEBEFORES is used to include before images of update records, which contain record details before an update (as opposed to after images).
- NOCOMPRESSDELETES causes Extract to send all column data to the output, instead of sending only the primary key. It enables deletes to be converted back to inserts.
- END RUNTIME causes the Extract or Replicat to terminate when it reaches process startup time.
======================================================================================================================================================================
V) Extract Process Defaults:-
a. Commited data only
b. Full images of inserts.
c. Only primary key and changed columns for update.
d. Only primary key for delete.
e. Only after image of update.
VI) Extract Parameter catagoreis
a) General
b) Processing Methods - When to start and end the process.
c) Database login
d) Selecting and Mapping data.
e) Routing Data
f) Formatting Data
g) Custom Processing - Whether to invoke a user exit routine or a macro
h) Reporting
i) Error Handling - Contains records that cannot be processed and error handling for DDL extraction
j) Tuning - Controls how long data is buffered before writing to a trail, and memory allocations.
k) Maintenance
l) Security
VII) Options on TRANSLOGOPTION.
a) TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT log_%t_%s_%r.arc --> To specify differet format for archivelog.
b) TRANLOGOPTIONS ALTARCHIVELOGDEST /oradata/archive/log2 --> To specify differnet archive log location.
c) TRANLOGOPTIONS ARCHIVEDLOGONLY --> To specify gg to read only from the archive log (ALO)
d) TRANLOGOPTIONS EXCLUDEUSER ggsrep --> To execlude particular user from extract.
e) TRANLOGOPTIONS EXCLUDETRANS "ggs_repl" --> To specify the transaction name of the Replicat database user so that those transactions are not captured by Extract.
VIII) DBOPTIONS. (Database options).
a) SUPPRESSTRIGGERS | NOSUPPRESSTRIGGERS - For Oracle databases to turn off triggers on the target database.
b) DEFERREFCONST - Defer deferrable constraints.
c) FETCHBATCHSIZE
======================================================================================================================================================================
IX) Data Manipulation and Mapping
---------------------------------
a) Done by TABLE and MAP parameters.
Parameter
TABLE / MAP | Selects
WHERE | Table, Row,
FILTER | Row operation, Range.
TABLE COLS | Columns
COLSEXCEPT |
Table selection -> MAP gg_source.gg_sync_tbl1, TARGET gg_target.gg_sync_tbl1_tgt;
Row Selection -> WHERE (EMPNAME = "MANZOOR");
Operation Selection -> FILTER (ON UPDATE, ON DELETE, amount > 0);
Column Selection -> TABLE gg_source.gg_sync_tbl1 COLSEXCEPT (ENAME);
WHERE CLUASE
------------
-- Can appear on TABLE or MAP
-- Cannot use for arithmetic operation and refer to trail header and user token values.
-- Can perform evaluation as below.
Element Description Defined by Example
------------------- ------------------------ ---------------------
Columns COL_NAME ENAME
Comparision operator >, <, >=, <=, =, <> WHERE (ENAME = "MANZOOR")
Numeric values 38383.00 WHERE (EMPNO = 2)
Literal String "NAME", "CAR" WHERE (ENAME = "MANZOOR")
Field tests @NULL, @PRESENT, @ABSENT WHERE (ENAME = @NULL) / WHERE ( EMPNO @PRESENT AND EMPNO <> @NULL)
Logical operator AND, OR WHERE ( EMPNO @PRESENT AND EMPNO <> @NULL)
FILTER CLAUSE
-------------
-- Used for complex include / exclude data selection.
-- Can deploy oracle GG built in function.
-- Can use multiple filter in one statement, if one filter fails the whole filter fails.
-- Include multiple option clause eg (ON INSERT / ON DELETE)
-- Raise a user defined error for error handling and processing. (FILTER RAISEERROR)
Eg.
FILTER ((PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000); -- The following example includes rows where the price multiplied by the amount exceeds 10,000.
FILTER (@STRFIND(NAME, "JOE") > 0); -- The following example includes rows containing the string “JOE”:
FILTER (ON UPDATE, ON DELETE, @COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000); -- Executes the FILTER clause for both updates and deletes, but not inserts.
RANGE CLAUSE
------------
-- Used to divide the workload into mutiple randomly distributed data.
-- Same row will always processed by the same process group , it uses hash against the primary key or user defined columns.
Eg.
Replicat #1
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (1,3));
Replicat #2
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (2,3));
Replicat #3
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (3,3));
Three Replicat processes, with each Replicat group processing one-third of the data in the GoldenGate trail based on the primary key.
TABLE SALES.ACCOUNT, FILTER (@RANGE (1,3,REP_ID));
TABLE SALES.ACCOUNT, FILTER (@RANGE (2,3,REP_ID));
TABLE SALES.ACCOUNT, FILTER (@RANGE (3,3,REP_ID));
Related by REP_ID, require three Replicats to handle the
transaction volumes.
By hashing the REP_ID column, related rows will always be processed to the same Replicat.
Building History
----------------
This is to record all the changes happend on the table, all the changes will be applied as an new insert using
INSERTALLRECORDS parameter.
This example uses special values to build a history of operations data:
INSERTALLRECORDS
MAP SALES.ACCOUNT, TARGET REPORT.ACCTHISTORY,
COLMAP (USEDEFAULTS,
TRAN_TIME = @GETENV("GGHEADER","COMMITTIMESTAMP"),
OP_TYPE = @GETENV("GGHEADER", "OPTYPE"),
BEFORE_AFTER_IND =
@GETENV("GGHEADER", "BEFOREAFTERINDICATOR"),
);
Oralce GG builtin Functions:-
---------------------------
FUNCTION DEFINITION Example
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CASE - Allows user to select a value depending on a series of value tests
EVAL - Allows a user to select a value depending on a series of independent tests
IF - Conditional checking AMT_COL = @IF (AMT > 0, AMT, 0)
COLSTAT - Tests whether a column value is missing, NULL, or invalid
COLTEST - Tests whether a column value is present, missing, NULL, or invalid
VALONEOF - STATE_COL = @IF (@VALONEOF ("CHENNAI","MADURAI"),"TN","OTHERS")
DATE - Returns date in variety of formats.
DATEDIFF - Returns diffenet between two date and times.
DATENOW - Returns current date.
COMPUTE - Returns the result of an arithmetic expression
NUMBIN - Convert binary string to number.
NUMSTR - Convert string to number.
STRCAT - Concatenates two or more strings. FULL_NAME = @STRCAT (LAST_NAME,",",FIRST_NAME);
STRCMP - Compares two strings to determine whether they are equal, or whether the first is less or greater than the second.
STREQ - Tests to see whether two strings are equal. Returns 1 for equal and 0 if not equal.
STREXT - Extracts selected characters from a string COUNTRY_CODE = @STREXT (PHONE, 1,2);
STRFIND - Finds the occurrence of a string within a string
STRLEN - Returns the length of a string.
STRLTRIM - Trims leading spaces in a column
STRNCAT - Concatenates one or more strings up to a specified number of characters per string
STRNCMP - Compares two strings up to a certain number of characters
STRNUM - Converts a number into a string, with justification and zerofill options
STRRTRIM - Trims trailing spaces in a column
STRSUB - Substitutes one string for another within a column
STRTRIM - Trims both leading and trailing spaces in a column
STRUP - Changes a string to uppercase
BINARY - Keeps source data in its original binary format in the target when source column is defined as character
BINTOHEX - Converts a binary string to a hexadecimal string
GETENV - Returns information on the GoldenGate environment, trail file header, trail record header, last replicated operation
and lag. Can retrieve the commit timestamp in local time or GMT.
GETVAL - Extracts parameters from a stored procedure as input to a FILTER or COLMAP clause
HEXTOBIN - Converts a hexadecimal string to a binary string
HIGHVAL,LOWVAL - Emulate COBOL functions that allow you to set a numeric limit on string or binary data types
RANGE - Divides a workload into multiple groups of data, while ensuring the same row will always be sent to the same process.
RANGE uses a hash against primary key or user-defined columns.
TOKEN - Maps environmental values that are stored in the user token area to the target column.
SQLEXEC
-------
The SQLEXEC parameter extends GoldenGate capabilities by enabling Extract and Replicat to communicate with the
database through SQL queries or run stored procedures.
SQLEXEC also extends data integration beyond what can be done with GoldenGate functions.
A) Execute a stored procedure or SQL by query using the SQLEXEC clause of the TABLE or MAP parameter.
B) Use SQLEXEC at the root level (without input/output parameters) to call a stored procedure, run a SQL query, or issue a database command.
EG.
CREATE OR REPLACE PROCEDURE LOOKUP (CODE_PARAM IN VARCHAR2, DESC_PARAM OUT VARCHAR2) AS
BEGIN
SELECT DESC_COL INTO DESC_PARAM FROM LOOKUP_TABLE WHERE CODE_COL = CODE_PARAM;
END;
SYNTAX FOR SQLEXEC WITH STORED PRODCEDURE
SQLEXEC (SPNAME,
[ID{PARAMS | NOPARAMS})
---------------------------------------------------------------------------------------
MAP HR.ACCOUNT, TARGET HR.NEWACCT, &
SQLEXEC (SPNAME lookup, PARAMS (code_param = account_code)), &
COLMAP (USEDEFAULTS, newacct_id = account_id, newacct_val = @GETVAL(lookup.desc_param));
---------------------------------------------------------------------------------------
Maps data from the ACCOUNT table to the NEWACCT table
When processing any rows from ACCOUNT, Extract performs the LOOKUP stored procedure prior to executing the column map
Maps values returned in desc_param to the newacct_val column using the @GETVAL function.
the above result can also be achived by directly executing the query instead of stored procedure.
SYNTAX for SQLEXEC FOR EXECUTING THE QUERY.
SQLEXEC (ID, QUERY " ",
{PARAMS | NOPARAMS})
---------------------------------------------------------------------------------------
MAP HR.ACCOUNT, TARGET HR.NEWACCT, &
SQLEXEC (id lookup, &
query "select desc_param from lookup_table
where code_col = :code_param", &
PARAMS (code_param = account_code)), &
COLMAP (USEDEFAULTS, newacct_id = account_id,
newacct_val = @GETVAL(lookup.desc_param));
---------------------------------------------------------------------------------------
* When SQLEXEC is used as a stand-alone parameter statement in the Extract or Replicat parameter file, it can
execute a stored procedure, query, or database command.
* For these situations, SQLEXEC does not need to be tied to a specific table and can be used to perform general SQL operations.
SQLEXEC "EXEC SPNAME()"
SQLEXEC ""
SQLEXEC ""
Lets create an example using above method.
-- Source Tbl :- SALES_MASTER
-- Target Tbls :- SALES_INDIA, SALES_MALAYSIA,TOTAL_SALES_INDIA, TOTAL_SALES_MALAYSIA, EMP_DETAILS
Here we have one source table and it will get replicated to four target tables.
Source Table
------------
SQL> DESC GG_SOURCE.SALES_MASTER;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMNT NUMBER
COUNTRY VARCHAR2(30)
SALE_DATE DATE
Target Tables:-
--------------
SQL> DESC GG_TARGET.SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
SQL> DESC GG_TARGET.SALES_MALAYSIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
SQL> DESC GG_TARGET.TOTAL_SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SALES_PROFIT NUMBER
SALES_DATE DATE
SQL> DESC GG_TARGET.TOTAL_SALES_MALAYSIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SALES_PROFIT NUMBER
SALES_DATE DATE
SQL> DESC GG_TARGET.EMP_DETAILS ;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
EMP_NAME VARCHAR2(64)
SALES_COMMISION NUMBER
SALES_DATE DATE
Setup the Extract Process.
--------------------------
GGSCI (S66CJ187) 8> EDIT PARAMS EXT_SALE
EXTRACT EXT_SALE
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE PASSWORD Gate_123
EXTTRAIL ./dirdat/SA
TABLE GG_SOURCE.SALES_MASTER;
GGSCI (S66CJ187) 11> ADD EXTRACT EXT_SALE , TRANLOG , BEGIN NOW
EXTRACT added.
GGSCI (S66CJ187) 12> ADD EXTTRAIL ./dirdat/SA, EXTRACT EXT_SALE
EXTTRAIL added.
GGSCI (S66CJ187) 13> START EXTRACT EXT_SALE
Sending START request to MANAGER ...
EXTRACT EXT_SALE starting
GGSCI (S66CJ187) 58> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:05
EXTRACT RUNNING EXT_SALE 00:00:00 00:00:04
EXTRACT RUNNING PMP1 00:00:00 00:00:08
Extract pump process
---------------------
GGSCI (S66CJ187) 71> EDIT PARAMS PMP_SALE
EXTRACT PMP_SALE
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTRAIL ./dirdat/SA
PASSTHRU
TABLE GG_SOURCE.SALES_MASTER;
GGSCI (S66CJ187) 60> ADD EXTRACT PMP_SALE, EXTTRAILSOURCE ./dirdat/SA
EXTRACT added.
GGSCI (S66CJ187) 61> ADD RMTTRAIL ./dirdat/SA, EXTRACT PMP_SALE
RMTTRAIL added.
GGSCI (S66CJ187) 63> START EXTRACT PMP_SALE
Sending START request to MANAGER ...
EXTRACT PMP_SALE starting
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:02
EXTRACT RUNNING EXT_SALE 00:00:00 00:00:10
EXTRACT RUNNING PMP1 00:00:00 00:00:07
EXTRACT RUNNING PMP_SALE 00:00:00 00:02:32
Replicat Process.
-----------------
-- Source Tbl :- SALES_MASTER
-- Target Tbls :- SALES_INDIA, SALES_MALAYSIA,TOTAL_SALES_INDIA, TOTAL_SALES_MALAYSIA, EMP_DETAILS
Lets create 5 Replicate process.
Process 1 :- RSAL_IND
---------------------
Source -
SQL> DESC GG_SOURCE.SALES_MASTER;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMNT NUMBER
COUNTRY VARCHAR2(30)
SALE_DATE DATE
Target Tables:-
--------------
SQL> DESC GG_TARGET.SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
a) Both the source and target columns are not same, lets use the defgen utility to create a source defintion.
GGSCI (S66CJ187) 1> EDIT PARAMS DEFGEN
DEFSFILE ./dirsql/sales_master.sql
USERID GGATE@NPTLPVT password Gate_123
TABLE GG_SOURCE.SALES_MASTER;
$ defgen PARAMFILE ./dirprm/defgen.prm REPORTFILE ./dirrpt/defgen.rpt
$ cat sales_master.sql
*+- Defgen version 2.0, Encoding hp-roman8
*
* Definitions created/modified 2014-01-20 15:13
*
* Field descriptions for each column entry:
*
* 1 Name
* 2 Data Type
* 3 External Length
* 4 Fetch Offset
* 5 Scale
* 6 Level
* 7 Null
* 8 Bump if Odd
* 9 Internal Length
* 10 Binary Length
* 11 Table Length
* 12 Most Significant DT
* 13 Least Significant DT
* 14 High Precision
* 15 Low Precision
* 16 Elementary Item
* 17 Occurs
* 18 Key Column
* 19 Sub Data Type
*
Database type: ORACLE
Character set ID: UTF-8
National character set ID: UTF-16
Locale: neutral
Case sensitivity: 14 14 14 14 14 14 14 14 14 14 14 14 11 14 14 14
*
Definition for table GG_SOURCE.SALES_MASTER
Record length: 262
Syskey: 0
Columns: 6
EMP_ID 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
SOLD_PRODUCT 64 30 56 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
SOLD_PRODUCT_ID 64 50 92 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
SOLD_AMNT 64 50 148 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
COUNTRY 64 30 204 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
SALE_DATE 192 19 240 0 0 1 0 19 19 19 0 5 0 0 1 0 1 0
End of definition
-- scp the file to the target server.
SQL> DESC GG_TARGET.EMP_DETAILS ;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
EMP_NAME VARCHAR2(64)
SALES_COMMISION NUMBER
SALES_DATE DATE
SQL> create or replace procedure get_emp_name ( v_emp_id in number, v_emp_fir_name out varchar2, v_emp_sec_name out varchar2) as
begin
select EMP_FIRST_NAME, EMP_LAST_NAME into v_emp_fir_name , v_emp_sec_name from gg_target.emp_names where emp_id = v_emp_id;
end;
/
> EDIT PRAMS RSAL_IND
REPLICAT RSAL_IND
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE Password Gate_123
SOURCEDEFS ./dirsql/sales_master.sql
DISCARDFILE ./dirrpt/RSAL_IND.dsc, append
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.SALES_INDIA, &
COLMAP (USEDEFAULTS, SOLD_AMT = SOLD_AMNT) , &
FILTER ( @STRCMP(@STRUP(COUNTRY), "INDIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.SALES_MALAYSIA, &
COLMAP (USEDEFAULTS, SOLD_AMT = SOLD_AMNT), &
FILTER ( @STRCMP(@STRUP(COUNTRY), "MALAYSIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.TOTAL_SALES_INDIA, &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, SALES_PROFIT = @COMPUTE (SOLD_AMNT * 0.1)), &
FILTER (@STRCMP(@STRUP(COUNTRY), "INDIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.TOTAL_SALES_MALAYSIA, &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, SALES_PROFIT = @COMPUTE (SOLD_AMNT * 0.1)), &
FILTER (@STRCMP(@STRUP(COUNTRY), "MALAYSIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.EMP_DETAILS, &
SQLEXEC (SPNAME GET_EMP_NAME, PARAMS ( V_EMP_ID = EMP_ID)), &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, EMP_NAME = @STRCAT (@GETVAL(GET_EMP_NAME.V_EMP_FIR_NAME), "," , @GETVAL (GET_EMP_NAME.V_EMP_SEC_NAME)), &
SALES_COMMISION = @COMPUTE (SOLD_AMNT * 0.02));
> ADD REPLICAT RSAL_IND, EXTTRAIL ./dirdat/SA
> START REPLICAT RSAL_IND
-- Lets test this.. insert 3 records as below in source..
SQL> insert into sales_master values (1001,'SONY PC','2001',2000,'INDIA',SYSDATE);
1 row created.
SQL> insert into sales_master values (1002,'SONY TV',2002,1800,'MALAYSIA',SYSDATE);
1 row created.
SQL> SQL> insert into sales_master values (1003,'SONY IPAD',2003,1000,'india',SYSDATE);
1 row created.
SQL> insert into sales_master values (1004,'SONY XBOX',2004,1500,'malaysia',sysdate);
1 row created.
SQL> commit;
Commit complete.
-- Below is the output on the five replicated tables.
SQL> select * from gg_target.emp_details;
EMP_ID EMP_NAME SALES_COMMISION SALES_DAT
---------- ---------------------------------------------------------------- --------------- ---------
1001 Manzoor,Ahamed 40 20-JAN-14
1002 Bhaskar,Suthradhar 36 20-JAN-14
1003 Ramesh,Ramasamy 20 20-JAN-14
1004 Jameel,Ahamed 30 20-JAN-14
SQL> select * from gg_target.sales_india;
EMP_ID SOLD_PRODUCT SOLD_PRODUCT_ID SOLD_AMT SALE_DATE
---------- ------------------------------ --------------- ---------- ---------
1001 SONY PC 2001 2000 20-JAN-14
1003 SONY IPAD 2003 1000 20-JAN-14
SQL> select * from gg_target.sales_malaysia;
EMP_ID SOLD_PRODUCT SOLD_PRODUCT_ID SOLD_AMT SALE_DATE
---------- ------------------------------ --------------- ---------- ---------
1002 SONY TV 2002 1800 20-JAN-14
1004 SONY XBOX 2004 1500 20-JAN-14
SQL> select * from gg_target.total_sales_india;
SOLD_PRODUCT SOLD_PRODUCT_ID SALES_PROFIT SALES_DAT
------------------------------ --------------- ------------ ---------
SONY PC 2001 200 20-JAN-14
SONY IPAD 2003 100 20-JAN-14
SQL> select * from gg_target.total_sales_malaysia;
SOLD_PRODUCT SOLD_PRODUCT_ID SALES_PROFIT SALES_DAT
------------------------------ --------------- ------------ ---------
SONY TV 2002 180 20-JAN-14
SONY XBOX 2004 150 20-JAN-14
============================================================================================================================ --->
==============
1. GG Installation.
a) GG home - eg /db/gg_trace/golden_gate --> untar the tar file ( tar -xvf software_file_name)
b) ggsci
> create subdirs
2. Connect to the db and create the golden gate admin user.
SQL> create tablespace golden_gate datafile '/db/oracle/oradata/NSBLSIT12/golden_gate01.dbf' size 2g;
Tablespace created.
SQL> create user ggate identified by Gate_123 default tablespace golden_gate;
User created.
grant connect, resource to ggate;
grant dba to ggate;
grant select any dictionary to ggate;
grant insert any table, select any table, delete any table, update any table to ggate;
grant flashback any table to ggate;
grant execute on dbms_flashback to ggate;
grant execute on utl_file to ggate;
grant create any table to ggate;
grant create sequence to ggate;
grant drop any table to ggate;
SQL> alter database add supplemental log data (all) columns;
Database altered.
SQL> @marker_setup.sql
SQL> @ddl_setup.sql
SQL> @role_setup
SQL> grant GGS_GGSUSER_ROLE to ggate;
Grant succeeded.
SQL> @ddl_enable
SQL> @ddl_pin ggate
Solution: Grant these privieleges to ggate
=======================================================
1. Run package to grant Oracle Streams admin privilege.
exec dbms_streams_auth.grant_admin_privilege('ggate');
exec dbms_goldengate_auth.grant_admin_privilege('ggate');
2. Grant INSERT into logmnr_restart_ckpt$.
grant insert on system.logmnr_restart_ckpt$ to ggate;
3. Grant UPDATE on streams$_capture_process.
grant update on sys.streams$_capture_process to ggate;
4. Grant the 'become user' privilege.
grant become user to ggate;
=======================================================
Examples:-
---------
Server: 10.41.66.187 - Source
Server: 10.14.24.152 - Target
Source database : NPTLPVT
target database : NTESTSRV
GG owner - GGATE
-- Initial Load
--> Direct load -- Extract sends data directly to Replicat to apply using SQL
(During the load, the records are applied to the target database one record at a time, so this
method is considerably slower than any of the other initial load methods)
Extract Parameters (RMTHOST, RMTTASK REPLICAT, GROUP) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters ADD REPLICAT GRP SPECIALRUN
--> Direct bulk load -- Replicat uses the Oracle SQL*Loader API.
Extract Parameters (RMTHOST, RMTTASK REPLICAT, GROUP) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters (BULKLOAD / ADD REPLICAT GRP SPECIALRUN)
--> File to Replicat -- Extract writes to a file (Trail File) that Replicat applies using SQL.
Extract Parameters (RMTHOST, RMTFILE) / ADD EXTRACT GRP SOURCEISTABLE
Replicat Parameters ADD REPLICAT GRP SPECIALRUN
--> File to database utility -- Extract writes to a file formatted for a DB bulk load utility.
Extract parameters (RMTFILE, FORMATASCII SQLLOADER / ADD EXTRACT GRP SOURCEISTABLE)
Replicat Parameters (GENLOADFILES) tO generate controlfile and runfile
Seting up the environment on source
-----------------------------------
--Setup the checkpoint table for whole instance.
GGSCI (S66CJ187) 2> dblogin userid ggate password Gate_123
Successfully logged into database.
GGSCI (S66CJ187) 9> ADD CHECKPOINTTABLE
ERROR: Missing checkpoint table specification.
GGSCI (S66CJ187) 10> EDIT PARAMS ./GLOBALS
GGSCHEMA GGATE
CHECKPOINTTABLE GGATE.CHKPTBL
GGSCI (S66CJ187) 2> ADD CHECKPOINTTABLE
No checkpoint table specified, using GLOBALS specification (GGATE.CHKPTBL)...
Successfully created checkpoint table GGATE.CHKPTBL.
--Setup the MGR Process
GGSCI (S66CJ187) 12> EDIT PARAMS MGR
PORT 7810
DYNAMICPORTLIST 7900-7950
GGSCI (S66CJ187) 13> START MGR
Manager started.
GGSCI (S66CJ187) 14> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
I) Load using initital load where the source and target table are having mismtach in columns.
SQL> desc GG_SOURCE.GG_SYNC_TBL1;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
-- Target table
SQL> desc GG_TARGET.GG_SYNC_TBL1_TGT;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER
ENAME VARCHAR2(30)
-- As we can see the source table GG_SYNC_TBL_1 has 3 columns and the target table GG_SYNC_TBL1_TGT
is having 2 columns, we can use the defgen (definition generator) utility to map this.
Create a parameter file first.
GGSCI (S66CJ187) 4> edit params defgen
DEFSFILE ./dirsql/GG_SYNC_TBL1.sql
USERID GGATE password Gate_123
TABLE GG_SOURCE.GG_SYNC_TBL1;
$ ./defgen PARAMFILE ./dirprm/defgen.prm REPORTFILE ./dirrpt/defgen.rpt
A GG_SYNC_TBL1.sql is generated under dirsql directory which looks like
*+- Defgen version 2.0, Encoding hp-roman8
*
* Definitions created/modified 2014-01-15 16:31
*
* Field descriptions for each column entry:
*
* 1 Name
* 2 Data Type
* 3 External Length
* 4 Fetch Offset
* 5 Scale
* 6 Level
* 7 Null
* 8 Bump if Odd
* 9 Internal Length
* 10 Binary Length
* 11 Table Length
* 12 Most Significant DT
* 13 Least Significant DT
* 14 High Precision
* 15 Low Precision
* 16 Elementary Item
* 17 Occurs
* 18 Key Column
* 19 Sub Data Type
*
Database type: ORACLE
Character set ID: UTF-8
National character set ID: UTF-16
Locale: neutral
Case sensitivity: 14 14 14 14 14 14 14 14 14 14 14 14 11 14 14 14
*
Definition for table GG_SOURCE.GG_SYNC_TBL1
Record length: 128
Syskey: 0
Columns: 3
EMPNO 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
ENAME 64 30 56 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
DETAILS 64 30 92 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
End of definition
ftp/scp the GG_SYNC_TBL1.sql to the target server under the dirsql directory of GG software home.
Extract on the source side
--------------------------
GGSCI (S66CJ187) 20>
GGSCI (S66CJ187) 20> EDIT PARAMS EXT1
EXTRACT DIR_1
USERID GGATE, PASSWORD Gate_123
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTASK REPLICAT, GROUP DIR_R1
TABLE GG_SOURCE.GG_SYNC_TBL2;
GGSCI (S66CJ187) 20> ADD EXTRACT EXT1, SOURCEISTABLE
Replicat on the target side
---------------------------
-- Setup the environment (CHECKPOINTABLE and MGR Process as per above).
GGSCI (S24BF152) 1> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
GGSCI (S24BF152) 2> EDIT PARAMS REP1
REPLICAT REP1
USERID GGATE, PASSWORD Gate_123
SOURCEDEFS ./dirsql/GG_SYNC_TBL1.sql
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_TARGET.GG_SYNC_TBL1_TGT, COLMAP (EMPNO=EMPNO ENAME=ENAME);
GGSCI (S24BF152) 3> ADD REPLICAT REP1, SPECIALRUN
Start the Loading
-----------------
On the source side start the Extract prcoess , since it is a initial load the replicat
will be started automatically on the target side.
GGSCI (S66CJ187) 2> START EXTRACT EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
GGSCI (S66CJ187) 9> INFO EXT1
EXTRACT EXT1 Last Started 2014-01-16 08:10 Status RUNNING
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL1
2014-01-16 08:10:45 Record 1
Task SOURCEISTABLE
GGSCI (S66CJ187) 10> !
INFO EXT1
EXTRACT EXT1 Last Started 2014-01-16 08:10 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL1
2014-01-16 08:10:46 Record 1000
Task SOURCEISTABLE
GGSCI (S66CJ187) 11> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
--as above 1000 records been loaded and then the extract process is stopped.
--Check the count on the target side..
SQL> select count(*) from gg_target.gg_sync_tbl1_tgt;
COUNT(*)
----------
1000
II) Change Data Capture.
------------------------
Source Extract Process
----------------------
GGSCI (S66CJ187) 4> EDIT PARAMS EXT1
EXTRACT EXT1
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE@NPTLPVT, PASSWORD GATE_123
EXTTRAIL ./dirdat/XO
DDL INCLUDE MAPPED EXCLUDE OBJTYPE TRIGGER
--TRANLOGOPTIONS DBLOGREADER # IF LOG FILES ARE STORED IN ASM (Supported 10.2.0.5 and higher and 11.2.0.2 & Higher Not 11gr1)
--TRANLOGOPTIONS ASMUSER SYS@
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 5> ADD TRANDATA GG_SOURCE.GG_SYNC_TBL1
Logging of supplemental redo log data is already enabled for table GG_SOURCE.GG_SYNC_TBL1.
GGSCI (S66CJ187) 6> ADD EXTRACT EXT1, TRANLOG, BEGIN NOW
EXTRACT added.
GGSCI (S66CJ187) 8> ADD EXTTRAIL ./dirdat/XO, EXTRACT EXT1, MEGABYTES 20
EXTTRAIL added.
GGSCI (S66CJ187) 10> START EXTRACT EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
GGSCI (S66CJ187) 19> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:01
Source Pump Process
-------------------
GGSCI (S66CJ187) 20> EDIT PARAMS PMP1
EXTRACT PMP1
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTRAIL ./dirdat/XO
PASSTHRU
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 23> ADD EXTRACT PMP1 , EXTTRAILSOURCE ./dirdat/XO
EXTRACT added.
GGSCI (S66CJ187) 25> ADD RMTTRAIL ./dirdat/XO , EXTRACT PMP1, MEGABYTES 20
RMTTRAIL added.
GGSCI (S66CJ187) 26> START EXTRACT PMP1
Sending START request to MANAGER ...
EXTRACT PMP1 starting
GGSCI (S66CJ187) 41> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:04
EXTRACT RUNNING PMP1 00:00:00 00:00:22
-- Check whether the file is transfered to the target server.
/app/oracle/golden_gate/dirdat> ls -lrt
total 0
-rw-rw-rw- 1 oracle oinstall 0 Jan 16 09:38 XO000000
-- Add some records in the source table.
SQL> begin
2 for i in 1001..2000 loop
3 insert into gg_sync_tbl1 values (i, dbms_random.string('U',30), DBMS_RANDOM.STRING('U',30));
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select count(*) from gg_source.gg_sync_tbl1;
COUNT(*)
----------
2000
-- Register the extract so that rman will not delete the archived log files if the data is not captured by
the extract process.
GGSCI (S66CJ187) 7> REGISTER EXTRACT EXT1 LOGRETENTION
2014-01-16 10:59:48 ERROR OGG-01754 Cannot register or unregister EXTRACT EXT1 because the Extract is currently running. Stop the Extract and retry the command.
GGSCI (S66CJ187) 8> STOP EXTRACT EXT1
Sending STOP request to EXTRACT EXT1 ...
Request processed.
GGSCI (S66CJ187) 9> REGISTER EXTRACT EXT1 LOGRETENTION
2014-01-16 11:00:07 INFO OGG-01749 Successfully registered EXTRACT EXT1 to start managing log retention at SCN 59178692.
GGSCI (S66CJ187) 11> START EXT1
Sending START request to MANAGER ...
EXTRACT EXT1 starting
Target Replicat process
-----------------------
GGSCI (S24BF152) 7> DELETE REPLICAT REP1
Deleted REPLICAT REP1.
GGSCI (S24BF152) 2> EDIT PARAMS REP1
REPLICAT REP1
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE, PASSWORD Gate_123
SOURCEDEFS ./dirsql/GG_SYNC_TBL1.sql
DISCARDFILE ./dirrpt/REP1.dsc , append
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_TARGET.GG_SYNC_TBL1_TGT, COLMAP (EMPNO=EMPNO ENAME=ENAME);
GGSCI (S24BF152) 8> ADD REPLICAT REP1 , EXTTRAIL ./dirdat/XO
REPLICAT added.
GGSCI (S24BF152) 9> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT STOPPED REP1 00:00:00 00:00:06
GGSCI (S24BF152) 10> START REPLICAT REP1
Sending START request to MANAGER ...
REPLICAT REP1 starting
GGSCI (S24BF152) 16> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:17:03 00:00:06
GGSCI (S24BF152) 17> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:04
-- Now there is no lag.. let check the count in the target.
SQL> select count(*) from gg_target.gg_sync_tbl1_tgt;
COUNT(*)
----------
2000
III) Initial Load using Direct Bulk load
------------------------------------------------
Source Table :- GG_SYNC_TBL2
Target Table :- GG_SYNC_TBL2
Source
------
SQL> DESC GG_SYNC_TBL2;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
SQL> insert into GG_SYNC_TBL2 select * from GG_SYNC_TBL1;
2000 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from GG_SYNC_TBL2;
COUNT(*)
----------
2000
GGSCI (S66CJ187) 3> dblogin userid ggate password Gate_123
Successfully logged into database.
GGSCI (S66CJ187) 22> EDIT PARAMS DIR_1
EXTRACT DIR_1
USERID GGATE, PASSWORD Gate_123
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTASK REPLICAT, GROUP DIR_R1
TABLE GG_SOURCE.GG_SYNC_TBL2;
GGSCI (S66CJ187) 4> ADD EXTRACT DIR_1, SOURCEISTABLE
EXTRACT added.
Replicat Side
-------------
SQL> DESC GG_SYNC_TBL2;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER
ENAME VARCHAR2(30)
DETAILS VARCHAR2(30)
GGSCI (S24BF152) 3> EDIT PARAMS DIR_R1
REPLICAT DIR_R1
USERID GGATE , PASSWORD Gate_123
ASSUMETARGETDEFS
BULKLOAD
MAP GG_SOURCE.GG_SYNC_TBL2, TARGET GG_TARGET.GG_SYNC_TBL2;
GGSCI (S24BF152) 8> ADD REPLICAT DIR_R1 SPECIALRUN
REPLICAT added.
-------
Start the extract from the Source side.
GGSCI (S66CJ187) 4> START EXTRACT DIR_1
Sending START request to MANAGER ...
EXTRACT DIR_1 starting
GGSCI (S66CJ187) 8> INFO DIR_1
EXTRACT DIR_1 Last Started 2014-01-17 10:24 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Table GG_SOURCE.GG_SYNC_TBL2
2014-01-17 10:24:54 Record 2000
Task SOURCEISTABLE
Report file - of Replicat process.
==================================================================
Report at 2014-01-17 10:25:00 (activity since 2014-01-17 10:24:54)
From Table GG_SOURCE.GG_SYNC_TBL2 to GG_TARGET.GG_SYNC_TBL2:
# inserts: 2000
# updates: 0
# deletes: 0
# discards: 0
-- Lets check the count.
SQL> select count(*) from gg_target.gg_sync_tbl2;
COUNT(*)
----------
2000
IV) Usinig Logdump Utility.
---------------------------
Desc Command Eg
------------------------------------------------------------------------------------------
Open a Trail File - open
To view Trail file header - fileheader on Logdump 2 > fileheader on
To view Record header - ghdr on Logdump 3 > ghdr on
To view Column information - detail on Logdump 4 > detail on
To View column values - detail data Logdump 5 > detail data
To control the length of value - reclen
To move to first records - pos
To move to next record - next or n Logdump 8 > next (or just n)
To move to the starting point
or good header - scanforheader (sfh) Logdump 9 > sfh
To move to previous good header - sfh prev Logdump 10> sfh prev
Record header - (TransInd : . (x00)
00 - Begining of the transaction.
01 - Middle of the transaction.
02 - Last of the transaction.
03 - Whole of the transaction.
Count records in trail - count Logdump 61 > count
Using Filter Options:-
----------------------
Eg.
SQL> update gg_sync_tbl1 set ename = 'MANZOOR' where empno = 1678;
1 row updated.
SQL> commit
Commit complete.
SQL> begin
2 for i in 2001..2500 loop
3 insert into gg_sync_tbl1 values (i,dbms_random.string('U',30), dbms_random.string('U',30));
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> delete from gg_sync_tbl1 where ENAME = 'MANZOOR';
1 row deleted.
SQL> commit;
Commit complete.
-- Lets find out this delete tractions using filter option in trail file.
Logdump 175 >open ./dirdat/XO000000
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000000
Logdump 176 >GHDR ON
Logdump 177 >DETAIL ON
Logdump 178 >DETAIL DATA
Logdump 179 >FILEHEADER ON
Logdump 180 >FILTER INCLUDE FILENAME GG_SOURCE.GG_SYNC_TBL1 # Filter the table name
Logdump 181 >FILTER INCLUDE RECTYPE DELETE # Filter the delete operation
Logdump 182 >SHOW FILTER # Display the current filter condition.
Data filters are ENABLED
Include Match ANY
Rectypes : Delete
Filename-0 : GG_SOURCE.GG_SYNC_TBL1
Exclude Match ANY
Logdump 183 >FILTER MATCH ALL # Instruciting to find the records which matches all the condition can use FILTER MATCH ANY for any of the one condition.
Logdump 184 >N # To start search (next)
Filtering suppressed 1001 records
Logdump 185 >NT # The record is not present in this trail file, to continue searching in next trail enter NT (next trail)
LogTrail /db/oracle/golden_gate/dirdat/XO000000 closed
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000001
Logdump 186 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 12 (x000c) IO Time : 2014/01/18 08:36:30.000.000
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.000.000 Delete Len 12 RBA 108695
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 | ........1678
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Filtering suppressed 503 records
## Now we have found the delete operation.
-------------------------------------------------------------------------------
Logging lodump session LOG TO
Stop logging session LOG STOP LOG STOP
Reverse Utitlity (Reversal of Transaction)
----------------------------------------------------------
1. Used to extract the before data and backout the changes.
2. It can use either trailfile or transaction logs (archive logs).
Restrictions
------------
1. Long and LOB columns are not reversed if before values are not stored in db.
2. XML TYPE tables are not supported.
Lets backout the happend from the below update statment... around (500 Transactions).
update gg_sync_tbl1 set ename = 'MANZOOR' where empno = 1678;
1) Get the time from and to backout the transaction.
Logdump 194 >open ./dirdat/XO000000
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000000
Logdump 195 >GHDR ON
Logdump 196 >DETAIL ON
Logdump 197 >DETAIL DATA
Logdump 198 >FILEHEADER ON
Logdump 199 >FILTER INCLUDE RECTYPE 15; FILTER INCLUDE FILENAME GG_SOURCE.GG_SYNC_TBL1; FILTER MATCH ALL
Logdump 200 >SHOW FILTER
Data filters are ENABLED
Include Match ALL
Rectypes : FieldComp
Filename-0 : GG_SOURCE.GG_SYNC_TBL1
Exclude Match ANY
Logdump 201 >
Logdump 201 >n
Filtering suppressed 1001 records
Logdump 202 >nt
LogTrail /db/oracle/golden_gate/dirdat/XO000000 closed
Current LogTrail is /db/oracle/golden_gate/dirdat/XO000001
Logdump 203 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 65 (x0041) IO Time : 2014/01/17 12:27:51.000.000
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:51.000.000 FieldComp Len 65 RBA 1012
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
The Time of the transaction is 2014/01/17 12:27:51.000.000
The time of last transaction is 2014/01/18 08:36:30.000.000
Lets backuout all the transaction happend between these time.
Process
-------
a) Create a parameter file for extract process.
b) Run the reverse utility.
c) Run replicat process.
Parameter file (Pre OGG 11.2 )
SPECIALRUN, TRANLOG
USERID GGATE Password Gate_123
BEGIN 2014-01-17 12:27:51
END 2014-01-18 08:36:30
GETUPDATEBEFORES
NOCOMPRESSDELETES
--RMTHOST 10.41.66.187 MGRPORT 7810 # IF the file has to be generated on remote system
--RMTFILE ./dirdat/REV.dat # IF the file has to be generated on remote system
EXTFILE ./dirdat/REV.dat
TABLE GG_SOURCE.GG_SYNC_TBL1;
Run from os shell ( ./extract paramfile ./dirprm/ext_1.prm)
Pameter file (From OGG 11.2)
GGSCI (S66CJ187) 9> EDIT PARAMS EXT_1
EXTRACT EXT_1
USERID GGATE Password Gate_123
END 2014-01-18 08:36:30
GETUPDATEBEFORES
NOCOMPRESSDELETES
--RMTHOST 10.14.24.152 MGRPORT 7810 # IF the trail file has to be generated on remote system
--RMTTRAIL ./dirdat/RE # IF the trail file has to be generated on remote system
EXTTRAIL ./dirdat/RE
TABLE GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 10> ADD EXTRACT EXT_1, TRANLOG, BEGIN 2014-01-17 12:27:00
EXTRACT added.
GGSCI (S66CJ187) 13> ADD EXTTRAIL ./dirdat/RE , extract EXT_1
EXTTRAIL added.
GGSCI (S66CJ187) 14> START EXTRACT EXT_1
Sending START request to MANAGER ...
EXTRACT EXT_1 starting
GGSCI (S66CJ187) 27> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:01
EXTRACT RUNNING EXT_1 43:53:36 00:07:40
EXTRACT RUNNING PMP1 00:00:00 00:00:06
GGSCI (S66CJ187) 28> INFO EXT_1
EXTRACT EXT_1 Last Started 2014-01-19 08:29 Status RUNNING
Checkpoint Lag 44:01:18 (updated 00:00:01 ago)
Log Read Checkpoint Oracle Redo Logs
2014-01-17 12:27:51 Seqno 180, RBA 60378112
SCN 0.0 (0)
GGSCI (S66CJ187) 30> INFO ALL
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:10
EXTRACT STOPPED EXT_1 23:52:44 00:00:12
EXTRACT RUNNING PMP1 00:00:00 00:00:05
Once the extraction is completed the extract process is stopped.
--Below is the snap from the REPORT FILE.
From Table GG_SOURCE.GG_SYNC_TBL1:
# inserts: 500
# updates: 1
# befores: 1
# deletes: 1
# discards: 0
--Lets review the trail file to find the first record, as per above the first record should be
update.
$ ls -lrt RE*
total 10816
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:46 RE000000
Logdump 314 >open RE000000
Current LogTrail is /db/oracle/golden_gate/dirdat/RE000000
Logdump 315 >GHDR ON
Logdump 316 >DETAIL ON
Logdump 317 >DETAIL DATA
Logdump 318 >FILEHEADER ON
Logdump 319 >POS 0
Reading forward from RBA 0
Logdump 320 >N
Logdump 321 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 88 (x0058) IO Time : 2014/01/17 12:27:50.910.232
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x00) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:50.910.232 FieldComp Len 88 RBA 954
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G b
0000 0008 0000 0004 3136 3738 0001 0022 0000 001e | ........1678..."....
4b59 4857 5055 5255 4d43 4551 5a53 544b 5954 5947 | KYHWPURUMCEQZSTKYTYG
5a50 4e5a 4158 4e5a 424d 0002 0022 0000 001e 5241 | ZPNZAXNZBM..."....RA
4154 4c46 4756 4f42 5853 4b50 4454 4748 4246 4356 | ATLFGVOBXSKPDTGHBFCV
4d4e 444b 5656 5652 | MNDKVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 34 (x0022)
0000 001e 4b59 4857 5055 5255 4d43 4551 5a53 544b | ....KYHWPURUMCEQZSTK
5954 5947 5a50 4e5a 4158 4e5a 424d | YTYGZPNZAXNZBM
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
--- We could see this is the BEFORE image of the update statement we required to rollback the update.
---Check the last statment in the trail..
Logdump 322 >POS LAST
Reading forward from RBA 109018
Logdump 323 >n
Logdump 324 >pos rev
Reading in reverse from RBA 109018
Logdump 325 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 65 (x0041) IO Time : 2014/01/18 08:36:30.019.919
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.019.919 Delete Len 65 RBA 108826
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
--- The statment is delete ...
-- Now the extract process extracted the transactions happend during the mentioned time period.
Now we need to reverse the operation to rollback, i.e. insert becomes deletes, delete become inserert,
update become update with before image. This can be done using the REVERSE utility.
Execute the below command to reverse the operation using reverse utility.
$ pwd
/db/oracle/golden_gate/dirdat
$ ls -lrt
total 10816
-rw-rw-rw- 1 oracle oinstall 189979 Jan 16 11:00 XO000000
-rw-rw-rw- 1 oracle oinstall 5103031 Jan 17 10:22 XT000000
-rw-rw-rw- 1 oracle oinstall 108834 Jan 19 08:05 XO000001
-rw-rw-rw- 1 oracle oinstall 1012 Jan 19 08:05 XO000002
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:46 RE000000 <--- extracted="" file.="" p="" the="" this="">
$ cd ..
$ ./reverse ./dirdat/RE* ./dirdat/RV*
Oracle GoldenGate Dynamic Rollback
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230
HP/UX, IA64, 64bit (optimized) on Apr 23 2012 23:15:02
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
*Warning* Source file contained Deletes which maybe compressed
Reversed ./dirdat/RE000000 to /db/oracle/golden_gate/dirdat/RV000000
Total Data Bytes 44218
Avg Bytes/Record 87
Delete 1
Insert 500
FieldComp 2
Before Images 2
After Images 501
$ cd dirdat
$ ls -lrt
total 11040
-rw-rw-rw- 1 oracle oinstall 189979 Jan 16 11:00 XO000000
-rw-rw-rw- 1 oracle oinstall 5103031 Jan 17 10:22 XT000000
-rw-rw-rw- 1 oracle oinstall 108834 Jan 19 08:05 XO000001
-rw-rw-rw- 1 oracle oinstall 1012 Jan 19 08:05 XO000002
-rw-rw-rw- 1 oracle oinstall 109018 Jan 19 08:58 RE000000
-rw-r--r-- 1 oracle oinstall 109018 Jan 19 09:15 RV000000
-- Lets view the content of the trail file..
-- First Record..
Logdump 333 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 65 (x0041) IO Time : 2014/01/18 08:36:30.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193305728
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:36:30.000.000 Insert Len 65 RBA 954
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G s
0000 0008 0000 0004 3136 3738 0001 000b 0000 0007 | ........1678........
4d41 4e5a 4f4f 5200 0200 2200 0000 1e52 4141 544c | MANZOOR..."....RAATL
4647 564f 4258 534b 5044 5447 4842 4643 564d 4e44 | FGVOBXSKPDTGHBFCVMND
4b56 5656 52 | KVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 11 (x000b)
0000 0007 4d41 4e5a 4f4f 52 | ....MANZOOR
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
-- As we can see the delete reversed to insert.
-- Next record
Logdump 349 >N
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: B (x42)
RecLength : 88 (x0058) IO Time : 2014/01/18 08:35:51.000.000
IOType : 3 (x03) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 193298448
Continued : N (x00) RecCount : 1 (x01)
2014/01/18 08:35:51.000.000 Delete Len 88 RBA 1146
Name: GG_SOURCE.GG_SYNC_TBL1
Before Image: Partition 4 G s
0000 0008 0000 0004 3235 3030 0001 0022 0000 001e | ........2500..."....
4146 4a42 5558 524e 5052 424c 4d5a 4e49 5551 5345 | AFJBUXRNPRBLMZNIUQSE
5149 4656 5056 594c 5943 0002 0022 0000 001e 5747 | QIFVPVYLYC..."....WG
4e56 4a4c 4146 4a55 5347 5548 5954 4751 4e52 4248 | NVJLAFJUSGUHYTGQNRBH
565a 5351 4148 4e54 | VZSQAHNT
Column 0 (x0000), Len 8 (x0008)
0000 0004 3235 3030 | ....2500
Column 1 (x0001), Len 34 (x0022)
0000 001e 4146 4a42 5558 524e 5052 424c 4d5a 4e49 | ....AFJBUXRNPRBLMZNI
5551 5345 5149 4656 5056 594c 5943 | UQSEQIFVPVYLYC
Column 2 (x0002), Len 34 (x0022)
0000 001e 5747 4e56 4a4c 4146 4a55 5347 5548 5954 | ....WGNVJLAFJUSGUHYT
4751 4e52 4248 565a 5351 4148 4e54 | GQNRBHVZSQAHNT
-- Insert reversed to delete.
--Last record.
Logdump 352 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 88 (x0058) IO Time : 2014/01/17 12:27:51.000.000
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x02) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 180 AuditPos : 60374144
Continued : N (x00) RecCount : 1 (x01)
2014/01/17 12:27:51.000.000 FieldComp Len 88 RBA 108802
Name: GG_SOURCE.GG_SYNC_TBL1
After Image: Partition 4 G e
0000 0008 0000 0004 3136 3738 0001 0022 0000 001e | ........1678..."....
4b59 4857 5055 5255 4d43 4551 5a53 544b 5954 5947 | KYHWPURUMCEQZSTKYTYG
5a50 4e5a 4158 4e5a 424d 0002 0022 0000 001e 5241 | ZPNZAXNZBM..."....RA
4154 4c46 4756 4f42 5853 4b50 4454 4748 4246 4356 | ATLFGVOBXSKPDTGHBFCV
4d4e 444b 5656 5652 | MNDKVVVR
Column 0 (x0000), Len 8 (x0008)
0000 0004 3136 3738 | ....1678
Column 1 (x0001), Len 34 (x0022)
0000 001e 4b59 4857 5055 5255 4d43 4551 5a53 544b | ....KYHWPURUMCEQZSTK
5954 5947 5a50 4e5a 4158 4e5a 424d | YTYGZPNZAXNZBM
Column 2 (x0002), Len 34 (x0022)
0000 001e 5241 4154 4c46 4756 4f42 5853 4b50 4454 | ....RAATLFGVOBXSKPDT
4748 4246 4356 4d4e 444b 5656 5652 | GHBFCVMNDKVVVR
-- Update has been updated with old value.
-- Setup a replicat process to replicat these changes.
GGSCI (S66CJ187) 4> EDIT PARAMS REP_1
REPLICAT REP_1
END RUNTIME
USERID GGATE PASSWORD Gate_123
ASSUMETARGETDEFS
DISCARDFILE ./dirrpt/rep_1.dsc, append
MAP GG_SOURCE.GG_SYNC_TBL1, TARGET GG_SOURCE.GG_SYNC_TBL1;
GGSCI (S66CJ187) 5> ADD REPLICAT REP_1, EXTTRAIL ./dirdat/RV
REPLICAT added.
GGSCI (S66CJ187) 6> START REPLICAT REP_1
Sending START request to MANAGER ...
REPLICAT REP_1 starting
GGSCI (S66CJ187) 10> INFO REP_1
REPLICAT REP_1 Last Started 2014-01-19 09:27 Status STOPPED
Checkpoint Lag 00:00:00 (updated 00:00:36 ago)
Log Read Checkpoint File ./dirdat/RV000000
2014-01-17 12:27:51.000000 RBA 109018
--- Extract from report file.
=============================================================
From Table GG_SOURCE.GG_SYNC_TBL1 to GG_SOURCE.GG_SYNC_TBL1:
# inserts: 1
# updates: 1
# deletes: 500
# discards: 0
=============================================================
As we can see from the snap above,
-- 500 insert becomes deletes
-- 1 delete becomes insert
-- 1 update become update with before image.
-- Lets look at the db.
SQL> select count(*) from gg_source.gg_sync_tbl1;
COUNT(*)
----------
2000
- TRANLOG specifies the transaction log as the data source.
- GETUPDATEBEFORES is used to include before images of update records, which contain record details before an update (as opposed to after images).
- NOCOMPRESSDELETES causes Extract to send all column data to the output, instead of sending only the primary key. It enables deletes to be converted back to inserts.
- END RUNTIME causes the Extract or Replicat to terminate when it reaches process startup time.
======================================================================================================================================================================
V) Extract Process Defaults:-
a. Commited data only
b. Full images of inserts.
c. Only primary key and changed columns for update.
d. Only primary key for delete.
e. Only after image of update.
VI) Extract Parameter catagoreis
a) General
b) Processing Methods - When to start and end the process.
c) Database login
d) Selecting and Mapping data.
e) Routing Data
f) Formatting Data
g) Custom Processing - Whether to invoke a user exit routine or a macro
h) Reporting
i) Error Handling - Contains records that cannot be processed and error handling for DDL extraction
j) Tuning - Controls how long data is buffered before writing to a trail, and memory allocations.
k) Maintenance
l) Security
VII) Options on TRANSLOGOPTION.
a) TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT log_%t_%s_%r.arc --> To specify differet format for archivelog.
b) TRANLOGOPTIONS ALTARCHIVELOGDEST /oradata/archive/log2 --> To specify differnet archive log location.
c) TRANLOGOPTIONS ARCHIVEDLOGONLY --> To specify gg to read only from the archive log (ALO)
d) TRANLOGOPTIONS EXCLUDEUSER ggsrep --> To execlude particular user from extract.
e) TRANLOGOPTIONS EXCLUDETRANS "ggs_repl" --> To specify the transaction name of the Replicat database user so that those transactions are not captured by Extract.
VIII) DBOPTIONS. (Database options).
a) SUPPRESSTRIGGERS | NOSUPPRESSTRIGGERS - For Oracle databases to turn off triggers on the target database.
b) DEFERREFCONST - Defer deferrable constraints.
c) FETCHBATCHSIZE
======================================================================================================================================================================
IX) Data Manipulation and Mapping
---------------------------------
a) Done by TABLE and MAP parameters.
Parameter
TABLE / MAP | Selects
WHERE | Table, Row,
FILTER | Row operation, Range.
TABLE COLS | Columns
COLSEXCEPT |
Table selection -> MAP gg_source.gg_sync_tbl1, TARGET gg_target.gg_sync_tbl1_tgt;
Row Selection -> WHERE (EMPNAME = "MANZOOR");
Operation Selection -> FILTER (ON UPDATE, ON DELETE, amount > 0);
Column Selection -> TABLE gg_source.gg_sync_tbl1 COLSEXCEPT (ENAME);
WHERE CLUASE
------------
-- Can appear on TABLE or MAP
-- Cannot use for arithmetic operation and refer to trail header and user token values.
-- Can perform evaluation as below.
Element Description Defined by Example
------------------- ------------------------ ---------------------
Columns COL_NAME ENAME
Comparision operator >, <, >=, <=, =, <> WHERE (ENAME = "MANZOOR")
Numeric values 38383.00 WHERE (EMPNO = 2)
Literal String "NAME", "CAR" WHERE (ENAME = "MANZOOR")
Field tests @NULL, @PRESENT, @ABSENT WHERE (ENAME = @NULL) / WHERE ( EMPNO @PRESENT AND EMPNO <> @NULL)
Logical operator AND, OR WHERE ( EMPNO @PRESENT AND EMPNO <> @NULL)
FILTER CLAUSE
-------------
-- Used for complex include / exclude data selection.
-- Can deploy oracle GG built in function.
-- Can use multiple filter in one statement, if one filter fails the whole filter fails.
-- Include multiple option clause eg (ON INSERT / ON DELETE)
-- Raise a user defined error for error handling and processing. (FILTER RAISEERROR)
Eg.
FILTER ((PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000); -- The following example includes rows where the price multiplied by the amount exceeds 10,000.
FILTER (@STRFIND(NAME, "JOE") > 0); -- The following example includes rows containing the string “JOE”:
FILTER (ON UPDATE, ON DELETE, @COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000); -- Executes the FILTER clause for both updates and deletes, but not inserts.
RANGE CLAUSE
------------
-- Used to divide the workload into mutiple randomly distributed data.
-- Same row will always processed by the same process group , it uses hash against the primary key or user defined columns.
Eg.
Replicat #1
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (1,3));
Replicat #2
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (2,3));
Replicat #3
MAP SALES.ACCOUNT,
TARGET SALES.ACCOUNT, FILTER (@RANGE (3,3));
Three Replicat processes, with each Replicat group processing one-third of the data in the GoldenGate trail based on the primary key.
TABLE SALES.ACCOUNT, FILTER (@RANGE (1,3,REP_ID));
TABLE SALES.ACCOUNT, FILTER (@RANGE (2,3,REP_ID));
TABLE SALES.ACCOUNT, FILTER (@RANGE (3,3,REP_ID));
Related by REP_ID, require three Replicats to handle the
transaction volumes.
By hashing the REP_ID column, related rows will always be processed to the same Replicat.
Building History
----------------
This is to record all the changes happend on the table, all the changes will be applied as an new insert using
INSERTALLRECORDS parameter.
This example uses special values to build a history of operations data:
INSERTALLRECORDS
MAP SALES.ACCOUNT, TARGET REPORT.ACCTHISTORY,
COLMAP (USEDEFAULTS,
TRAN_TIME = @GETENV("GGHEADER","COMMITTIMESTAMP"),
OP_TYPE = @GETENV("GGHEADER", "OPTYPE"),
BEFORE_AFTER_IND =
@GETENV("GGHEADER", "BEFOREAFTERINDICATOR"),
);
Oralce GG builtin Functions:-
---------------------------
FUNCTION DEFINITION Example
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CASE - Allows user to select a value depending on a series of value tests
EVAL - Allows a user to select a value depending on a series of independent tests
IF - Conditional checking AMT_COL = @IF (AMT > 0, AMT, 0)
COLSTAT - Tests whether a column value is missing, NULL, or invalid
COLTEST - Tests whether a column value is present, missing, NULL, or invalid
VALONEOF - STATE_COL = @IF (@VALONEOF ("CHENNAI","MADURAI"),"TN","OTHERS")
DATE - Returns date in variety of formats.
DATEDIFF - Returns diffenet between two date and times.
DATENOW - Returns current date.
COMPUTE - Returns the result of an arithmetic expression
NUMBIN - Convert binary string to number.
NUMSTR - Convert string to number.
STRCAT - Concatenates two or more strings. FULL_NAME = @STRCAT (LAST_NAME,",",FIRST_NAME);
STRCMP - Compares two strings to determine whether they are equal, or whether the first is less or greater than the second.
STREQ - Tests to see whether two strings are equal. Returns 1 for equal and 0 if not equal.
STREXT - Extracts selected characters from a string COUNTRY_CODE = @STREXT (PHONE, 1,2);
STRFIND - Finds the occurrence of a string within a string
STRLEN - Returns the length of a string.
STRLTRIM - Trims leading spaces in a column
STRNCAT - Concatenates one or more strings up to a specified number of characters per string
STRNCMP - Compares two strings up to a certain number of characters
STRNUM - Converts a number into a string, with justification and zerofill options
STRRTRIM - Trims trailing spaces in a column
STRSUB - Substitutes one string for another within a column
STRTRIM - Trims both leading and trailing spaces in a column
STRUP - Changes a string to uppercase
BINARY - Keeps source data in its original binary format in the target when source column is defined as character
BINTOHEX - Converts a binary string to a hexadecimal string
GETENV - Returns information on the GoldenGate environment, trail file header, trail record header, last replicated operation
and lag. Can retrieve the commit timestamp in local time or GMT.
GETVAL - Extracts parameters from a stored procedure as input to a FILTER or COLMAP clause
HEXTOBIN - Converts a hexadecimal string to a binary string
HIGHVAL,LOWVAL - Emulate COBOL functions that allow you to set a numeric limit on string or binary data types
RANGE - Divides a workload into multiple groups of data, while ensuring the same row will always be sent to the same process.
RANGE uses a hash against primary key or user-defined columns.
TOKEN - Maps environmental values that are stored in the user token area to the target column.
SQLEXEC
-------
The SQLEXEC parameter extends GoldenGate capabilities by enabling Extract and Replicat to communicate with the
database through SQL queries or run stored procedures.
SQLEXEC also extends data integration beyond what can be done with GoldenGate functions.
A) Execute a stored procedure or SQL by query using the SQLEXEC clause of the TABLE or MAP parameter.
B) Use SQLEXEC at the root level (without input/output parameters) to call a stored procedure, run a SQL query, or issue a database command.
EG.
CREATE OR REPLACE PROCEDURE LOOKUP (CODE_PARAM IN VARCHAR2, DESC_PARAM OUT VARCHAR2) AS
BEGIN
SELECT DESC_COL INTO DESC_PARAM FROM LOOKUP_TABLE WHERE CODE_COL = CODE_PARAM;
END;
SYNTAX FOR SQLEXEC WITH STORED PRODCEDURE
SQLEXEC (SPNAME
[ID
---------------------------------------------------------------------------------------
MAP HR.ACCOUNT, TARGET HR.NEWACCT, &
SQLEXEC (SPNAME lookup, PARAMS (code_param = account_code)), &
COLMAP (USEDEFAULTS, newacct_id = account_id, newacct_val = @GETVAL(lookup.desc_param));
---------------------------------------------------------------------------------------
Maps data from the ACCOUNT table to the NEWACCT table
When processing any rows from ACCOUNT, Extract performs the LOOKUP stored procedure prior to executing the column map
Maps values returned in desc_param to the newacct_val column using the @GETVAL function.
the above result can also be achived by directly executing the query instead of stored procedure.
SYNTAX for SQLEXEC FOR EXECUTING THE QUERY.
SQLEXEC (ID
{PARAMS | NOPARAMS})
---------------------------------------------------------------------------------------
MAP HR.ACCOUNT, TARGET HR.NEWACCT, &
SQLEXEC (id lookup, &
query "select desc_param from lookup_table
where code_col = :code_param", &
PARAMS (code_param = account_code)), &
COLMAP (USEDEFAULTS, newacct_id = account_id,
newacct_val = @GETVAL(lookup.desc_param));
---------------------------------------------------------------------------------------
* When SQLEXEC is used as a stand-alone parameter statement in the Extract or Replicat parameter file, it can
execute a stored procedure, query, or database command.
* For these situations, SQLEXEC does not need to be tied to a specific table and can be used to perform general SQL operations.
SQLEXEC "EXEC SPNAME()"
SQLEXEC "
SQLEXEC "
Lets create an example using above method.
-- Source Tbl :- SALES_MASTER
-- Target Tbls :- SALES_INDIA, SALES_MALAYSIA,TOTAL_SALES_INDIA, TOTAL_SALES_MALAYSIA, EMP_DETAILS
Here we have one source table and it will get replicated to four target tables.
Source Table
------------
SQL> DESC GG_SOURCE.SALES_MASTER;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMNT NUMBER
COUNTRY VARCHAR2(30)
SALE_DATE DATE
Target Tables:-
--------------
SQL> DESC GG_TARGET.SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
SQL> DESC GG_TARGET.SALES_MALAYSIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
SQL> DESC GG_TARGET.TOTAL_SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SALES_PROFIT NUMBER
SALES_DATE DATE
SQL> DESC GG_TARGET.TOTAL_SALES_MALAYSIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SALES_PROFIT NUMBER
SALES_DATE DATE
SQL> DESC GG_TARGET.EMP_DETAILS ;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
EMP_NAME VARCHAR2(64)
SALES_COMMISION NUMBER
SALES_DATE DATE
Setup the Extract Process.
--------------------------
GGSCI (S66CJ187) 8> EDIT PARAMS EXT_SALE
EXTRACT EXT_SALE
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE PASSWORD Gate_123
EXTTRAIL ./dirdat/SA
TABLE GG_SOURCE.SALES_MASTER;
GGSCI (S66CJ187) 11> ADD EXTRACT EXT_SALE , TRANLOG , BEGIN NOW
EXTRACT added.
GGSCI (S66CJ187) 12> ADD EXTTRAIL ./dirdat/SA, EXTRACT EXT_SALE
EXTTRAIL added.
GGSCI (S66CJ187) 13> START EXTRACT EXT_SALE
Sending START request to MANAGER ...
EXTRACT EXT_SALE starting
GGSCI (S66CJ187) 58> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:05
EXTRACT RUNNING EXT_SALE 00:00:00 00:00:04
EXTRACT RUNNING PMP1 00:00:00 00:00:08
Extract pump process
---------------------
GGSCI (S66CJ187) 71> EDIT PARAMS PMP_SALE
EXTRACT PMP_SALE
RMTHOST 10.14.24.152, MGRPORT 7810
RMTTRAIL ./dirdat/SA
PASSTHRU
TABLE GG_SOURCE.SALES_MASTER;
GGSCI (S66CJ187) 60> ADD EXTRACT PMP_SALE, EXTTRAILSOURCE ./dirdat/SA
EXTRACT added.
GGSCI (S66CJ187) 61> ADD RMTTRAIL ./dirdat/SA, EXTRACT PMP_SALE
RMTTRAIL added.
GGSCI (S66CJ187) 63> START EXTRACT PMP_SALE
Sending START request to MANAGER ...
EXTRACT PMP_SALE starting
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:02
EXTRACT RUNNING EXT_SALE 00:00:00 00:00:10
EXTRACT RUNNING PMP1 00:00:00 00:00:07
EXTRACT RUNNING PMP_SALE 00:00:00 00:02:32
Replicat Process.
-----------------
-- Source Tbl :- SALES_MASTER
-- Target Tbls :- SALES_INDIA, SALES_MALAYSIA,TOTAL_SALES_INDIA, TOTAL_SALES_MALAYSIA, EMP_DETAILS
Lets create 5 Replicate process.
Process 1 :- RSAL_IND
---------------------
Source -
SQL> DESC GG_SOURCE.SALES_MASTER;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMNT NUMBER
COUNTRY VARCHAR2(30)
SALE_DATE DATE
Target Tables:-
--------------
SQL> DESC GG_TARGET.SALES_INDIA;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
SOLD_PRODUCT VARCHAR2(30)
SOLD_PRODUCT_ID NUMBER
SOLD_AMT NUMBER
SALE_DATE DATE
a) Both the source and target columns are not same, lets use the defgen utility to create a source defintion.
GGSCI (S66CJ187) 1> EDIT PARAMS DEFGEN
DEFSFILE ./dirsql/sales_master.sql
USERID GGATE@NPTLPVT password Gate_123
TABLE GG_SOURCE.SALES_MASTER;
$ defgen PARAMFILE ./dirprm/defgen.prm REPORTFILE ./dirrpt/defgen.rpt
$ cat sales_master.sql
*+- Defgen version 2.0, Encoding hp-roman8
*
* Definitions created/modified 2014-01-20 15:13
*
* Field descriptions for each column entry:
*
* 1 Name
* 2 Data Type
* 3 External Length
* 4 Fetch Offset
* 5 Scale
* 6 Level
* 7 Null
* 8 Bump if Odd
* 9 Internal Length
* 10 Binary Length
* 11 Table Length
* 12 Most Significant DT
* 13 Least Significant DT
* 14 High Precision
* 15 Low Precision
* 16 Elementary Item
* 17 Occurs
* 18 Key Column
* 19 Sub Data Type
*
Database type: ORACLE
Character set ID: UTF-8
National character set ID: UTF-16
Locale: neutral
Case sensitivity: 14 14 14 14 14 14 14 14 14 14 14 14 11 14 14 14
*
Definition for table GG_SOURCE.SALES_MASTER
Record length: 262
Syskey: 0
Columns: 6
EMP_ID 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
SOLD_PRODUCT 64 30 56 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
SOLD_PRODUCT_ID 64 50 92 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
SOLD_AMNT 64 50 148 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
COUNTRY 64 30 204 0 0 1 0 30 30 0 0 0 0 0 1 0 1 0
SALE_DATE 192 19 240 0 0 1 0 19 19 19 0 5 0 0 1 0 1 0
End of definition
-- scp the file to the target server.
SQL> DESC GG_TARGET.EMP_DETAILS ;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_ID NUMBER
EMP_NAME VARCHAR2(64)
SALES_COMMISION NUMBER
SALES_DATE DATE
SQL> create or replace procedure get_emp_name ( v_emp_id in number, v_emp_fir_name out varchar2, v_emp_sec_name out varchar2) as
begin
select EMP_FIRST_NAME, EMP_LAST_NAME into v_emp_fir_name , v_emp_sec_name from gg_target.emp_names where emp_id = v_emp_id;
end;
/
> EDIT PRAMS RSAL_IND
REPLICAT RSAL_IND
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
USERID GGATE Password Gate_123
SOURCEDEFS ./dirsql/sales_master.sql
DISCARDFILE ./dirrpt/RSAL_IND.dsc, append
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.SALES_INDIA, &
COLMAP (USEDEFAULTS, SOLD_AMT = SOLD_AMNT) , &
FILTER ( @STRCMP(@STRUP(COUNTRY), "INDIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.SALES_MALAYSIA, &
COLMAP (USEDEFAULTS, SOLD_AMT = SOLD_AMNT), &
FILTER ( @STRCMP(@STRUP(COUNTRY), "MALAYSIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.TOTAL_SALES_INDIA, &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, SALES_PROFIT = @COMPUTE (SOLD_AMNT * 0.1)), &
FILTER (@STRCMP(@STRUP(COUNTRY), "INDIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.TOTAL_SALES_MALAYSIA, &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, SALES_PROFIT = @COMPUTE (SOLD_AMNT * 0.1)), &
FILTER (@STRCMP(@STRUP(COUNTRY), "MALAYSIA") = 0);
MAP GG_SOURCE.SALES_MASTER, TARGET GG_TARGET.EMP_DETAILS, &
SQLEXEC (SPNAME GET_EMP_NAME, PARAMS ( V_EMP_ID = EMP_ID)), &
COLMAP (USEDEFAULTS, SALES_DATE = SALE_DATE, EMP_NAME = @STRCAT (@GETVAL(GET_EMP_NAME.V_EMP_FIR_NAME), "," , @GETVAL (GET_EMP_NAME.V_EMP_SEC_NAME)), &
SALES_COMMISION = @COMPUTE (SOLD_AMNT * 0.02));
> ADD REPLICAT RSAL_IND, EXTTRAIL ./dirdat/SA
> START REPLICAT RSAL_IND
-- Lets test this.. insert 3 records as below in source..
SQL> insert into sales_master values (1001,'SONY PC','2001',2000,'INDIA',SYSDATE);
1 row created.
SQL> insert into sales_master values (1002,'SONY TV',2002,1800,'MALAYSIA',SYSDATE);
1 row created.
SQL> SQL> insert into sales_master values (1003,'SONY IPAD',2003,1000,'india',SYSDATE);
1 row created.
SQL> insert into sales_master values (1004,'SONY XBOX',2004,1500,'malaysia',sysdate);
1 row created.
SQL> commit;
Commit complete.
-- Below is the output on the five replicated tables.
SQL> select * from gg_target.emp_details;
EMP_ID EMP_NAME SALES_COMMISION SALES_DAT
---------- ---------------------------------------------------------------- --------------- ---------
1001 Manzoor,Ahamed 40 20-JAN-14
1002 Bhaskar,Suthradhar 36 20-JAN-14
1003 Ramesh,Ramasamy 20 20-JAN-14
1004 Jameel,Ahamed 30 20-JAN-14
SQL> select * from gg_target.sales_india;
EMP_ID SOLD_PRODUCT SOLD_PRODUCT_ID SOLD_AMT SALE_DATE
---------- ------------------------------ --------------- ---------- ---------
1001 SONY PC 2001 2000 20-JAN-14
1003 SONY IPAD 2003 1000 20-JAN-14
SQL> select * from gg_target.sales_malaysia;
EMP_ID SOLD_PRODUCT SOLD_PRODUCT_ID SOLD_AMT SALE_DATE
---------- ------------------------------ --------------- ---------- ---------
1002 SONY TV 2002 1800 20-JAN-14
1004 SONY XBOX 2004 1500 20-JAN-14
SQL> select * from gg_target.total_sales_india;
SOLD_PRODUCT SOLD_PRODUCT_ID SALES_PROFIT SALES_DAT
------------------------------ --------------- ------------ ---------
SONY PC 2001 200 20-JAN-14
SONY IPAD 2003 100 20-JAN-14
SQL> select * from gg_target.total_sales_malaysia;
SOLD_PRODUCT SOLD_PRODUCT_ID SALES_PROFIT SALES_DAT
------------------------------ --------------- ------------ ---------
SONY TV 2002 180 20-JAN-14
SONY XBOX 2004 150 20-JAN-14
============================================================================================================================