Oracle GoldenGateを使用したシャード・データベースと非シャード・データベース間のデータのレプリケート

Oracle GoldenGateを使用して、非シャード・データベースからシャード・データベースにデータを移行できます。

Oracle GoldenGateを使用した非シャード・データベースからシャード・データベースへのデータの移行は、2つのフェーズで実行されます。

ソース・データベースでの抽出

  • ソース・データベースのすべての表が、ソース・データベースで単一の抽出を使用して抽出されます。

ターゲット・データベースのレプリケーション

  • シャード表へのレプリケーションはシャードで実行され、重複表へのレプリケーションはシャード・カタログで実行されます。

Oracle GoldenGateレプリケーションの前提条件

シャード・データベースのOracle GoldenGateレプリケーションを試行する前に、ソース・データベースとターゲット・データベースおよびOracle GoldenGate環境がこれらの前提条件を満たしていることを確認してください。

前提

  1. 非シャード・データベースからシャード・データベースに移行される表は、すでにシャード表および重複表に分類されているものとします。

  2. シャード表に移行するすべての表のシャーディング・キーはすでに識別されています。

  3. シャード表と重複表は、ターゲット・シャード・データベースに事前作成されています。

  4. Oracle GoldenGateソフトウェアは、ソース・システムとターゲット・システムにすでにインストールされています。

ソース・データベースおよびターゲット・データベース

  • Oracle Databaseバージョン: マルチテナント・アーキテクチャの19c (19.15.0.0.0)以降

  • ターゲット・データベースのシャーディング・タイプ: システム管理

Oracle GoldenGate構成

Oracle GoldenGateバージョン: ハブ構成の19c Classicアーキテクチャ

非シャード・データベースからシャード・データベースへのデータのレプリケート

環境の例

以降のステップの例では、次のトポロジを使用します

システム/オブジェクト ソース環境 ターゲット環境

CDB名

srccdb

sdbcdb

PDB名

srcpdb

シャード: sdbpdb1、sdbpdb2、sdbpdb3

シャード・カタログ: scpdb

アプリケーション・スキーマ

app_schema

app_schema

シャード表

顧客、注文、品目

顧客、注文、品目

重複表

製品

製品

概要ステップ

1) ソース・データベースで抽出を作成し、ソース表からトランザクションを取得して起動します。

2) expdpおよびflashback_scnを使用して、初期ロード用にソース・データベースからデータを取得します。

3) impdpを使用して、ターゲット・シャード上のシャード表への初期ロードを実行します。

4) impdpを使用して、ターゲット・シャード・カタログで重複表への初期ロードを実行します。

5) シャード表をレプリケートするターゲット・シャードの数と同じ数のレプリカを作成します。

6) 重複表をレプリケートするために、シャード・カタログに1つのレプリカを作成します。

7) ターゲット・シャードでat csnを使用してレプリカを開始します

8) シャード・カタログでat csnを使用してレプリカを開始します

9) ソース表からターゲット表へのデータ・レプリケーションを検証します。

  1. ソース(非シャード)・データベースの構成

    1. ソース・データベースで抽出を作成し、ソース表からトランザクションを取得して起動します。

      $ ggsci  
       
      GGSCI > dblogin useridalias ggadmin
      GGSCI > add extract extnshd, integrated tranlog, begin now
      GGSCI > register extract extnshd, database container (SRCPDB)
      GGSCI > add exttrail ./dirdat/tr, extract extnshd  
        
      Add the following parameters in extract parameter file
       
      GGSCI > edit params extnshd
        
      extract extnshd
      useridalias  ggadmin
      TranlogOptions IntegratedParams (max_sga_size 256)
      extTrail ./dirdat/tr
      DiscardFile ./dirrpt/extnshd.dsc, Append Megabytes 50
      REPORTCOUNT EVERY 2 HOURS, RATE
      Table SRCPDB.app_schema.customers;
      Table SRCPDB.app_schema.orders;
      Table SRCPDB.app_schema.lineitems;
      Table SRCPDB.app_schema.products;
       
      GGSCI> start extract extnshd
    2. expdpを使用して、初期ロード用にソース・データベースからデータを取得します。

      SQL> select current_scn from v$database;
       
      $ expdp app_schema/xxxxx@SRCPDB flashback_scn=current_scn_from_previous_step
       directory=DATA_PUMP_DIR dumpfile=app_schema_exp.dmp
       logfile=app_schema_exp.log
  2. ターゲット(シャード)・データベースを構成します。

    1. impdpを使用して、ターゲット・シャード・データベースおよびシャード・カタログで初期ロードを実行します。

      Import into shards
      $ impdp app_schema/xxxxx@SDBPDB1 directory=DATA_PUMP_DIR dumpfile=app_schema_exp.dmp
       logfile=app_schema_imp.log tables=CUSTOMERS,ORDERS,LINEITEMS, CONTENT=DATA_ONLY
      $ impdp app_schema/xxxxx@SDBPDB2 directory=DATA_PUMP_DIR dumpfile=app_schema_exp.dmp
       logfile=app_schema_imp.log tables=CUSTOMERS,ORDERS,LINEITEMS, CONTENT=DATA_ONLY
      $ impdp app_schema/xxxxx@SDBPDB3 directory=DATA_PUMP_DIR dumpfile=app_schema_exp.dmp
       logfile=app_schema_imp.log tables=CUSTOMERS,ORDERS,LINEITEMS, CONTENT=DATA_ONLY
       
      Import into shard catalog
      $ impdp app_schema/xxxxx@SCPDB directory=DATA_PUMP_DIR dumpfile=app_schema_exp.dmp
       logfile=app_schema_imp.log tables=PRODUCTS CONTENT=DATA_ONLY
    2. ターゲット・データベースに(シャード数と同じ)レプリカを作成します。

      Replicat for sharded tables on Shard 1
      ======================================
      GGSCI > dblogin useridalias ggadmin_shd1
      GGSCI > add replicat repshd1, INTEGRATED, exttrail ./dirdat/tr
       CHECKPOINTTABLE ggadmin.GGCHKPT
       
      Add the following parameters in replicat for shard1
        
      GGSCI > edit params repshd1
        
      replicat repshd1
      useridalias ggadmin_shd1
      HANDLECOLLISIONS
      SOURCECATALOG SDBPDB1
      MAP NSHDPDB.APP_SCHEMA.CUSTOMERS , target APP_SCHEMA.CUSTOMERS, &
      SQLEXEC (ID chunklookup1, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup1.COUNT = 1);
        
      MAP NSHDPDB.APP_SCHEMA.ORDERS, target APP_SCHEMA.ORDERS, &
      SQLEXEC (ID chunklookup2, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup2.COUNT = 1);
        
      MAP NSHDPDB.APP_SCHEMA.LINEITEMS, target APP_SCHEMA.LINEITEMS, &
      SQLEXEC (ID chunklookup3, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup3.COUNT = 1);
       
      Replicat for sharded tables on Shard 2
      ======================================
       
      GGSCI > dblogin useridalias ggadmin_shd2
      GGSCI > add replicat repshd2, INTEGRATED, exttrail ./dirdat/tr
       CHECKPOINTTABLE ggadmin.GGCHKPT
       
      Add the following parameters in replicat for shard2
       
      GGSCI > edit params repshd2  
       
      replicat repshd2
      useridalias ggadmin_shd2
      HANDLECOLLISIONS
      SOURCECATALOG SDBPDB2
      MAP NSHDPDB.APP_SCHEMA.CUSTOMERS , target APP_SCHEMA.CUSTOMERS, &
      SQLEXEC (ID chunklookup1, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup1.COUNT = 1);
        
      MAP NSHDPDB.APP_SCHEMA.ORDERS, target APP_SCHEMA.ORDERS, &
      SQLEXEC (ID chunklookup2, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup2.COUNT = 1);
        
         
      MAP NSHDPDB.APP_SCHEMA.LINEITEMS, target APP_SCHEMA.LINEITEMS, &
      SQLEXEC (ID chunklookup3, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup3.COUNT = 1);
       
      Replicat for sharded tables on Shard 3
      ======================================
       
      GGSCI > dblogin useridalias ggadmin_shd3
      GGSCI > add replicat repshd3, INTEGRATED, exttrail ./dirdat/tr
       CHECKPOINTTABLE ggadmin.GGCHKPT
       
      Add the following parameters in replicat for shard3
       
      GGSCI > edit params repshd3  
       
      replicat repshd3
      useridalias ggadmin_shd3
      HANDLECOLLISIONS
      SOURCECATALOG SDBPDB3
      MAP NSHDPDB.APP_SCHEMA.CUSTOMERS , target APP_SCHEMA.CUSTOMERS, &
      SQLEXEC (ID chunklookup1, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup1.COUNT = 1);
        
      MAP NSHDPDB.APP_SCHEMA.ORDERS, target APP_SCHEMA.ORDERS, &
      SQLEXEC (ID chunklookup2, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup2.COUNT = 1);
        
         
      MAP NSHDPDB.APP_SCHEMA.LINEITEMS, target APP_SCHEMA.LINEITEMS, &
      SQLEXEC (ID chunklookup3, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(:CODE_IN_PARAM) >= low_key and ora_hash(:CODE_IN_PARAM) < high_key',&
      PARAMS (CODE_IN_PARAM = CUSTID),
      BEFOREFILTER), &
      FILTER (chunklookup3.COUNT = 1);    
       
      #### NOTE ####
      1. Remove Handlecollisions parameter and restart replicats after deltas
         have been applied on target shards.
      2. If sharding key column is of  number datatype, please use below sqlexec
         filter which has to_number in ora_hash function.
       
      SQLEXEC (ID chunklookup, QUERY 'select count(*) count FROM gsmadmin_internal.chunks
       WHERE ora_hash(to_number(:CODE_IN_PARAM)) >= low_key
         and ora_hash(to_number(:CODE_IN_PARAM)) < high_key',&
       
       
      Replicat for duplicate tables on Catalog
      ========================================
       
      GGSCI > dblogin useridalias ggadmin_cat
      GGSCI > add replicat repcat, INTEGRATED, exttrail ./dirdat/tr
       CHECKPOINTTABLE ggadmin.GGCHKPT
       
      Add the following parameters in replicat for shard1 
      GGSCI > edit params repcat
        
      replicat repcat
      useridalias ggadmin_cat
      HANDLECOLLISIONS
      SOURCECATALOG SCPDB
      map NSHDPDB.APP_SCHEMA.PRODUCTS, target APP_SCHEMA.PRODUCTS;
    3. ターゲット・シャードでatcsnを使用してレプリカを開始します。

      GGSCI> start replicat repshd1, atcsn <SCN captured on source>
      GGSCI> start replicat repshd2, atcsn <SCN captured on source>
      GGSCI> start replicat repshd3, atcsn <SCN captured on source>
      GGSCI> start replicat repcat, atcsn  <SCN captured on source>  
      GGSCI > info all
       
      Program     Status      Group       Lag at Chkpt  Time Since Chkpt
       
      MANAGER     RUNNING                                          
      EXTRACT     RUNNING     EXTNSHD     00:00:00      00:00:05
      REPLICAT    RUNNING     REPCAT      00:00:00      00:00:00  
      REPLICAT    RUNNING     REPSHD1     00:00:00      00:00:03   
      REPLICAT    RUNNING     REPSHD2     00:00:00      00:00:06   
      REPLICAT    RUNNING     REPSHD3     00:09:01      00:00:09
  3. ソース表からターゲット表へのデータ・レプリケーションを検証します。

    非シャード表からシャードに行がレプリケートされることを検証するには、たとえば、ソース表に9000行あり、3つのターゲット・シャードがある場合、各シャードに約3000行を分散する必要があります。