Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate

Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate

Σε προηγούμενο άρθρο είχαμε δει πώς μπορούμε να κάνουμε replicate πίνακες από την Oracle Database πρός τον SQL Server με την χρήση GoldenGate. Σε αυτό άρθρο θα δούμε πως μπορούμε να κάνουμε το αντίστροφο από τον SQL Server προς την Oracle Database και το replication μας να γίνει από unidirectional με κατεύθυνση πρός ένα target σε bidirectional με αμφίδρομο συγχρονισμό.

Η διαδικασία για αποστολή των δεδομένων είναι αρκετά παρόμοια, με την κεντρική διαφορά να είναι ότι το GoldenGate στον SQL Server κάνει χρήση του Change Data Capture (CDC) για το supplemental logging που απαιτείται.

Πριν δούμε την διαδικασία ας θυμηθούμε πρώτα τι είναι το GoldenGate.

Τι είναι το GoldenGate

Το Oracle GoldenGate είναι ένα εργαλείο που μας επιτρέπει να αντιγράφουμε και να διαμορφώνουμε δεδομένα μεταξύ βάσεων δεδομένων, χωρίς να μας επηρεάζει το λειτουργικό σύστημα ή το RDBMS που γίνεται χρήση. Η ενημέρωση των πινάκων μπορεί να είναι είτε προς μία κατεύθυνση με ένα target (unidirectional), είτε πρός πολλά targets (broadcast), είτε αμφίδρομα (bidirectional).

Για παράδειγμα μπορούμε να μεταφέρουμε δεδομένα πινάκων με την χρήση GoldenGate από Oracle σε Oracle, από Oracle προς SQL Server, από SQL Server πρός SQL Server, είτε από Oracle ταυτόχρονα προς SQL Server, MySQL, DB2 και PostgreSQL.

Πώς λειτουργεί το GoldenGate

Το GoldenGate κάνει χρήση τριών processes: Extract, Data Pump (σε περίπτωση που κάνουμε χρήση απομακρυσμένου server) και του Replicat.

Το Extract είναι υπεύθυνο για να καταγράφει τις committed συνναλλαγές από τους πίνακες που έχουμε ορίσει και να τις αποθηκεύει σε ένα αρχείο που ονομάζεται local trail. Στη συνέχεια το Data Pump στέλνει τα δεδομένα από το local trail αρχείο στον απομακρυσμένο server μέσω TCP/IP και γράφει τα δεδομένα στο αρχείο που ονομάζεται remote trail. Στο τέλος το Replicat διαβάζει το remote trail και εφαρμόζει τις αλλαγές στις target βάσεις δεδομένων.

Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
docs.oracle.com (bidirectional GoldenGate)

Τα προαπαιτούμενα

Για αρχή θα πρέπει να έχουμε στήσει το Oracle Database Software στον primary και στον standby server και Oracle Database στον primary σε archivelog mode. Το πώς κάνουμε αυτές τις εγκαταστάσεις μπορούμε να το δούμε βήμα βήμα στο άρθρο εδώ.

Θα πρέπει να κατεβάσουμε την έκδοση Oracle GoldenGate ξεχωριστά για το κάθε σύστημα από εδώ. Την έκδοση Oracle on Linux x86-64 για τον Oracle Server και την έκδοση SQL Server on Windows x86-64 για τον SQL Server.

Στον Windows Server που έχει τον SQL Server θα πρέπει να κατεβάσουμε και να κάνουμε εγκατάσταση τον Oracle Database Client από εδώ.

Να έχουμε κάνει όλα τα βήματα της εγκατάστασης του GoldenGate και στους δύο servers όπως αναφέρονται αναλυτικά στο προηγούμενο άρθρο.

Εγκατάσταση / παραμετροποίηση στο source

Στον Windows SQL Server (source)

Για το παράδειγμα έχουμε στον SQL Server τον παρακάτω πίνακα, που τον είχαμε φέρει από την Oracle Database:

USE StackOverflow2013
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[CUSTOMERS](
	[ID] [numeric](38, 0) NOT NULL,
	[NAME] [varchar](50) NULL
) ON [PRIMARY]
GO

ALTER TABLE dbo.customers ADD PRIMARY KEY (id);

INSERT INTO CUSTOMERS VALUES (1,'Stratos');
INSERT INTO CUSTOMERS VALUES (2,'Nikos');
INSERT INTO CUSTOMERS VALUES (3,'George');

Για αρχή θα πρέπει να φτιάξουμε στη βάση δεδομένων το schema που θα αποθηκεύονται τα objects που ανήκουν στο GoldenGate:

USE StackOverflow2013
GO

create schema ggs;

Έπειτα θα πρέπει να ορίσουμε τον χρήστη SA ως owner της βάση δεδομένων, στον χρήστη που διαχειρίζεται το GoldenGate (ggadmin) τον ρόλο του db_owner και όσο διαρκέσει η διαδικασία της εγκατάστασης τον ρόλο του sysadmin:

EXEC sys.sp_changedbowner 'sa';
GO

EXEC sp_addrolemember 'db_owner', 'ggadmin'
GO

EXEC sp_addsrvrolemember 'ggadmin', 'sysadmin';  
GO

Στη συνέχεια πάμε στον φάκελο που έχουμε κάνει εγκατάσταση το GoldenGate και συνδεόμαστε στο interface:

cd c:\goldengate

ggsci.exe

Με το που συνδεθούμε τροποποιούμε το parameter file του GoldenGate Manager και προσθέτουμε τα παρακάτω:

edit params mgr
PURGEOLDEXTRACTS ./dirdat/*, MINKEEPHOURS 2
AUTOSTART REPLICAT *
AUTORESTART REPLICAT *, RETRIES 10, WAITMINUTES 5, RESETMINUTES 60
AUTOSTART EXTRACT *
AUTORESTART EXTRACT *, RETRIES 10, WAITMINUTES 5, RESETMINUTES 60
  • PORT: Είναι η minimum μεταβλητή που πρέπει να έχει το αρχείο και ορίζει την πόρτα του Manager.
  • PURGEOLDEXTRACT: Είναι η τοποθεσία που αποθηκεύοται το trail αρχείο με τα δεδομένα και ορίζουμε να τα κρατάει τουλάχιστον 2 ώρες.
  • AUTOSTART : Ορίζουμε ποια processes να ξεκινήσουν αυτόματα όταν ξεκινάει ο Manager.
  • AUTORESTART: Ορίζουμε ποια processes να γίνουν επανεκκίνηση μετά από σφάλμα.

Τροποποιούμε το GLOBALS parameter file ώστε να προστέσουμε το schema που φτιάξαμε πριν:

edit param ./GLOBALS
MGRSERVNAME GOLDENGATEsrv
CHECKPOINTTABLE dbo.CHECKPOINTTABLE
GGSCHEMA ggs

Τώρα ξεκινάμε τον GoldenGate manager, αν δεν είναι ήδη ανοιχτός:

start manager

Συνδεόμαστε στη βάση δεδομένων μέσα από το GoldenGate με την χρήση του Credentialstore που είχαμε φτιάξει στην προηγούμενη εγκατάσταση (ggadmin). Η δουλεία του είναι να κρατάει τοπικά κρυπτογραφημένο τον κωδικό και το όνομα του GoldenGate administrator χρήστη της βάσης δεδομένων:

dblogin sourceDB sqlserverdb useridalias ggadmin

Σε περίπτωση που δεν το είχαμε φτιάξει και θέλουμε να το δημιουργήσουμε τρέχουμε το παρακάτω:

add credentialstore
alter credentialstore add user ggadmin alias ggadmin

Αφού συνδεθούμε με τον χρήστη ορίζουμε για τον κάθε πίνακα που θέλουμε να κάνουμε replicate να είναι ενεργοποιημένο το supplemental logging:

add trandata dbo.CUSTOMERS
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
01

Με το που ενεργοποιήσουμε το supplemental logging θα ενεργοποιήσει το Change Data Capture στον πίνακα του SQL Server. Μαζί με τον πίνακα θα δημιουργήσει και ένα cleanup job του SQL Server Agent το οποίο σβήνει την πληροφορία που δεν χρειάζεται πλέον. Όμως αυτό το cleanup job δεν ελέγχει αν το Extract process του GoldenGate πρόλαβε να καταγράψει την πληροφορία, οπότε θα πρέπει να το σβήσουμε και να φτιάξουμε στην θέση του ένα καινούργιο.

Για να το σβήσουμε το αρχικό cleanup job συνδεόμαστε στο instance του SQL Server το παρακάτω query:

execute sys.sp_cdc_drop_job 'cleanup';

Έπειτα για να δημιουργήσουμε το συμβατό cleanup job, γυρνάμε στο interface του GoldenGate και τρέχουμε την παρακάτω εντολή βάζοντας με την σειρά username, password, dbname, hostname και schema:

shell ogg_cdc_cleanup_setup.bat createJob ggadmin Kwdikos StackOverflow2013 localhost ggs
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
02

Άμα συνδεθούμε από το SQL Server Management Studio στον SQL Server θα δούμε ότι έχει φτιάξει ένα καινούργιο job με όνομα OracleGGCleanup:

Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
03

Δημιουργία του Extract process στο source

Τώρα φτιάχνουμε το Extract process που θα εξάγει τα δεδομένα προς το local trail file:

edit param sql_ext
EXTRACT sql_ext
SOURCEDB sqlserverdb USERIDALIAS ggadmin
RMTHOST oracledev2, MGRPORT 7809
RMTTRAIL ./dirdat/bb
TABLE dbo.CUSTOMERS;
  • EXTRACT: Ορίζουμε το όνομα του process.
  • USERIDALIAS: Ορίζουμε το όνομα του alias που φτιάξαμε για τον χρήστη της βάσης στο Credentialstore.
  • RMTHOST: Ορίζουμε το hostname του απομακρυσμένου destination server. Αν δεν κάνουμε χρήση DNS server, βάζουμε την εγγραφή που περάσαμε στο /etc/hosts.
  • MGRPORT: Ορίζουμε την πόρτα που έχει ο GoldenGate Manager στον απομακρυσμένο destination server.
  • RMTTRAIL: Ορίζουμε το path και το όνομα που θα έχουν τα trail files.
  • TABLE: Ορίζουμε τους πίνακες που θέλουμε να μεταφέρει, στην προκειμένη περίπτωση βάζουμε το σχήμα του χρήστη και * αφού το σχήμα περιέχει μόνο τον πίνακα που θέλουμε.

Για να προστεθεί το extract process θα πρέπει να τρέξουμε τα παρακάτω με το όνομα του:

add extract sql_ext,tranlog, begin now

add rmttrail ./dirdat/bb, extract sql_ext

Συνδεόμαστε πάλι στο GoldenGate interface:

ggsci.exe

dblogin sourceDB sqlserverdb useridalias ggadmin

Ξεκινάμε το Extract process που έχουμε φτιάξει και βλέπουμε το status των processes:

start sql_ext

info all
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
04

Δεν ξεχνάμε να κάνουμε έναν έλεγχο ότι τα αρχεία έχουν πάει στο directory του destination server.

Προαιρετικό βήμα για το translation των definition μεταξύ RDBMS

Προαιρετικά σε περίπτωση που το replicat εμφανίσει σφάλματα κατά την μετατροπή σε συμβατά data types,χρειαζόμαστε το translation των definition των πινάκων από το source στο target. Οπότε για να το έχουμε αυτό τρέχουμε και προσθέτουμε τους ανάλογους πίνακες στο παρακάτω:

edit params sql_objects
sourcedb sqlserverdb useridalias ggadmin
defsfile ./dirsql/sql_objects.sql purge
table dbo.customers;

Βγαίνουμε από το ggsci και τρέχουμε τον παρακάτω generator:

defgen paramfile ./dirprm/sql_objects.prm

Αφού γίνει generated το αρχείο, το αντιγράφουμε στο target:

copy
 C:\goldengate\dirsql\sql_objects.sql
 /oracle/app/oracle/goldengate/dirdef/

Εγκατάσταση / παραμετροποίηση στο target

Στον Oracle Database server (target)

Για αρχή συνδεόμαστε στη βάση δεδομένων και δίνουμε δικαίωμα στον GoldenGate administrator χρήστη για να μπορεί πραγματοποιεί αλλαγές στον πίνακα με το παρακάτω query:

grant insert,update,delete on stratos.customers to ggadmin;

Κατά την δημιουργία του χρήστη για την αντίστροφη διαδικασία, έχουμε δώσει και τα παρακάτω δικαιώματα που χρειάζεται επίσης να έχουμε:

-- Grant/Revoke role privileges 
grant connect to ggadmin;
grant resource to ggadmin;
-- Grant/Revoke system privileges 
grant select any table to ggadmin;
grant select any dictionary to ggadmin;
grant flashback any table to ggadmin;
grant create session to ggadmin;
grant alter session to ggadmin;
exec dbms_goldengate_auth.grant_admin_privilege('ggadmin');

Στη συνέχεια πάμε στον φάκελο που έχουμε κάνει εγκατάσταση το GoldenGate και συνδεόμαστε στο interface:

cd /oracle/app/oracle/goldengate
./ggsci

Με το που συνδεθούμε σαν πρώτο βήμα τροποποιούμε το parameter file του GoldenGate Manager και προσθέτουμε τα παρακάτω:

edit param mgr
PORT 7809
PURGEOLDEXTRACTS ./dirdat/*, MINKEEPHOURS 2
AUTOSTART EXTRACT *
AUTORESTART EXTRACT *, RETRIES 10, WAITMINUTES 5, RESETMINUTES 60
AUTOSTART REPLICAT *
AUTORESTART REPLICAT *, RETRIES 10, WAITMINUTES 5, RESETMINUTES 60

Τώρα ξεκινάμε τον GoldenGate manager, αν δεν είναι ήδη ανοιχτός:

start manager

Συνδεόμαστε στη βάση δεδομένων μέσα από το GoldenGate με την χρήση του Credentialstore που είχαμε φτιάξει στην προηγούμενη εγκατάσταση (ggadmin). Η δουλεία του είναι να κρατάει τοπικά κρυπτογραφημένο τον κωδικό και το όνομα του GoldenGate administrator χρήστη της βάσης δεδομένων:

dblogin useridalias ggadmin

Σε περίπτωση που δεν το είχαμε φτιάξει και θέλουμε να το δημιουργήσουμε τρέχουμε το παρακάτω:

add credentialstore
alter credentialstore add user ggadmin alias ggadmin

Ορίζουμε τον πίνακα checkpoint που θα περιέχει τις πληροφορίες με το apply του replication στην Oracle Database:

add checkpointtable ggadmin.chkpt

Τι κάνουμε σε περίπτωση που δεν έχουμε μεταφέρει τον πίνακα από τον SQL Server στην Oracle Database

Στο συγκεκριμένο παράδειγμα είχαμε μεταφέρει (όπως είχαμε σε προηγούμενο άρθρο) τον πίνακα από την Oracle Database στον SQL Server μέσω του εργαλείου SQL Server 2019 Import and Export Data (64bit). Όμως αν δεν το είχαμε κάνει αυτό και θέλαμε να μεταφέρουμε αντίστροφα τώρα από τον SQL Server προς την Oracle Database, θα έπρεπε να ακολουθήσουμε την παρακάτω διαδικασία.

Στον Windows SQL Server (source)

Πάμε στο GoldenGate interface και φτιάχνουμε ένα process με τις παρακάτω παραμέτρους:

edit params FIRST_EXP
SOURCEISTABLE
SOURCEDB sqlserverdb USERIDALIAS ggadmin
RMTHOST oracledev2, MGRPORT 7809
RMTFILE ./dirdat/fe, PURGE
TABLE dbo.CUSTOMERS;
  • SOURCEISTABLE : Ορίζουμε να εξάγει ολόκληρη την πληροφορία όχι από τα logs αλλά απευθείας από τον πίνακα, με ότι χρειάζεται για να φορτωθεί σε έναν άλλον πίνακα.
  • SOURCEDB: Ορίζουμε το ODBC που έχουμε φτιάξει για την source βάση δεδομένων.
  • USERIDALIAS: Ορίζουμε το όνομα του alias που φτιάξαμε για τον χρήστη της βάσης στο Credentialstore.
  • RMTHOST: Ορίζουμε το hostname του απομακρυσμένου SQL Server. Αν δεν κάνουμε χρήση DNS server, βάζουμε την εγγραφή που περάσαμε στο /etc/hosts.
  • MGRPORT: Ορίζουμε την πόρτα που έχει ο GoldenGate Manager στον απομακρυσμένο SQL Server.
  • RMTFILE: Ορίζουμε το path και το όνομα που θα έχουν τα αρχεία με τα δεδομένα.
  • TABLE: Ορίζουμε τους πίνακες που θέλουμε να μεταφέρουμε.

* Στην περίπτωση που θέλουμε να σώσουμε σε άλλον δίσκο εκτός Goldengate subdirs τα trailfiles του inital load τότε θα πρέπει να τροποποιήσουμε το από πάνω σε RMTFILE D:\\trails/fe , PURGE ,όπως επίσης στο ./GLOBALS του target να προστεθεί η γραμμή ALLOWOUTPUTDIR D:\\trails\ και να γίνει και η ανάλογη αλλαγή στη παράμετρο EXTFILE / RMTFILE του replicat.

Βγαίνουμε από τον GoldenGate interface και τρέχουμε από τον φάκελο του GoldenGate το παρακάτω για να ξεκινήσει η εξαγωγή:

extract paramfile dirprm\first_exp.prm reportfile dirrpt\first_exp.rpt
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
05

Στον Oracle Database server (target)

Πάμε στο GoldenGate interface και φτιάχνουμε ένα process με τις παρακάτω παραμέτρους:

edit params FIRST_IMP
SPECIALRUN
USERIDALIAS ggadmin
SOURCECHARSET PASSTHRU
BATCHSQL
EXTFILE ./dirdat/fe
DISCARDFILE ./dirrpt/sql_discard.txt, APPEND, MEGABYTES 50
HANDLECOLLISIONS
MAP DBO.CUSTOMERS, TARGET STRATOS.CUSTOMERS;
END RUNTIME
  • SPECIALRUN : Ορίζουμε ότι θα τρέξει χωρίς checkpoints και μόνο μία φορά για το αρχικό φόρτωμα του πίνακα.
  • USERIDALIAS: Ορίζουμε το όνομα του alias που φτιάξαμε για τον χρήστη της βάσης στο Credentialstore.
  • SOURCECHARSET: Ορίζουμε τον τύπο του character conversion, με την τιμή PASSTHRU δεν μετατρέπει τα δεδομένα αλλά λειτουργεί μόνο με ASCII.
  • BATCHSQL: Ορίζουμε να ομαδοποιεί τα requests ώστε να έχει καλυτερο performance.
  • EXTFILE: Ορίζουμε το path και το όνομα των αρχείων που θα φορτωθούν.
  • DISCARDFILE: Ορίζουμε το αρχείο που περιέχει τις εγγραφές του πίνακα που δεν κατάφεραν να περάσουν
  • HANDLECOLLISIONS : Παράμετρος που αναλαμβάνει την διαχείριση σε διπλότυπες και λάθος εγγραφές.
  • MAP: Ορίζουμε την σχέση μεταξύ των source και target πινάκων. Στην προκειμένη περίπτωση θέλουμε οι πίνακες να πηγαίνουν στο σχήμα DBO.

Βγαίνουμε από τον GoldenGate interface και τρέχουμε από τον φάκελο του GoldenGate το παρακάτω για να ξεκινήσει η εισαγωγή:

./replicat paramfile dirprm/first_imp.prm
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
06

Δημιουργία του Replicat process στο target

Σε αυτό το σημείο φτιάχνουμε το Replicat process που θα εισάγει τα δεδομένα από το trail file προσθέτοντας τις παρακάτω παραμέτρους:

edit param ora_rep
REPLICAT ora_rep
USERIDALIAS ggadmin
SOURCEDEFS ./dirdef/sql_objects.sql
DISCARDFILE ./dirrpt/sql_discard.txt, APPEND, MEGABYTES 50
HANDLECOLLISIONS
MAP DBO.CUSTOMERS, TARGET STRATOS.CUSTOMERS;
  • REPLICAT: Ορίζουμε το όνομα του process.
  • TARGETDB: Ορίζουμε το ODBC που φτιάξαμε με την target βάση δεδομένων.
  • USERIDALIAS: Ορίζουμε το όνομα του alias που φτιάξαμε για τον χρήστη της βάσης στο Credentialstore.
  • SOURCEDEFS: Ορίζουμε το traslation των definitions των πινάκων μεταξύ target και source. (προαιρετική παράμετρος, είδαμε πώς φτιάχνουμε αυτό το αρχείο σε προηγούμενο βήμα)
  • DISCARDFILE: Ορίζουμε το αρχείο που περιέχει τις εγγραφές του πίνακα που δεν κατάφεραν να περάσουν
  • HANDLECOLLISIONS – NOHANDLECOLLISIONS: Παράμετρος που αναλαμβάνει την διαχείριση σε διπλότυπες και λάθος εγγραφές. Την γυρνάμε σε HANDLECOLLISIONS σε περίπτωση που αποτυγχάνει να ξεκινήσει το Replicat Process λόγο της παραπάνω περίπτωσης.
  • MAP: Ορίζουμε την σχέση μεταξύ των source και target πινάκων. Στην προκειμένη περίπτωση θέλουμε οι πίνακες να πηγαίνουν στο σχήμα DBO.

Για να φτιαχτεί το Replicat process τρέχουμε το παρακάτω:

add replicat ora_rep, exttrail ./dirdat/bb, checkpointtable ggadmin.chkpt 

Επιτέλους είμαστε έτοιμοι να ξεκινήσουμε το Replicat process τρέχοντας το παρακάτω:

start ora_rep

info all
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
07

Η δοκιμή

Για να δοκιμάσουμε αν λειτουργεί, το μόνο που έχουμε να κάνουμε είναι να αλλάξουμε μία εγγραφή στον πίνακα στον SQL Server:

INSERT INTO DBO.CUSTOMERS VALUES (13,'Jason');
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
08

Τώρα αν κάνουμε SELECT τον πίνακα στην Oracle Database θα δούμε ότι έχει περάσει η εγραφή:

select * from stratos.customers;
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
09

Οπότε έχουμε πλέον μια bidirectional active-active ενημέρωση μεταξύ του πίνακα της Oracle Database και του πίνακα του SQL Server.

Monitoring

Μπορούμε να δούμε την εξέλιξη του Replicat process στην target Oracle Database κάνοντας SELECT τον checkpoint πίνακα:

select * from ggadmin.chkpt;
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
10

Μπορούμε να βρούμε πληροφορίες για το Extract process για το status του, πότε έτρεξε και την καθυστέρηση που έχει τρέχοντας μέσα από το GoldenGate interface του source server το παρακάτω:

info replicat ora_rep, detail
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
11

Επίσης μπορούμε να βγάλουμε αναλυτικό report για process που περιέχει το log τρέχοντας μέσα από το GoldenGate interface το παρακάτω:

view report ora_rep
Πώς κάνουμε replicate πίνακες από SQL Server πρός Oracle Database με την χρήση GoldenGate
12

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση