Goldengate Drop Extract Capture Process

Goldengate capture processlerinin tümü aşağıdaki şekilde drop edilebilir.

BEGIN
     FOR i IN (SELECT capture_name FROM dba_capture)
     LOOP
         DBMS_CAPTURE_ADM.STOP_CAPTURE(i.capture_name, true);
         DBMS_CAPTURE_ADM.DROP_CAPTURE (i.capture_name, true);
     END LOOP;
 END;
 /

Manuel olarak bazı process’leri drop etmek için aşağıdaki adımları uygulayabilirsiniz.

$ sqlplus / as sysdba
SQL> select capture_name from dba_capture;
Result:
CAPTURE_NAME
-------------
GGS$CAP_DSSSDDSS

SQL> exec DBMS_CAPTURE_ADM.STOP_CAPTURE('GGS$CAP_DSSSDDSS', true);

SQL> exec DBMS_CAPTURE_ADM.DROP_CAPTURE('GGS$CAP_DSSSDDSS', true);

DROP_CAPTURE komutunu çalıştırmadan önce process’in active olması ihtimaline karşı STOP_CAPTURE komutunun çalıştırılması gerekmektedir. Aksi halde aşağıdaki gibi hata verecektir.

ORA-01338 Other process is attached to Logminer session
ORA-06512 at "SYS.DBMS_CAPTURE_ADM_INTERNAL", line 238
ORA-06512 at "SYS.DBMS_CAPTURE_ADM_INTERNAL", line 225
ORA-06512 at "SYS.DBMS_CAPTURE_ADM", line 268

Goldengate içerisinden extract process’lerini drop etmek için aşağıdaki adımları uygulayabilirsiniz.

GGSCI> dblogin userid gguser password xxxx
GGSCI> stop extract_process_name
GGSCI> unregister extract extract_process_name
GGSCI> delete extract_process_name

Goldengate ile Replike Edilen Tabloların Db İçerisinden Listelenmesi

Oracle goldengate ile source ve target dbler arasında tablo replikasyonu yapıldığında hangi tablonun replike edildiği bilgisini dirprm dizini içerisinden aramak gerekmektedir. Bu zahmetten kurtulmak için bash scripti ile parametre dosyalarını her gece okuyup db içerisine anlaşılır bir şekilde kaydedebiliriz.

İşlemi tamamlandıktan sonra aşağıdaki şekilde bir yapıya sahip olacağız.

TBL_SOURCE    TBL_TARGET    DEF_FILE_NAME    MAPPING_STR
HR.EMPLOYEE HR.EMPLOYEE /gg/dirprm/rephr.prm MAP HR.EMPLOYEE, TARGET HR.EMPLOYEE, colmap( usedefaults, systime = @GETENV (GGHEADER, COMMITTIMESTAMP));

Goldengate scheması içerisinde aşağıdaki tabloyu oluşturduktan sonra sh scriptini linux üzerinde çalıştırıp tablonun içerisini kontrol edebilirsiniz. Kullandığınız goldengate schemasına göre scripti düzenleyebilirsiniz. Bu örnekte “ggowner” scheması kullanılmıştır.

CREATE TABLE GGOWNER.REPLICATED_TABLES
(
TBL_SOURCE VARCHAR2(120 BYTE),
TBL_TARGET VARCHAR2(120 BYTE),
DEF_FILE_NAME VARCHAR2(120 BYTE),
MAPPING_STR VARCHAR2(4000 BYTE)
)
TABLESPACE TBS_GG;

Aşağıdaki bash scripti /home/oracle/ veya kendi belirleyeceğiniz bir dizin altına yükleyebilirsiniz.

$ cat ./gg_replicated_tables.sh

#!/bin/bash

/tmp/ggrepliketbl.list
/tmp/ggrepliketbl.insert
/tmp/ggrepliketbl.listnew

echo "truncate table ggowner.replicated_tables; " > /tmp/ggrepliketbl.insert

echo "/" >> /tmp/ggrepliketbl.insert

for fname in /gg/dirprm/*.prm;
do
while read LINE
do
echo | awk '{ print substr("'"$fname $LINE"'",1,900)}' >> /tmp/ggrepliketbl.list
done < $fname
done

search_string="'"
replace_string="__"
sed "s/$search_string/$replace_string/g" /tmp/ggrepliketbl.list > /tmp/ggrepliketbl.listnew

search_string=".prm"
replace_string=".prm','"

sed "s/$search_string/$replace_string/g" /tmp/ggrepliketbl.listnew >/tmp/ggrepliketbl.list

while read LINE
do
echo "insert into ggowner.replicated_tables (DEF_FILE_NAME,MAPPING_STR) values ('$LINE'); " >> /tmp/ggrepliketbl.insert
done < /tmp/ggrepliketbl.list

echo "commit;" >> /tmp/ggrepliketbl.insert
echo "exit;" >> /tmp/ggrepliketbl.insert

sqlplus / as sysdba @/tmp/ggrepliketbl.insert
sqlplus / as sysdba <<EOF
update ggowner.replicated_tables set tbl_source = trim(replace(REGEXP_SUBSTR(replace(replace(replace(MAPPING_STR,' ',' '),' ,',','),' ,', ','), 'MAP (\S),'), 'MAP', '')), tbl_target = trim(replace(REGEXP_SUBSTR(replace(replace(replace(MAPPING_STR,' ',' '),' ,',','),', ', ','), ',TARGET (\S),'), 'TARGET', ''));
update ggowner.replicated_tables set tbl_source = trim(replace(tbl_source,',','')),
tbl_target = trim(replace(tbl_target,',',' '));

delete from ggowner.replicated_tables where tbl_source is null and tbl_target is null and MAPPING_STR not like '%MAP%';

commit;
exit;
EOF

rm /tmp/ggrepliketbl.list
rm /tmp/ggrepliketbl.insert
rm /tmp/ggrepliketbl.listnew

Eğer goldengate replikasyonu yapılan tabloların listesini her gece güncellemek istiyorsanız ilgili scripti crontab’a ekleyebilirsiniz. Scripti crontab içerisinden çalıştıracaksanız oracle_sid ve oracle_home değişkenlerinin set edildiğinden mutlaka emin olun.