OCI GoldenGateデータ変換の検出
OCI GoldenGateデータ・レプリケーションとデータ変換デプロイメントを一緒に使用して、2つのAutonomous AIデータベース間でデータをロードおよび変換する方法について学習します。
開始する前に
このクイックスタートを正常に完了するには、次が必要です。
-
サンプル・データがロードされ、サプリメンタル・ロギングが有効になっているソースAutonomous AI Database。
ヒント:
使用するサンプル・データが必要な場合は、OCI GoldenGateサンプル・データをダウンロードできます。
-
Autonomous AI Databaseのデータベース・アクションSQLツールを使用して、2つのスクリプトを実行してユーザー・スキーマおよび表を作成します。
-
サプリメンタル・ロギングを有効にするには、SQLツールを使用します。
詳細は、「演習1、タスク3: ATPスキーマのロード」のステップに従います。
-
-
ソースのAutonomous AI DatabaseインスタンスでGGADMINユーザーをロック解除します
-
「Autonomous AI Databaseの詳細」ページで、「データベース・アクション」メニューから「データベース・ユーザー」を選択します。
ヒント:プロンプトが表示されたら、ログインするインスタンスの作成時に指定されたAutonomous AI Database管理者資格証明を使用します。
-
GGADMINユーザーを探し、省略記号(3つのドット)メニューから「編集」を選択します。
-
「ユーザーの編集」パネルに、パスワードを入力し、パスワードを確認して、「アカウントがロックされています」の選択を解除します。
-
「変更の適用」を選択します。
-
タスク1: 環境の設定
-
ソースのOracleAutonomous AI Transaction Processing(ATP)接続を作成します。
-
サプリメンタル・ロギングを有効にするには、SQLツールを使用します。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA -
次の問合せをSQLツールで実行して、ソース・データベース内のすべての表の
support_mode=FULLを確認します:select * from DBA_GOLDENGATE_SUPPORT_MODE where owner = 'SRC_OCIGGLL';
タスク2: 統合Extractの作成
統合Extractは、ソース・データベースに対する継続的な変更を取得します。
-
デプロイメントの詳細ページで、「コンソールの起動」を選択します。
-
必要に応じて、ユーザー名およびデプロイメントの作成時に使用したパスワードにoggadminと入力し、「サインイン」を選択します。
-
トランザクション データとチェックポイント テーブルを追加します。
-
ナビゲーション・メニューを開き、「DB接続」を選択します。
-
「Connect to database SourceDB」を選択します。
-
ナビゲーション・メニューで、「Trandata」を選択し、「Add Trandata」(プラス・アイコン)を選択します。
-
「スキーマ名」に
SRC_OCIGGLLと入力し、「送信」を選択します。 -
確認するには、「検索」フィールドに
SRC_OCIGGLLと入力し、「検索」を選択します。 -
ナビゲーション・メニューを開き、「DB接続」を選択します。
-
「Connect to database TargetDB」を選択します。
-
ナビゲーション・メニューで、「チェックポイント」を選択し、「チェックポイントの追加」(プラス・アイコン)を選択します。
-
「チェックポイント表」に
"SRCMIRROR_OCIGGLL"."CHECKTABLE"と入力し、「発行」を選択します。
-
-
ノート:ソース表を指定するために使用できるパラメータの詳細は、追加の抽出パラメータ・オプションを参照してください。
「Extractパラメータ」ページで、
EXTTRAIL <trail-name>の下に次の行を挿入します:-- Capture DDL operations for listed schema tables ddl include mapped -- Add step-by-step history of -- to the report file. Very useful when troubleshooting. ddloptions report -- Write capture stats per table to the report file daily. report at 00:01 -- Rollover the report file weekly. Useful when IE runs -- without being stopped/started for long periods of time to -- keep the report files from becoming too large. reportrollover at 00:01 on Sunday -- Report total operations captured, and operations per second -- every 10 minutes. reportcount every 10 minutes, rate -- Table list for capture table SRC_OCIGGLL.*; -
長時間実行トランザクションを確認します。ソース・データベースで次のスクリプトを実行します:
select start_scn, start_time from gv$transaction where start_scn < (select max(start_scn) from dba_capture);問合せでなんらかの行が返された場合は、トランザクションのSCNを特定してから、トランザクションをコミットまたはロールバックする必要があります。
タスク3: Oracle Data Pump (ExpDP)を使用したデータのエクスポート
Oracle Data Pump (ExpDP)を使用して、ソース・データベースからOracle Object Storeにデータをエクスポートします。
-
Oracle Object Storeバケットを作成します。
エクスポートおよびインポート・スクリプトで使用するネームスペースおよびバケット名をメモしておいてください。
-
認証トークンを作成し、後で使用するためにトークン文字列をコピーしてテキスト・エディタに貼り付けます。
-
ソース・データベースに資格証明を作成し、
<user-name>および<token>を、前のステップで作成したOracle Cloudアカウントのユーザー名およびトークン文字列に置き換えます:BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'ADB_OBJECTSTORE', username => '<user-name>', password => '<token>' ); END; -
ソース・データベースで次のスクリプトを実行して、データのエクスポート・ジョブを作成します。オブジェクト・ストアURIの
<region>、<namespace>および<bucket-name>を適宜置き換えてください。SRC_OCIGGLL.dmpは、このスクリプトの実行時に作成されるファイルです。DECLARE ind NUMBER; -- Loop index h1 NUMBER; -- Data Pump job handle percent_done NUMBER; -- Percentage of job complete job_state VARCHAR2(30); -- To keep track of job state le ku$_LogEntry; -- For WIP and error messages js ku$_JobStatus; -- The job status from get_status jd ku$_JobDesc; -- The job description from get_status sts ku$_Status; -- The status object returned by get_status BEGIN -- Create a (user-named) Data Pump job to do a schema export. h1 := DBMS_DATAPUMP.OPEN('EXPORT','SCHEMA',NULL,'SRC_OCIGGLL_EXPORT','LATEST'); -- Specify a single dump file for the job (using the handle just returned) -- and a directory object, which must already be defined and accessible -- to the user running this procedure. DBMS_DATAPUMP.ADD_FILE(h1,'https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket-name>/o/SRC_OCIGGLL.dmp','ADB_OBJECTSTORE','100MB',DBMS_DATAPUMP.KU$_FILE_TYPE_URIDUMP_FILE,1); -- A metadata filter is used to specify the schema that will be exported. DBMS_DATAPUMP.METADATA_FILTER(h1,'SCHEMA_EXPR','IN (''SRC_OCIGGLL'')'); -- Start the job. An exception will be generated if something is not set up properly. DBMS_DATAPUMP.START_JOB(h1); -- The export job should now be running. In the following loop, the job -- is monitored until it completes. In the meantime, progress information is displayed. percent_done := 0; job_state := 'UNDEFINED'; while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop dbms_datapump.get_status(h1,dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts); js := sts.job_status; -- If the percentage done changed, display the new value. if js.percent_done != percent_done then dbms_output.put_line('*** Job percent done = ' \|\| to_char(js.percent_done)); percent_done := js.percent_done; end if; -- If any work-in-progress (WIP) or error messages were received for the job, display them. if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0) then le := sts.wip; else if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0) then le := sts.error; else le := null; end if; end if; if le is not null then ind := le.FIRST; while ind is not null loop dbms_output.put_line(le(ind).LogText); ind := le.NEXT(ind); end loop; end if; end loop; -- Indicate that the job finished and detach from it. dbms_output.put_line('Job has completed'); dbms_output.put_line('Final job state = ' \|\| job_state); dbms_datapump.detach(h1); END;
タスク4: Oracle Data Pump (ImpDP)を使用したターゲット・データベースのインスタンス化
Oracle Data Pump (ImpDP)を使用して、ソース・データベースからエクスポートしたSRC_OCIGGLL.dmpからターゲット・データベースにデータをインポートします。
-
Oracle Object Storeにアクセスするための資格証明をターゲット・データベースに作成します(前述の項と同じ情報を使用します)。
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'ADB_OBJECTSTORE', username => '<user-name>', password => '<token>' ); END; -
ターゲット・データベースで次のスクリプトを実行して、
SRC_OCIGGLL.dmpからデータをインポートします。オブジェクト・ストアURIの<region>、<namespace>および<bucket-name>を適宜置き換えてください:DECLARE ind NUMBER; -- Loop index h1 NUMBER; -- Data Pump job handle percent_done NUMBER; -- Percentage of job complete job_state VARCHAR2(30); -- To keep track of job state le ku$_LogEntry; -- For WIP and error messages js ku$_JobStatus; -- The job status from get_status jd ku$_JobDesc; -- The job description from get_status sts ku$_Status; -- The status object returned by get_status BEGIN -- Create a (user-named) Data Pump job to do a "full" import (everything -- in the dump file without filtering). h1 := DBMS_DATAPUMP.OPEN('IMPORT','FULL',NULL,'SRCMIRROR_OCIGGLL_IMPORT'); -- Specify the single dump file for the job (using the handle just returned) -- and directory object, which must already be defined and accessible -- to the user running this procedure. This is the dump file created by -- the export operation in the first example. DBMS_DATAPUMP.ADD_FILE(h1,'https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket-name>/o/SRC_OCIGGLL.dmp','ADB_OBJECTSTORE',null,DBMS_DATAPUMP.KU$_FILE_TYPE_URIDUMP_FILE); -- A metadata remap will map all schema objects from SRC_OCIGGLL to SRCMIRROR_OCIGGLL. DBMS_DATAPUMP.METADATA_REMAP(h1,'REMAP_SCHEMA','SRC_OCIGGLL','SRCMIRROR_OCIGGLL'); -- If a table already exists in the destination schema, skip it (leave -- the preexisting table alone). This is the default, but it does not hurt -- to specify it explicitly. DBMS_DATAPUMP.SET_PARAMETER(h1,'TABLE_EXISTS_ACTION','SKIP'); -- Start the job. An exception is returned if something is not set up properly. DBMS_DATAPUMP.START_JOB(h1); -- The import job should now be running. In the following loop, the job is -- monitored until it completes. In the meantime, progress information is -- displayed. Note: this is identical to the export example. percent_done := 0; job_state := 'UNDEFINED'; while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop dbms_datapump.get_status(h1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts); js := sts.job_status; -- If the percentage done changed, display the new value. if js.percent_done != percent_done then dbms_output.put_line('*** Job percent done = ' \|\| to_char(js.percent_done)); percent_done := js.percent_done; end if; -- If any work-in-progress (WIP) or Error messages were received for the job, display them. if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0) then le := sts.wip; else if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0) then le := sts.error; else le := null; end if; end if; if le is not null then ind := le.FIRST; while ind is not null loop dbms_output.put_line(le(ind).LogText); ind := le.NEXT(ind); end loop; end if; end loop; -- Indicate that the job finished and gracefully detach from it. dbms_output.put_line('Job has completed'); dbms_output.put_line('Final job state = ' \|\| job_state); dbms_datapump.detach(h1); END;
タスク5: 非統合Replicatの追加および実行
-
「パラメータ・ファイル」画面で、
MAP *.*, TARGET *.*;を次のスクリプトに置き換えます:-- Capture DDL operations for listed schema tables ddl include mapped -- Add step-by-step history of ddl operations captured -- to the report file. Very useful when troubleshooting. ddloptions report -- Write capture stats per table to the report file daily. report at 00:01 -- Rollover the report file weekly. Useful when PR runs -- without being stopped/started for long periods of time to -- keep the report files from becoming too large. reportrollover at 00:01 on Sunday -- Report total operations captured, and operations per second -- every 10 minutes. reportcount every 10 minutes, rate -- Table map list for apply DBOPTIONS ENABLE_INSTANTIATION_FILTERING; MAP SRC_OCIGGLL.*, TARGET SRCMIRROR_OCIGGLL.*;ノート:
DBOPTIONS ENABLE_INSTANTIATION_FILTERINGによって、Oracle Data Pumpを使用してインポートした表に対するCSNフィルタリングが可能になります。詳細は、DBOPTIONSのリファレンスを参照してください。 -
ソース・データベースへの挿入の実行:
-
Oracle Cloudコンソールに戻り、ナビゲーション・メニューを使用して「Oracle AI Database」、「Autonomous AI Transaction Processing」、「SourceDB」の順に戻ります。
-
SourceDBの詳細ページで、「データベース・アクション」、「SQL」の順に選択します。
-
次の挿入を入力し、「スクリプトの実行」を選択します。
Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1000,'Houston',20,743113); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1001,'Dallas',20,822416); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1002,'San Francisco',21,157574); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1003,'Los Angeles',21,743878); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1004,'San Diego',21,840689); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1005,'Chicago',23,616472); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1006,'Memphis',23,580075); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1007,'New York City',22,124434); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1008,'Boston',22,275581); Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1009,'Washington D.C.',22,688002); -
OCI GoldenGateデプロイメント・コンソールで、「Extract name (UAEXT)」を選択し、「Statistics」を選択します。SRC_OCIGGLL.SRC_CITYが10個の挿入とともにリストされていることを確認します。
-
「概要」画面に戻り、Replicat名(REP)を選択し、「統計」を選択します。SRCMIRROR_OCIGGLL.SRC_CITYが10個の挿入とともにリストされていることを確認します。
-
タスク6: データ変換リソースの作成
-
ノート:たとえば、米国東部(アッシュバーン)のAutonomous AIデータベースでは、次の値を使用します:
-
「ホスト」に、
adb.us-ashburn-1.oraclecloud.com:1522と入力します。 -
「サブネット」で、デプロイメントと同じサブネットをドロップダウンから選択します。
-
-
Autonomous AI Lakehouse (ADW)インスタンスのSRCMIRROR_OCIGGLLでTRG_CUSTOMERを作成します:
-
Oracle Cloudコンソールで、ナビゲーション・メニューを開き、Oracle AI Databaseに移動して、「Autonomous AI Lakehouse」を選択します。
-
「Autonomous Databases」ページで、ADWインスタンスで選択します。
-
ADW Autonomous AI Databaseの詳細ページで、「データベース・アクション」を選択し、ドロップダウンから「SQL」を選択します。「データベース・アクション」メニューのロードに時間がかかりすぎている場合は、直接データベース・アクションを選択し、「データベース・アクション」ページから「SQL」を選択できます。
-
ワークシートに次を入力し、「文の実行」を選択します。
create table SRCMIRROR_OCIGGLL.TRG_CUSTOMER ( CUST_ID NUMBER(10,0) not null, DEAR VARCHAR2(4 BYTE), CUST_NAME VARCHAR2(50 BYTE), ADDRESS VARCHAR2(100 BYTE), CITY_ID NUMBER(10,0), PHONE VARCHAR2(50 BYTE), AGE NUMBER(3,0), AGE_RANGE VARCHAR2(50 BYTE), SALES_PERS VARCHAR2(50 BYTE), CRE_DATE DATE, UPD_DATE DATE, constraint PK_TRG_CUSTOMER primary key (CUST_ID) );
-
-
Data Transformsデプロイメント・コンソールを起動します:
-
「デプロイメント」ページに戻り、タスク6で作成したデプロイメントを選択します。
-
「デプロイメントの詳細」ページで、「コンソールの起動」を選択します。
-
Data Transformsデプロイメント・コンソールにログインします。
-
-
ADW接続の作成:
-
ナビゲーション・メニューを開き、「接続」、「接続の作成」の順に選択します。
-
「タイプの選択」ページの「データベース」で「Oracle」を選択し、「次へ」を選択します。
-
「接続の詳細」ページで、フォーム・フィールドを次のように入力し、「作成」を選択します。
-
「名前」に、ADW_IADと入力します。
-
「資格証明ファイルの使用」を選択します。
-
Walletファイルの場合は、(ADW)ウォレット・ファイルをアップロードします。
ノート: ADWウォレット・ファイルをダウンロードするには、ADWの詳細ページで「データベース接続」を選択します。
-
「サービス」ドロップダウンから、<name>_lowを選択します。
-
「ユーザー」に、ADMINと入力します。
-
「パスワード」に、ADWパスワードを入力します。
-
-
-
インポート・データ・エンティティ:
-
ナビゲーション・メニューを開き、「データ・エンティティ」、「データ・エンティティのインポート」の順に選択します。
-
「接続」で、ドロップダウンから「ADW_IAD」を選択します。
-
「スキーマ」で、ドロップダウンからSRCMIRROR_OCIGGLLを選択します。
-
「開始」を選択します。
-
-
プロジェクトの作成:
-
ナビゲーション・メニューを開き、「プロジェクト」を選択します。
-
「プロジェクト」ページで、「プロジェクトの作成」を選択します。
-
「プロジェクトの作成」ダイアログの「名前」にdemo-pipelineと入力し、「作成」を選択します。
-
タスク7: ワークフローの作成と実行
-
データ・フローの作成:
ノート: データ・フロー・エディタについてさらに学習します。
-
プロジェクトの名前を選択します。
-
「プロジェクト詳細」ページの「リソース」で、「データ・フロー」、「データ・フローの作成」の順に選択します。
-
「データ・フローの作成」ダイアログの「名前」に、「TRG_CUSTOMERのロード」およびオプションで説明を入力します。「作成」を選択します。デザイン・キャンバスが開きます。
-
「スキーマの追加」ダイアログで、次のようにフォーム・フィールドに入力し、「OK」を選択します。
-
「接続」で、ドロップダウンから「ADW_IAD」を選択します。
-
「スキーマ」で、ドロップダウンからSRCMIRROR_OCIGGLLを選択します。
-
-
次のデータ・エンティティおよびコンポーネントをデザイン・キャンバスにドラッグします。
-
「データ・エンティティ」パネルで、SRCMIRROR_OCIGGLLスキーマを展開します。SRC_AGE_GROUPデータ・エンティティをデザイン・キャンバスにドラッグします。
-
「データ・エンティティ」パネルで、SRCMIRROR_OCIGGLLスキーマを展開します。SRC_SALES_PERSONデータ・エンティティをデザイン・キャンバスにドラッグします。
-
「データ変換」ツールバーから、「参照」コンポーネントをデザイン・キャンバスにドラッグします。
-
「データ変換」ツールバーから、「結合」コンポーネントをデザイン・キャンバスにドラッグします。
-
「データ・エンティティ」パネルのSRCMIRROR_OCIGGLLで、SRC_CUSTOMERデータ・エンティティをデザイン・キャンバスにドラッグします。
-
-
次のデータ・エンティティをLookupコンポーネントに接続します。
-
SRC_AGE_GROUPコネクタ アイコンを選択し、アイコンを Lookupコンポーネントにドラッグします。
-
SRC_CUSTOMERコネクタ・アイコンを選択し、アイコンをLookupコンポーネントにドラッグします。
-
-
デザイン・キャンバスで、「ルックアップ」を選択して「ルックアップ」パネルを開きます。「ルックアップ」パネルで、「属性」タブに切り替えて、次の問合せを「ルックアップ条件」に貼り付けます。
SRC_CUSTOMER.AGE between SRC_AGE_GROUP.AGE_MIN and SRC_AGE_GROUP.AGE_MAX -
次のコンポーネントを結合コンポーネントに接続します。
-
SRC_SALES_PERSONコネクタ・アイコンを選択し、アイコンを「結合」コンポーネントにドラッグします。
-
「参照」コネクタ・アイコンを選択し、アイコンを「結合」コンポーネントにドラッグします。
-
-
デザイン・キャンバスで、「結合」を選択して「結合」パネルを開きます。「結合」パネルで、「属性」タブに切り替えて、次の問合せを「結合条件」に貼り付けます。
SRC_CUSTOMER.SALES_PERS_ID=SRC_SALES_PERSON.SALES_PERS_ID -
次のデータ・エンティティおよびコンポーネントをデザイン・キャンバスにドラッグします。
-
「データ・エンティティ」パネルのSRCMIRROR_OCIGGLLで、TRG_CUSTOMERデータ・エンティティをデザイン・キャンバスにドラッグします。
-
「結合」コネクタ・アイコンを選択し、アイコンをTRG_CUSTOMERデータ・エンティティにドラッグします。
-
デザイン・キャンバスで、「TRG_CUSTOMER」を選択し、データ・エンティティを展開します。
-
-
「属性」タブで、CUST_IDのキーを有効化し、CRE_DATEの更新を無効化し、UPD_DATEの挿入を無効化します。
-
「列マッピング」タブで、名前が式と一致することを確認します。
-
顧客ID
SRC_CUSTOMER.CUSTID -
DEAR
CASE WHEN SRC_CUSTOMER.DEAR = 0 THEN 'Mr' WHEN SRC_CUSTOMER.DEAR = 1 THEN 'Mrs' ELSE 'Ms' END -
顧客名
SRC_CUSTOMER.FIRST_NAME \|\| ' ' \|\| UPPER(SRC_CUSTOMER.LAST_NAME) -
営業担当
SRC_SALES_PERSON.FIRST_NAME \|\| ' ' \|\|UPPER(SRC_SALES_PERSON.LAST_NAME) -
作成日
SYSDATE -
更新日
SYSDATE -
他のマッピングをそのまま使用します。
-
-
「オプション」タブの「モード」で、ドロップダウンから「増分更新」を選択します。
-
TRG_CUSTOMERを縮小します。
-
「データ・フローの保存」を選択します。
-
-
ワークフローの作成:
-
プロジェクトの名前を選択し、「ワークフロー」、「ワークフローの作成」の順に選択します。
-
名前として、Orchestrate Data Warehouse Loadと入力します。「作成」を選択します。
-
デザイン・キャンバスで「SQL」アイコンをドラッグします。
-
エディタでSQLステップをダブル選択し、ステップ・プロパティのページを開きます。
-
「一般」タブで、名前にデータ・クレンジングと入力します。
-
「属性」タブを選択し、「接続」でドロップダウンから「ADW_IAD」を選択します。
-
SQLの場合は、次の問合せをコピーします。
delete from SRCMIRROR_OCIGGLL.TRG_CUSTOMER where CITY_ID > 110 -
「SQL」を縮小します。
-
「データ・フロー」で、TRG_CUSTOMERデータ・フローをデザイン・キャンバスにドラッグします。
-
データ・クレンジングSQLワークフロー・ラインで選択し、OK (緑色の矢印)アイコンをTRG_CUSTOMERデータ・フローにドラッグします。
-
「ワークフローの保存」を選択し、「ワークフローの開始」を選択します。
-