一、背景:
工作任務OGG新增下發表,根據系統架構,數據下發流程為:系統A --> 系統B --> 系統C
系統A:在與系統B相關的抽取進程(EXTSJXF)的參數文件中新增相關表,在與系統B相關的投遞進程(DPDJZSJ1)的參數文件中新增相關表。
系統B:復制進程(REPDJZ2)的參數文件中新增相關表,進行應用,在與系統C相關的抽取進程(EXTJHXT1)的參數文件中新增下發表,同理,投遞進程(DPJHSJ1)亦需要在進程參數文件中新增表
系統C:復制進程(REPJHXT1)參數文件新增相關表
下發表說明:業務問題,系統A用戶QAS的數據將導入到系統B的用戶QAS_TEST下(remap table),即
系統A:QAS.T_LOG_TICKET_PROVINCE、QAS.T_LOG_TICKET_TASK_PROVINCE
系統B:QAS_TEST.T_LOG_TICKET_PROVINCE 、QAS_TEST.T_LOG_TICKET_TASK_PROVINCE
通過datapump初始化,總體工作流程如下:
二、工作步驟:
1、 系統A --> 系統B
(1)系統A抽取進程EXTSJXF修改參數文件
GGSCI (A)1> stop EXTSJXF --停止進程進行參數文件修改 GGSCI (A)2> edit param EXTSJXF ---編輯參數文件新增如下 --20170808 add TABLE QAS.* ; --登錄數據庫goldengate用戶,打開表級附加日志 GGSCI (A) 3>dblogin userid goldengate password goldengate; GGSCI (A) 4>ADD TRANDATA QAS.T_LOG_TICKET_PROVINCE GGSCI (A) 5>ADD TRANDATA QAS.T_LOG_TICKET_TASK_PROVINCE GGSCI (A) 6> start EXTSJXF
(2)系統A投遞進程DPDJZSJ1修改參數文件
GGSCI (A) 7> stop DPDJZSJ1 GGSCI (A) 8> edit param DPDJZSJ1 --20170808 add TABLE QAS.* ;
(3)停止系統B復制進程REPDJZ2
GGSCI (B) 1> stop REPDJZ2
(4)系統A基於SCN號抽取數據
- 預估數據大小
SQL> select sum(BYTES/1024/1024) MB from dba_segments where owner ='QAS' and SEGMENT_NAME='T_LOG_TICKET_PROVINCE'; MB ---------- 560.0625 SQL> select sum(BYTES/1024/1024) MB from dba_segments where owner ='QAS' and SEGMENT_NAME='T_LOG_TICKET_TASK_PROVINCE'; MB ---------- 1816.0625
- 定義導出目錄
SQL> create directory OGG_EXPDP as '/data4/ogg_expdp';
- 查詢scn號
SQL> col current_scn for 9999999999999999 SQL> select current_scn from v$database; CURRENT_SCN ----------------- 15585673221354
- 編輯expdp執行腳本並執行
vi expdp_testA_testB_oas_20170808.par USERID = "/ as sysdba" DIRECTORY = OGG_EXPDP FLASHBACK_SCN= 15585673221354 DUMPFILE = expdp_testA_testB_oas_20170808.dmp logfile = expdp_testA_testB_oas_20170808.log tables =(QAS.T_LOG_TICKET_PROVINCE, QAS.T_LOG_TICKET_TASK_PROVINCE) --后台執行腳本 nohup expdp parfile=expdp_testA_testB_oas_20170808.par >expdp_testA_testB_oas_20170808.par.out &
- scp將dmp文件從系統A傳至系統B
$scp expdp_testA_testB_oas_20170808.dmp oracle@系統B的IP:傳至的目錄
(6)系統B導入數據,已有相關的導入目錄,使用remap將用戶OAS的數據導入導OAS_GZDS下
vi impdp_testA_testB_oas_20170808.par USERID ='/ as sysdba' DIRECTORY = IMPDP DUMPFILE = expdp_testA_testB_oas_20170808.dmp logfile = impdp_testA_testB_oas_20170808.log
REMAP_SCHEMA=QAS:QAS_TEST REMAP_TABLESPACE=USERS:TS_QAS_TEST TABLE_EXISTS_ACTION=replace --后台執行腳本
nohup impdp parfile=impdp_testA_testB_oas_20170808.par > impdp_testA_testB_oas_20170808.par.out &
(7)系統B復制進程REPDJZ2參數文件修改
GGSCI (B) 2> edit param REPDJZ2 --20170808add MAP QAS.* , TARGET QAS_TEST.* ,FILTER(@GETENV("TRANSACTION","CSN")>15585673221354); --系統A基於SCN號導出,系統B基於CSN號開啟應用
(8)開啟系統A的投遞進程DPDJZSJ1
GGSCI (A) 11> start DPDJZSJ1
(9)開啟系統B的應用進程REPDJZ2
GGSCI (B) 3> start REPDJZ2
(10)數據對比
- ./ggsci 下查看相關統計數據
GGSCI (A) 11> stats DPDJZSJ1,daily GGSCI (B) 4> stats REPDJZ2,daily
- 在數據庫中查詢數據量
--系統A: SQL> select count(1) from QAS.T_LOG_TICKET_TASK_PROVINCE; COUNT(1) ---------- 16919333 SQL> select count(1) from QAS.T_LOG_TICKET_PROVINCE; COUNT(1) ---------- 4618927 ---系統B: SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE; COUNT(1) ---------- 16919333 SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_PROVINCE; COUNT(1) ---------- 4618927
2、 系統B --> 系統C
(1)系統B抽取進程EXTJHXT1新增下發表
GGSCI (B) 13> stop EXTJHXT1 GGSCI (B) 14> edit param EXTJHXT1 --20170808 add 2tbs TABLE QAS_TEST.T_LOG_TICKET_PROVINCE ; TABLE QAS_TEST.T_LOG_TICKET_TASK_PROVINCE ;
GGSCI (B) 15> dblogin userid goldengate password goldengate; GGSCI (B) 16> ADD TRANDATA QAS_GZDS.T_LOG_TICKET_PROVINCE Logging of supplemental redo data enabled for table QAS_GZDS.T_LOG_TICKET_PROVINCE. GGSCI (B) 18> info trandata QAS_GZDS.T_LOG_TICKET_PROVINCE Logging of supplemental redo log data is enabled for table QAS_GZDS.T_LOG_TICKET_PROVINCE. Columns supplementally logged for table QAS_GZDS.T_LOG_TICKET_PROVINCE: TICKET_ID. GGSCI (B) 19> ADD TRANDATA QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE Logging of supplemental redo data enabled for table QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE. GGSCI (B) 20> info TRANDATA QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE Logging of supplemental redo log data is enabled for table QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE. Columns supplementally logged for table QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE: TASK_ID. GGSCI (B) 21> start EXTJHXT1 --開啟抽取進程EXTJHXT1
(2)系統B投遞進程DPJHSJ1新增表及停止
GGSCI (B) 22> stop DPJHSJ1 GGSCI (B) 23> edit param DPJHSJ1 --20170808 add 2tbs TABLE QAS_TEST.T_LOG_TICKET_PROVINCE ; TABLE QAS_TEST.T_LOG_TICKET_TASK_PROVINCE ;
(3)系統C復制進程REPJHXT1停止
GGSCI (A) 22> stop REPJHXT1
(4)系統B基於SCN號抽取數據
- 查詢系統B的scn號
SQL> col current_scn for 9999999999999999 SQL> select current_scn from v$database; CURRENT_SCN ----------------- 15389350836731
- 編輯expdp執行腳本並執行
vi expdp_testB_testC_2tb_20170808.par USERID='/ as sysdba' DIRECTORY=IMPDP LOGFILE=expdp_testB_testC_2tb_20170808.log FLASHBACK_SCN=15389350836731 DUMPFILE=expdp_testB_testC_2tb_20170808.dmp tables=(QAS_GZDS.T_LOG_TICKET_PROVINCE, QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE) --后台執行腳本 nohup expdp parfile=expdp_testB_testC_2tb_20170808.par > expdp_testB_testC_2tb_20170808.par.out &
(5)scp將dmp文件從系統B傳至系統C
$scp expdp_testB_testC_2tb_20170808.dmp oracle@系統C的IP:傳至的目錄
(6)系統C導入數據
vi impdp_testB_testC_2tb_20170808.par USERID='/ as sysdba' DIRECTORY=IMPDP LOGFILE=impdp_testB_testC_2tb_20170808.log DUMPFILE=expdp_testB_testC_2tb_20170808.dmp TABLE_EXISTS_ACTION=replace --后台執行腳本 nohup impdp parfile=impdp_testB_testC_2tb_20170808.par > impdp_testB_testC_2tb_20170808.par.out &
(7)系統C復制進程REPDJZ2參數文件修改
--20170808 add 2tbs MAP QAS_GZDS.T_LOG_TICKET_PROVINCE ,TARGET QAS_GZDS.T_LOG_TICKET_PROVINCE ,FILTER(@GETENV("TRANSACTION","CSN")>15389350836731); MAP QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE ,TARGET QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE ,FILTER(@GETENV("TRANSACTION","CSN")>15389350836731);
--系統B基於SCN號導出,系統C基於CSN號開啟復制進程應用
(8)開啟系統B的投遞進程DPJHSJ1
GGSCI (B) 11> sart DPJHSJ1
(9)開啟系統C的應用進程REPJHXT1
GGSCI (C) 3> start REPJHXT1
(10)數據對比
- ./ggsci 下查看相關統計數據
GGSCI (B) 11> stats DPJHSJ1,daily GGSCI (C) 4> stats REPJHXT1,daily
- 在數據庫中查詢數據量
--系統B: SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE; COUNT(1) ---------- 16919333 SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_PROVINCE; COUNT(1) ---------- 4618927 ---系統C: SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_TASK_PROVINCE; COUNT(1) ---------- 16919333 SQL> select count(1) from QAS_GZDS.T_LOG_TICKET_PROVINCE; COUNT(1) ---------- 4618927
三、其他說明:
1、打開表級附加日志時無唯一索引處理
系統A數據在導入系統B時索引已存在,由於系統B需抽取此部分數據投遞至系統C,在附加表級日志時最好有唯一索引作為唯一key以保障數據的唯一性。所以在系統B中重命名原先的索引。此處解決方案考慮結合了系統的業務情況。無唯一索引附加表級日志出現以下告警:
GGSCI (B) 10> ADD TRANDATA QAS_TEST.T_LOG_TICKET_PROVINCE 2017-08-08 15:21:19 WARNING OGG-00869 No unique key is defined for table 'T_LOG_TICKET_PROVINCE'. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key. Logging of supplemental redo data enabled for table QAS_TEST.T_LOG_TICKET_PROVINCE.
(1) 在dmp文件中提取出sql語句
vi impdp_testA_testB_oas_sql_2017080.par USERID ='/ as sysdba' DIRECTORY = IMPDP DUMPFILE = expdp_testA_testB_oas_20170808.dmp LOGFILE=impdp_testA_testB_oas_sql_20170808.log SQLFILE=impdp_testA_testB_oas_sql_20170808.sql INCLUDE=INDEX,CONSTRAINT nohup impdp parfile=impdp_testA_testB_oas_sql_2017080.par > impdp_testA_testB_oas_sql_2017080.par.out &
(2) 在impdp_djz_shiju2_oas_sql_20170808.sql中找到相關sql語句,修改后在系統B中執行:
CREATE UNIQUE INDEX QAS_TEST.PK_T_LOG_TICKET_PROVINCE ON QAS_TEST.T_LOG_TICKET_PROVINCE (TICKET_ID) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 8388608 NEXT 8388608 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE DB_SBFDB_DATA3; CREATE UNIQUE INDEX QAS_TEST.PK_T_LOG_TICKET_TASK_PROVINCE ON QAS_TEST.T_LOG_TICKET_TASK_PROVINCE (TASK_ID) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 8388608 NEXT 8388608 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE DB_SBFDB_DATA3;
2、系統A的數據導入系統B時報錯,用戶不存在報錯可忽略,本次為數據下發,非數據庫重建。索引已存在是由於業務問題造成,可按照上文重命名並新建索引。
ORA-39083: Object type OBJECT_GRANT failed to create with error: ORA-01917: user or role 'DB_DSYY' does not exist Failing sql is: GRANT UPDATE ON "QAS_TEST"."T_LOG_TICKET_TASK_PROVINCE" TO "DB_DSYY" Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX ORA-31684: Object type INDEX:"QAS_TEST"."PK_T_LOG_TICKET" already exists ORA-31684: Object type INDEX:"QAS_TEST"."PK_T_LOG_TICKET_TASK" already exists
3、文章說明
OGG新增下發表時,需注意各個進程啟動順序,以保障數據的一致性,OGG工作順序:源端抽取——>源端投遞——>目標端應用。