Oracle GoldenGateを使用した分散データベースと非分散データベース間のデータのレプリケート
Oracle GoldenGateを使用して、非分散データベースから分散データベースにデータを移行できます。
Oracle GoldenGateを使用した非分散データベースから分散データベースへのデータの移行は、2つのフェーズで実行されます。
ソース・データベースでの抽出
- ソース・データベースのすべての表が、ソース・データベースで単一の抽出を使用して抽出されます。
ターゲット・データベースのレプリケーション
- シャード表へのレプリケーションはシャードで実行され、重複表へのレプリケーションはシャード・カタログで実行されます。
Oracle GoldenGateレプリケーションの前提条件
分散データベースのOracle GoldenGateレプリケーションを試行する前に、ソース・データベースとターゲット・データベースおよびOracle GoldenGate環境がこれらの前提条件を満たしていることを確認してください。
前提
-
非分散データベースから分散データベースに移行される表は、すでにシャード表および重複表に分類されていることが前提です。
-
シャード表に移行するすべての表のシャーディング・キーはすでに識別されています。
-
シャード表と重複表は、ターゲット分散データベースに事前作成されています。
-
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) ソース表からターゲット表へのデータ・レプリケーションを検証します。
-
ソース(非分散)データベースを構成します
-
ソース・データベースで抽出を作成し、ソース表からトランザクションを取得して起動します。
$ 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
-
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
-
-
ターゲット分散データベースを構成します。
-
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
-
ターゲット・データベースに(シャード数と同じ)レプリカを作成します。
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;
-
ターゲット・シャードで
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
-
-
ソース表からターゲット表へのデータ・レプリケーションを検証します。
非シャード表からシャードに行がレプリケートされることを検証するには、たとえば、ソース表に9000行あり、3つのターゲット・シャードがある場合、各シャードに約3000行を分散する必要があります。