9.2.33 スノーフレーク

スノーフレークは、Amazon Web Services (AWS)、Google Cloud Platform (GCP)またはMicrosoft Azureのクラウド・プロバイダのいずれかで動作するサーバーレス・データ・ウェアハウスです。Oracle GoldenGateでは、データをスノーフレークにロードするための2つのハンドラが用意されています。
  • スノーフレークにおけるステージングおよびマージ
  • スノーフレーク・ストリーミング・ハンドラ
次の表に、これら2つのハンドラの相違点をまとめます。

表9-38 ステージングおよびマージ・ハンドラとストリーミング・ハンドラの違い

詳細 ステージングおよびマージ ストリーミング・ハンドラ
ワークロード 任意 挿入のみ
レイテンシ マイクロバッチ リアルタイム
リソース 顧客管理の仮想ウェアハウス スノーフレーク管理のサーバーレス・コンピュート
API JDBC+SQLコマンド(PUT/COPY INTO/MERGE) Snowpipe Streaming
データ・ロード 内部/外部ステージからの仲介ロード・ステップが必要です。 スノーフレークへの直接ロード

トピック:

9.2.33.1 スノーフレーク・ステージングおよびマージ・ハンドラ

トピック:

9.2.33.1.1 概要

スノーフレークは、Amazon Web Services (AWS)、Google Cloud Platform (GCP)またはMicrosoft Azureのクラウド・プロバイダのいずれかで動作するサーバーレス・データ・ウェアハウスです。

スノーフレーク・イベント・ハンドラは、スノーフレークにデータを複製するために使用されます。

9.2.33.1.2 詳細な機能

スノーフレークへのレプリケーションでは、ステージを使用し、データ・フローをマージします。
  • Oracle GoldenGateの証跡からの変更データは、一時的なステージング場所(内部または外部ステージ)でマイクロバッチにステージングされます。
  • ステージングされたレコードは、次にマージSQL文を使用してスノーフレーク・ターゲット表にマージされます。

この項の内容は次のとおりです。

9.2.33.1.2.1 ステージングの場所

Oracle GoldenGate証跡ファイルからの変更データ・レコードは、Avro OCF (オブジェクト・コンテナ・フォーマット)にフォーマットされ、ステージングの場所にアップロードされます。

変更データは、次のいずれかのオブジェクト・ストアにステージングできます。

  • スノーフレーク内部ステージ
  • スノーフレーク外部ステージ
    • AWS Simple Storage Service (S3)
    • Azure Data Lake Storage (ADLS) Gen2
    • Google Cloud Storage (GCS)
9.2.33.1.2.2 データベース・ユーザー権限

スノーフレークへのレプリケーションに使用されるデータベース・ユーザーには、次の権限が付与されている必要があります。

  • ターゲット表に対するINSERTUPDATEDELETEおよびTRUNCATE
  • スノーフレーク指定ステージおよび外部ステージのCREATEおよびDROP
  • 外部ステージ(S3、ADLS、GCS)を使用する場合、外部表のCREATEALTERおよびDROP
9.2.33.1.2.3 前提条件
  • S3、ADLS Gen2またはGCSなどの外部ステージの場所を使用する場合は、Amazon Web Services、Google Cloud PlatformまたはAzureクラウド・アカウントを設定する必要があります。
  • スノーフレークJDBCドライバ

9.2.33.1.3 構成

スノーフレーク・レプリケーション・プロパティの構成は、Replicatプロパティ・ファイルに格納されます。

ノート:

調整Replicatを使用する場合のみ、パラメータ・ファイル内のプロパティ・ファイルへのパスを指定してください。次の行をパラメータ・ファイルに追加します。
TARGETDB LIBFILE libggjava.so SET property=<parameter file directory>/<properties file name>
9.2.33.1.3.1 自動構成

スノーフレーク・レプリケーションには、ファイル・ライター・ハンドラ、S3またはHDFSまたはGCSイベント・ハンドラ、ターゲット・スノーフレーク・イベント・ハンドラなどの複数のコンポーネントの構成が含まれます。

自動構成機能を使用すると、手動構成が最小限になるようにこれらのコンポーネントを自動構成できます。

自動構成によって変更されたプロパティもハンドラのログ・ファイルに記録されます。

自動構成でスノーフレーク・ターゲットに複製できるようにするには、パラメータgg.target=snowflakeを設定します。

パラメータgg.stageにより、ステージングの場所が決まります。gg.stageが設定されていない場合は、スノーフレーク内部ステージが使用されます。

gg.stages3absまたはgcsに設定されている場合は、それぞれAWS S3、ADLS Gen2またはGCSがステージングの場所として使用されます。

また、JDBCメタデータ・プロバイダは、スノーフレークからターゲット表メタデータを取得するように自動的に有効化されています。

9.2.33.1.3.1.1 ファイル・ライター・ハンドラの構成

ファイル・ライター・ハンドラ名はsnowflakeという値に事前設定されており、そのプロパティはスノーフレークに必要な値に自動的に設定されます。

ファイル・ライター・ハンドラのプロパティを追加または編集できます。たとえば:

gg.handler.snowflake.pathMappingTemplate=./dirout
9.2.33.1.3.1.2 S3ハンドラ構成

S3イベント・ハンドラ名は値s3に事前設定されており、S3構成と一致するように構成する必要があります。

次に、S3イベント・ハンドラのプロパティを編集する例を示します。

gg.eventhandler.s3.bucketMappingTemplate=bucket1
詳細は、「Amazon S3」を参照してください。
9.2.33.1.3.1.3 HDFSイベント・ハンドラ構成

Hadoop Distributed File System (HDFS)イベント・ハンドラ名は値hdfsに事前設定されており、HDFSに書き込むように自動構成されています。

Hadoop構成ファイルcore-site.xmlが、Azure Data Lake Storage (ADLS) Gen2ストレージ・アカウントのそれぞれのコンテナにデータ・ファイルを書き込むように構成されていることを確認します。詳細は、「HadoopクライアントおよびABFSを使用したAzure Data Lake Gen2」を参照してください。

次に、HDFSイベント・ハンドラのプロパティを編集する例を示します。

gg.eventhandler.hdfs.finalizeAction=delete
9.2.33.1.3.1.4 Google Cloud Storageイベント・ハンドラ構成

Google Cloud Storage (GCS)イベント・ハンドラ名は値gcsに事前設定されており、GCS構成と一致するように構成する必要があります。

次に、GCSイベント・ハンドラ・プロパティの編集例を示します。

gg.eventhandler.gcs.bucketMappingTemplate=bucket1
9.2.33.1.3.1.5 スノーフレーク・イベント・ハンドラ構成

スノーフレーク・イベント・ハンドラ名は、値snowflakeに事前設定されています。

スノーフレーク・イベント・ハンドラで使用可能な構成プロパティを次に示します。必要なプロパティは、スノーフレーク構成に一致するように変更する必要があります。

表9-39 スノーフレーク・イベント・ハンドラ構成

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.eventhandler.snowflake.connectionURL 必須 サポートされている接続URL。たとえば、jdbc:snowflake://<account_name>.snowflakecomputing.com/?warehouse=<warehouse-name>&db=<database-name>です なし スノーフレークに接続するためのJDBC URL。スノーフレーク・アカウント名、ウェアハウスおよびデータベースは、JDBC URLで設定する必要があります。ウェアハウスはwarehouse=<warehouse name>を使用して設定でき、データベースはdb=<db name>を使用して設定できます。認可の場合は、ロールをrole=<rolename>を使用して設定する必要があります
gg.eventhandler.snowflake.UserName 必須 サポートされているデータベース・ユーザー名文字列。 なし スノーフレーク・データベース・ユーザー。
gg.eventhandler.snowflake.Password 必須 サポートされているパスワード文字列。 なし スノーフレーク・データベース・パスワード。
gg.eventhandler.snowflake.storageIntegration オプション ストレージ統合名。 なし このパラメータは、ADLS Gen2、GCS、S3などの外部ステージを使用する場合は必須です。これは、スノーフレーク・データ・ウェアハウスがそれぞれのオブジェクト・ストア・ファイルにアクセスするための資格証明です。詳細は、スノーフレーク・ストレージ統合を参照してください。
gg.eventhandler.snowflake.maxConnnections オプション 整数値 10 このパラメータは、ターゲット・スノーフレーク・データベースへの同時JDBCデータベース接続の数を制御するために使用します。
gg.eventhandler.snowflake.dropStagingTablesOnShutdown オプション true | false false trueに設定すると、Oracle GoldenGateによって作成された一時ステージング表は、Replicatの正常な停止時に削除されます。
gg.handler.snowflake.fileRollInterval オプション デフォルトの測定単位はミリ秒です。ms、s、m、hを、それぞれミリ秒、秒、分または時間を表すように指定できます。有効な値は、10000、10000ms、10s、10m、1.5hなどです。0以下の値を指定すると、ファイルのローリング・オン時間がオフになります。 3m (3分) このパラメータにより、データがスノーフレークにマージされる頻度を決めます。この値が大きいほど、Replicatプロセスのメモリーに格納する必要があるデータが多くなるため、注意して使用してください。

ノート:

このパラメータは慎重に使用してください。そのデフォルト値(3m)を増やすと、Replicatの内部メモリーに格納されるデータの量が増えます。これにより、メモリー不足エラーが発生し、メモリー不足になるとReplicatが停止する可能性があります。

ノート:

23aiリリース以降では、gg.aggregate.operations.flush.intervalプロパティは非推奨となり、サポートされなくなりました。詳細は、「インメモリー操作の集計」を参照してください
gg.eventhandler.snowflake.putSQLThreads オプション 整数値 4 PUT SQLを使用してファイルをアップロードするために使用するスレッド数(`PARALLEL`句)を指定します。これは、スノーフレーク内部ステージ(名前付きステージ)が使用されている場合にのみ関係します。
gg.eventhandler.snowflake.putSQLAutoCompress オプション true | false false PUT SQLを使用したアップロード中にスノーフレークがgzipを使用してファイルを圧縮するかどうか(AUTO_COMPRESS句)を指定します。

true: ファイルは圧縮されます(まだ圧縮されていない場合)。

false: ファイルは圧縮されません(つまり、ファイルはそのままアップロードされます)。これは、スノーフレーク内部ステージ(名前付きステージ)が使用されている場合にのみ関係します。
gg.validate.keyupdate オプション trueまたはfalse false trueに設定した場合は、Replicatによってキー更新操作(optype 115)が検証され、キー値が変更されていない場合は通常の更新に訂正されます。圧縮キー更新操作はマージ対象ではありません。
gg.eventhandler.snowflake.useCopyForInitialLoad オプション trueまたはfalse true trueに設定すると、初期ロード時にCOPY SQL文が使用されます。falseに設定すると、初期ロード時にINSERT SQL文が使用されます。
gg.compressed.update オプション trueまたはfalse true trueを設定すると、ソース証跡ファイルに圧縮更新操作が含まれていることを示します。falseに設定すると、ソース証跡ファイルには、非圧縮更新操作が含まれることが想定されます。
gg.eventhandler.snowflake.connectionRetries オプション 整数値 3 ターゲット・データ・ウェアハウスへの接続が再試行される回数を指定します。
gg.eventhandler.snowflake.connectionRetryIntervalSeconds オプション 整数値 30 接続再試行間の遅延(分単位)を指定します。
gg.eventhandler.snowflake.deleteInsert オプション trueまたはfalse false trueに設定した場合は、Replicatで、SQL MERGE文ではなくSQLのDELETE+INSERT文を使用してレコードがマージされます。

ノート:

gg.compressed.updatefalseに設定されている場合のみ適用されます。
gg.eventhandler.snowflake.detectMissingBaseRow オプション trueまたはfalse false ベース行のないUPDATE操作を見つけるための診断パラメータ。trueに設定すると、ベース行のないUPDATE操作がある場合にReplicatが異常終了(ABEND)します。これらの行は、調査可能な別の表に収集されます。
gg.eventhandler.snowflake.createTable オプション trueまたはfalse true この値がtrueに設定されている場合は、ターゲット表がなければそれが自動的に作成されます。
9.2.33.1.3.2 スノーフレーク・ストレージ統合

外部ステージングの場所を使用する場合は、スノーフレーク・ストレージ統合を設定して、クラウド・オブジェクト・ストアにあるファイルにスノーフレーク・データベース読取り権限を付与してください。

構成プロパティgg.stageが設定されていない場合、ストレージ統合は不要であり、Oracle GoldenGateではデフォルトで内部ステージになります。

  • Azure Data Lake Storage (ADLS) Gen2のストレージ統合: Azureのストレージ統合の作成の詳細は、Azureのストレージ統合を作成するためのスノーフレークのドキュメントを参照してください。

    :
    -- AS ACCOUNTADMIN
    create storage integration azure_int
    type = external_stage
    storage_provider = azure
    enabled = true
    azure_tenant_id = '<azure tenant id>'
    storage_allowed_locations = ('azure://<azure-account-name>.blob.core.windows.net/<azure-container>/');
    
    desc storage integration azure_int;
    -- Read AZURE_CONSENT_URL and accept the terms and conditions specified in the link.
    -- Read AZURE_MULTI_TENANT_APP_NAME to get the Snowflake app name to be granted Blob Read permission.
    
    grant create stage on schema <schema name> to role <role name>;
    grant usage on integration azure_int to role <role name>;
  • Google Cloud Storage (GCS)のストレージ統合: GCSのストレージ統合の作成の詳細は、スノーフレークのドキュメントを参照してください。
    :
    create storage integration gcs_int
    type = external_stage
    storage_provider = gcs
    enabled = true
    storage_allowed_locations = ('gcs://<gcs-bucket-name>/');
    
    desc storage integration gcs_int;
    -- Read the column STORAGE_GCP_SERVICE_ACCOUNT to get the GCP Service Account email for Snowflake.
    -- Create a GCP role with storage read permission and assign the role to the Snowflake Service account.
    
    grant create stage on schema <schema name> to role <role name>;
    grant usage on integration gcs_int to role <role name>;
    
  • AWS S3のストレージ統合: S3のストレージ統合の作成の詳細は、スノーフレークのドキュメントを参照してください。

    ノート:

    S3を外部ステージとして使用する際、次のAWS資格証明へのアクセス権がすでにある場合、ストレージ統合を作成する必要はありません: AWSアクセス・キーIDおよび秘密キー。AWS資格証明は、jvm.bootoptionsプロパティで設定できます。
  • ストレージ統合名はアルファベット文字で始まる必要があり、識別子文字列全体がMy objectのように二重引用符で囲まれていないかぎり、スペースや特殊文字を含めることはできません。二重引用符で囲まれた識別子も大文字と小文字が区別されます。
9.2.33.1.3.3 クラスパス構成

スノーフレーク・イベント・ハンドラは、スノーフレークJDBCドライバを使用します。クラスパスにJDBCドライバへのパスが含まれていることを確認します。外部ステージを使用する場合は、それぞれのオブジェクト・ストア・イベント・ハンドラの依存性をクラスパスに含める必要があります。

9.2.33.1.3.3.1 依存性

スノーフレークJDBCドライバ: 依存性ダウンローダ・ツールを使用して、次のスクリプトを実行することによってJDBCドライバをダウンロードできます: <OGGDIR>/DependencyDownloader/snowflake.sh

詳細は、「依存性ダウンローダ」を参照してください。

または、次の依存性ダウンローダ座標を使用してJDBCドライバをMaven Centralからダウンロードすることもできます。

<dependency>
   <groupId>net.snowflake</groupId>
   <artifactId>snowflake-jdbc</artifactId>
   <version>3.13.19</version>
</dependency>
  • ステージングの場所がS3に設定されている場合、クラスパスにはS3イベント・ハンドラ依存性が含まれている必要があります。S3ハンドラ構成を参照してください。
  • ステージングの場所がHDFSに設定されている場合、クラスパスにはHDFSイベント・ハンドラ依存性が含まれている必要があります。HDFSイベント・ハンドラ構成を参照してください。
  • ステージングの場所がGoogle Cloud Storage (GCS)に設定されている場合、クラスパスにはGCSイベント・ハンドラ依存性が含まれている必要があります。Google Cloud Storageイベント・ハンドラ構成を参照してください。

gg.classpath構成パラメータを編集して、オブジェクト・ストア・イベント・ハンドラ依存性(外部ステージが使用中の場合)およびスノーフレークJDBCドライバへのパスを含めます。

9.2.33.1.3.4 プロキシ構成

Replicatプロセスがプロキシ・サーバーより後ろで実行される場合は、プロキシ・サーバー構成にjvm.bootoptionsプロパティを使用できます。

例:

jvm.bootoptions=-Dhttp.useProxy=true -Dhttps.proxyHost=<some-proxy-address.com>
-Dhttps.proxyPort=80 -Dhttp.proxyHost=<some-proxy-address.com> -Dhttp.proxyPort=80
9.2.33.1.3.5 INSERTALLRECORDSのサポート

ステージングおよびマージ・ターゲットでは、INSERTALLRECORDSパラメータがサポートされます。

『Oracle GoldenGateリファレンス』INSERTALLRECORDSを参照してください。Replicatパラメータ・ファイル(.prm)でINSERTALLRECORDSパラメータを設定します。Replicatパラメータ・ファイル(.prm)でINSERTALLRECORDSパラメータを設定します

このプロパティを設定すると、Replicatプロセスに、操作データをターゲット表にロードするための一括挿入操作を使用するように指示されます。一括挿入のバッチ・サイズは、ファイル・ライター・プロパティgg.handler.snowflake.maxFileSizeを使用してチューニングできます。デフォルト値は1GBに設定されています。一括挿入の頻度は、ファイル・ライター・プロパティgg.handler.snowflake.fileRollIntervalを使用してチューニングでき、デフォルト値は3m (3分)に設定されています。

ノート:

  • スノーフレーク内部ステージを使用する場合、gg.eventhandler.snowflake.putSQLAutoCompresstrueに設定してステージング・ファイルを圧縮できます。
  • INSERTのみのワークロードの場合はスノーフレーク・ストリーミング・ハンドラを使用することを検討してください。「スノーフレーク・ストリーミング・ハンドラ」を参照してください。
9.2.33.1.3.6 スノーフレーク・キー・ペア認証

スノーフレークは、ユーザー名とパスワードを使用した基本認証の代替としてキー・ペア認証をサポートしています。

秘密キー・ファイルへのパスは、プロパティprivate_key_fileを使用してJDBC接続URLに設定する必要があります。

秘密キー・ファイルが暗号化されている場合、接続URLにはプロパティprivate_key_file_pwdも含める必要があります。

さらに、接続URLには、プロパティuserを設定して各公開キーが割り当てられているSnowflakeユーザーも含める必要があります。

JDBC接続URLの例:
jdbc:snowflake://<account_name>.snowflakecomputing.com/?warehouse=<warehouse-name>
 &db=<database-name>&private_key_file=/path/to/private/key/rsa_key.p8
 &private_key_file_pwd=<private-key-password>&user=<db-user>
キー・ペア認証を使用する場合は、Snowflakeイベント・ハンドラのパラメータUsernameおよびPasswordが設定されていないことを確認します。

ノート:

Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)をバージョン21.10.0.0.0にアップグレードすることをお薦めします。21.10.0.0.0にアップグレードできない場合は、JDBC URLを変更して'\'文字を'/'に置き換えます。
9.2.33.1.3.7 ソースJSON/XMLからSnowflake VARIANTへのマッピング
Oracle GoldenGate証跡のJSONおよびXMLソース列タイプは、自動的に検出され、Snowflake VARIANTにマップされます。

logdumpを使用して、Oracle GoldenGate証跡ファイルでJSONおよびXMLタイプのメタデータを検査できます。

例: JSONおよびXMLタイプを示すlogdump出力:
022/01/06 01:38:54.717.464 Metadata             Len 679 RBA 6032
Table Name: CDB1_PDB1.TKGGU1.JSON_TAB1
*
 1)Name          2)Data Type        3)External Length  4)Fetch Offset      5)Scale         6)Level
 7)Null          8)Bump if Odd      9)Internal Length 10)Binary Length    11)Table Length 12)Most Sig DT
13)Least Sig DT 14)High Precision  15)Low Precision   16)Elementary Item  17)Occurs       18)Key Column
19)Sub DataType 20)Native DataType 21)Character Set   22)Character Length 23)LOB Type     24)Partial Type
25)Remarks
*
TDR version: 11
Definition for table CDB1_PDB1.TKGGU1.JSON_TAB1
Record Length: 81624
Columns: 7
ID                                              64     50        0  0  0 0 0     50     50     50 0 0 0 0 1    0 1   2    2       -1      0 0 0
COL                                             64   4000       56  0  0 1 0   4000   8200      0 0 0 0 0 1    0 0   0  119        0      0 1 1  JSON
COL2                                            64   4000     4062  0  0 1 0   4000   8200      0 0 0 0 0 1    0 0   0  119        0      0 1 1  JSON
COL3                                            64   4000     8068  0  0 1 0   4000   4000      0 0 0 0 0 1    0 0  10  112       -1      0 1 1  XML
SYS_NC00005$                                    64   8000    12074  0  0 1 0   4000   4000      0 0 0 0 0 1    0 0   4  113       -1      0 1 1  Hidden
SYS_IME_OSON_CF27CFDF1CEB4FA2BF85A3D6239A433C   64  65534    16080  0  0 1 0  32767  32767      0 0 0 0 0 1    0 0   4   23       -1      0 0 0  Hidden
SYS_IME_OSON_CEE1B31BB4494F6ABF31AC002BEBE941   64  65534    48852  0  0 1 0  32767  32767      0 0 0 0 0 1    0 0   4   23       -1      0 0 0  Hidden
End of definition

この例では、COLおよびCOL2JSON列、COL3XML列です。

また、Snowflake VARIANTへのマッピングは、ソース列がテキストとして格納されている場合にのみサポートされます。

9.2.33.1.3.8 操作集計

集計操作は、同じ行に対する複数の操作をしきい値に基づいて単一の出力操作に集計(マージ/圧縮)するプロセスです。

9.2.33.1.3.8.1 インメモリー操作の集計
  • 操作レコードは、デフォルトではインメモリーで集計されます。
  • gg.aggregate.operations.flush.intervalプロパティは非推奨となり、サポートされなくなりました。GG for DAA 23aiでgg.aggregate.operations.flush.intervalが使用されている場合、Replicatは実行されますが、非推奨でありサポートされていないプロパティに関する警告がログ・ファイルに追加されます。

    集計の時間枠を制御するには、gg.handler.snowflake.fileRollIntervalプロパティを使用します。デフォルトでは、これは3分に設定されています。間隔が長いほど、待機時間が長くなります。また、メモリー使用量が増える場合があります。間隔が短いほど、Oracle GoldenGateおよびターゲット・データベースでのオーバーヘッドが増えます。
  • インメモリー操作集計には、追加のJVMメモリー構成が必要です。
9.2.33.1.3.8.2 SQLを使用した操作集計
  • SQL集計を使用するには、証跡ファイルに非圧縮UPDATE操作レコードが含まれている必要があります。つまり、UPDATE操作には、更新する行の完全なイメージが含まれていることを意味します。
  • SQLを使用した操作集計では、証跡ファイルに非圧縮更新レコードが含まれている場合、スループットが向上します。
  • Replicatは、gg.aggregate.operations.using.sql=trueを設定することで、SQL文を使用して操作を集計できます。
  • ファイル・ライターgg.handler.snowflake.fileRollIntervalプロパティを使用して、マージ間隔の頻度をチューニングでき、デフォルト値は3m (3分)に設定されます。
  • SQLを使用した操作集計では、追加のJVMメモリー構成は必要ありません。
9.2.33.1.3.9 圧縮更新の処理

圧縮更新レコードには、キー列および変更された列の値が含まれています。

非圧縮更新レコードには、すべての列の値が含まれています。

Oracle GoldenGate証跡には、圧縮更新レコードまたは非圧縮更新レコードを含めることができます。デフォルトの抽出構成では、圧縮更新が証跡に書き込まれます。パラメータgg.compressed.updatetrueまたはfalseに設定して、圧縮更新レコードまたは非圧縮更新レコードを指定できます。

9.2.33.1.3.9.1 非圧縮更新を含むMERGE文

場合によっては、証跡に非圧縮更新レコードが含まれている場合、gg.compressed.update=falseを設定することで、パフォーマンスを向上させるためにMERGE SQL文を最適化できます。MERGE SQL文のかわりにDELETE+INSERT SQL文を使用する場合は、gg.eventhandler.snowflake.deleteInsert=trueを設定します。

9.2.33.1.3.10 エンドツーエンドの構成

自動構成を使用するエンド-エンド構成の例を次に示します。

サンプル・プロパティ・ファイルの場所: <OGGDIR>/AdapterExamples/big-data/snowflake/
  • sf.props: 内部ステージを使用した構成
  • sf-s3.props: S3ステージを使用した構成。
  • sf-az.props: ADLS Gen2ステージを使用した構成。
  • sf-gcs.props: GCSステージを使用した構成。
# Note: Recommended to only edit the configuration marked as  TODO

gg.target=snowflake

#The Snowflake Event Handler
#TODO: Edit JDBC ConnectionUrl
gg.eventhandler.snowflake.connectionURL=jdbc:snowflake://<account_name>.snowflakecomputing.com/?warehouse=<warehouse-name>&db=<database-name>
#TODO: Edit JDBC user name
gg.eventhandler.snowflake.UserName=<db user name>
#TODO: Edit JDBC password
gg.eventhandler.snowflake.Password=<db password>

# Configuration to load GoldenGate trail operation records into Snowflake using Snowflake internal stage.
#TODO:Set the classpath to include Snowflake JDBC driver.
gg.classpath=$THIRD_PARTY_DIR/snowflake/*
#TODO:Provide sufficient memory.
jvm.bootoptions=-Xmx8g -Xms8g


# Configuration to load GoldenGate trail operation records into Snowflake using S3 stage.
#gg.stage=s3
#The S3 Event Handler
#TODO: Edit the AWS region
#gg.eventhandler.s3.region=<aws region>
#TODO: Edit the AWS S3 bucket
#gg.eventhandler.s3.bucketMappingTemplate=<s3 bucket>
#TODO:Set the classpath to include AWS Java SDK and Snowflake JDBC driver.
#gg.classpath=$THIRD_PARTY_DIR/s3/*:$THIRD_PARTY_DIR/snowflake/*
#TODO:Set the AWS access key and secret key. Provide sufficient memory.
#jvm.bootoptions=-Daws.accessKeyId=<AWS access key> -Daws.secretKey=<AWS secret key> -Xmx8g -Xms8g


# Configuration to load GoldenGate trail operation records into Snowflake using ADLS Gen2 stage.
#gg.stage=abs
# Azure Blob Event handler.
#gg.eventhandler.abs.bucketMappingTemplate=<azure_adls_gen2_container_name>
#gg.eventhandler.abs.accountName=<azure_storage_account_name>
#gg.eventhandler.abs.accountKey=<azure_storage_account_key>
#TODO: Edit snowflake storage integration to access Azure Blob Storage.
#gg.eventhandler.snowflake.storageIntegration=<azure_int>
#TODO: Edit the classpath to include HDFS Event Handler dependencies and Snowflake JDBC driver.                                                                             
#gg.classpath=$THIRD_PARTY_DIR/abs/*:$THIRD_PARTY_DIR/snowflake/* 
#TODO: Provide sufficient memory.
#jvm.bootoptions=-Xmx8g -Xms8g

# Configuration to load GoldenGate trail operation records into Snowflake using GCS stage.
#gg.stage=gcs
## The GCS Event handler
#TODO: Edit the GCS bucket name
#gg.eventhandler.gcs.bucketMappingTemplate=<gcs bucket>
#TODO: Edit the GCS credentialsFile
#gg.eventhandler.gcs.credentialsFile=<oggbd-project-credentials.json>
#TODO: Edit snowflake storage integration to access GCS.
#gg.eventhandler.snowflake.storageIntegration=<gcs_int>
#TODO: Edit the classpath to include GCS Java SDK and Snowflake JDBC driver.
#gg.classpath=$THIRD_PARTY_DIR/gcs/*:$THIRD_PARTY_DIR/snowflake/*
#TODO: Provide sufficient memory.
#jvm.bootoptions=-Xmx8g -Xms8g     
9.2.33.1.3.11 表マッピング

MAP文でターゲット・データベースが指定されていない場合は、JDBC接続URLにおいて設定されているデータベースが使用されます。ハンドラにより、初期化中にデフォルト・データベースがログ記録されます。

ログ・メッセージの例:
Connection catalog is set to [DB_1].
9.2.33.1.3.11.1 マッピング表

表9-40 スノーフレークのマッピング表

Replicatパラメータ・ファイルのMAP文 スノーフレーク・データベース スノーフレーク・スキーマ スノーフレーク表
MAP SCHEMA_1.TABLE_1, TARGET "schema_1"."table_1"; デフォルト・データベース schema_1 table_1
MAP DB_1.SCHEMA_1.TABLE_1, TARGET "db_1"."schema_1"."table_1" db_1 schema_1 table_1

9.2.33.1.4 トラブルシューティングと診断

  • スノーフレークへの接続の問題:
    • JDBC接続URL、ユーザー名およびパスワードを検証してください。
    • プロキシの背後でReplicatプロセスを実行している場合は、HTTP(S)プロキシ構成を確認します。
  • DDLがターゲット表に適用されない: Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)ではDDLレプリケーションはサポートされていません。
  • SQLエラー: SQLの実行中にエラーが発生した場合は、そのSQL文がバインド・パラメータ値とともにGG for DAAハンドラのログ・ファイルに記録されます。
  • コンポーネントの共存: 外部ステージの場所(S3、ADLS Gen 2またはGCS)を使用する場合、Replicatプロセスが実行されているマシンの場所/リージョンおよびオブジェクト・ストアのリージョンは、適用プロセスの全体的なスループットに影響します。

    最大限のスループットを得るには、理想的にはコンポーネントを同じリージョンまたはできるかぎり近くに配置する必要があります。

  • 証跡ファイルの部分的なLOBレコードによるReplicatの異常終了(ABEND): GG for DAAでは、部分LOBデータのレプリケーションはサポートされていません。Extractパラメータ・ファイルでTRANLOGOPTIONS FETCHPARTIALLOBオプションを使用して、Oracle統合取得によって証跡ファイルを再生成する必要があります。
  • 10個を超えるターゲット表に複製する場合、パラメータmaxConnnectionsをより高い値に増やしてスループットを改善できます。

    ノート:

    これを調整する場合、パラメータ値を増やすと、スノーフレーク・データ・ウェアハウス上により多くのJDBC接続が作成されます。スノーフレーク・データベース管理者に相談してデータウェアハウスの状態が損なわれないようにできます。
  • スノーフレークJDBCドライバは、標準のJavaログ・ユーティリティを使用します。JDBCドライバのログ・レベルは、JDBC接続パラメータ・トレースを使用して設定できます。トレース・レベルは、スノーフレーク・イベント・ハンドラ・プロパティgg.eventhandler.snowflake.connectionURLで設定できます。
    このプロパティを編集する例を次に示します:
    jdbc:snowflake://<account_name>.snowflakecomputing.com/?warehouse=<warehouse-name>&db=<database-name>&tracing=SEVERE
    詳細は、https://docs.snowflake.com/en/user-guide/jdbc-parameters.html#tracingを参照してください。
  • 例外: net.snowflake.client.jdbc.SnowflakeReauthenticationRequest: 認証トークンが期限切れです。ユーザーは再度認証する必要があります

    このエラーは、長期間非アクティブの場合に発生します。これを解決するには、JDBCパラメータCLIENT_SESSION_KEEP_ALIVEを設定して、セッションで非アクティブ状態が終わった後にデータベース・ユーザーにログインを強制できます。たとえば、jdbc:snowflake://<account_name>.snowflakecomputing.com/?warehouse=<warehouse-name>&db=<database-name>&CLIENT_SESSION_KEEP_ALIVE=trueです

  • メモリー不足エラーでReplicatが停止: デフォルト値(30000)を使用していない場合は、gg.aggregate.operations.flush.interval値を減らします。
  • ラージ・オブジェクト(LOB)列値の複製中のパフォーマンスの問題: LOB処理が遅くなる可能性があります。インラインLOBしきい値を超えるLOB列ごとに、UPDATE SQLが実行されます。LOB処理中にスループットをチューニングするには、次のメッセージを探します: The current operation at position [<seqno>/<rba>] for table [<tablename>] contains a LOB column [<column name>] of length [<N>] bytes that exceeds the threshold of maximum inline LOB size [<N>]. Operation Aggregator will flush merged operations, which can degrade performance. The maximum inline LOB size in bytes can be tuned using the configuration gg.maxInlineLobSize.LOBデータを含む証跡ファイルを確認し、BLOB/CLOB列の最大サイズを取得します。または、ソース表定義をチェックして、LOBデータの最大サイズを確認します。デフォルトのインラインLOBサイズは16000バイトに設定され、すべてのLOB列の更新がバッチで処理されるように、大きい値に増やすことができます。構成プロパティはgg.maxInlineLobSize`です。たとえば、gg.maxInlineLobSize=24000000 -->では、24MBまでのすべてのLOBがインラインで処理されます。より大きなステージング・ファイルが生成されるように、Replicatを再配置し、状態ファイル、データ・ディレクトリをパージしてやりなおす必要があります。
  • エラー・メッセージ: 現在のセッションにデータベースが設定されていません。オプション'db=<database name>'を使用して、JDBC接続URL [gg.eventhandler.snowflake.connectionURL]にデータベースを設定してください。`

    解決策: 構成プロパティgg.eventhandler.snowflake.connectionURLにデータベース名を設定します。

  • 警告メッセージ: 現在のセッションでロールが設定されていません。ウェアハウス[{}]がアクセスするためにカスタム・ロールを必要とする場合は、オプション'role=<role name>'を使用してJDBC接続URL [gg.eventhandler.snowflake.connectionURL]にカスタム・ロール名を設定してください

    解決策: スノーフレーク・ウェアハウスにアクセスするためにカスタム・ロールが必要な場合には、構成プロパティgg.eventhandler.snowflake.connectionURLでロールを設定します。

  • エラー・メッセージ: 現在のセッションでアクティブなウェアハウスが選択されていません。オプション'warehouse=<warehouse name>'および'role=<role name>'を使用して、JDBC接続URL [gg.eventhandler.snowflake.connectionURL]でウェアハウス名(および各ウェアハウスにアクセスする必要がある場合はカスタム・ロール名)を設定してください

    解決策: 構成プロパティgg.eventhandler.snowflake.connectionURLにウェアハウスおよびロールを設定します。

  • エラー・メッセージ: `エラー2024-06-07 05:52:23.000344 [main] - JDBCMDP-00034現在の接続試行は次のエラーで失敗しました: [指定された秘密キーが無効であるかサポートされていません: ./rsa_key_sanav2.p8: PBEパラメータ解析エラー: AES暗号のオブジェクト識別子が必要です]`

    解決策: これは、スノーフレークJDBCドライバにおける最近の問題です。回避策は、スノーフレークJDBCドライバ・バージョン3.16.1にアップグレードし、Javaシステム・プロパティ-Dnet.snowflake.jdbc.enableBouncyCastle=trueをReplicatプロパティ・ファイル内のjvm.bootoptionsパラメータに追加することです。

9.2.33.2 スノーフレーク・ストリーミング・ハンドラ

9.2.33.2.1 概要

スノーフレーク・ストリーミング・ハンドラでは、Snowpipe Streaming APIを使用してデータがスノーフレークに複製されます。このハンドラでは、Snowpipe Streaming APIの使用によりINSERTのみのワークロードがサポートされています。それにより、スノーフレークへのデータ・ロードのコストが低くなりロード・レイテンシが低くなります。

ノート:

ワークロードに更新と削除が含まれている場合は、スノーフレーク・ステージングおよびマージ・ハンドラの使用を検討してください。

詳細は、Snowpipe Streamingのドキュメントを参照してください。

9.2.33.2.2 詳細な機能

Oracle GoldenGate証跡からの変更データは、Snowpipe Streaming APIを使用してスノーフレークのターゲット表に追加/ストリーミングされます。このStreaming APIにより、行がターゲット表に低レイテンシで直接ロードされ、ステージング領域の必要性もなくなります。

ノート:

スノーフレーク・ストリーミング・ハンドラでは、INSERTのみのワークロードがサポートされています。必要に応じて、INSERTALLRECORDSを使用してupdate文とdelete文を変換できます。
9.2.33.2.2.1 データベース・ユーザー権限

スノーフレークへのレプリケーションに使用されるデータベース・ユーザーには、次の権限が付与されている必要があります。

  • ターゲット表に対するINSERT
  • オプションで、gg.handler.snow.createTabletrueに設定する場合はCREATE TABLE
9.2.33.2.2.2 前提条件
  • Oracle GoldenGate証跡は、INSERT操作のみを生成するように構成する必要があります。更新操作と削除操作がINSERTUPDATEINSERTDELETEINSERTALLRECORDSなどのパラメータの使用によって挿入に変換される場合、そのような挿入もハンドラでサポートされます。
9.2.33.2.2.3 Snowpipe Streaming APIを使用したステージング

Snowpipe Streaming APIにより、ターゲット表に低レイテンシで取り込めるようになります。

9.2.33.2.3 構成

スノーフレーク・レプリケーション・プロパティの構成は、Replicatプロパティ・ファイルに格納されます。

ノート:

調整Replicatを使用する場合のみ、パラメータ・ファイル内のプロパティ・ファイルへのパスを指定してください。次の行をパラメータ・ファイルに追加します。
TARGETDB LIBFILE libggjava.so SET property=<parameter file directory>/<properties file name>

スノーフレーク・ストリーミング・ハンドラで使用可能な構成プロパティを次に示します。必要なプロパティを、ご使用のスノーフレーク構成に一致するように変更する必要があります。

表9-41 スノーフレーク・ストリーミング・ハンドラ構成

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.handlerlist 必須 文字列値。たとえば、snowです。 なし ハンドラの名前snowを選択します。
gg.handler.<name>.type 必須 snowflakestreaming なし 使用するハンドラのタイプ。
gg.handler.<name>.account 必須 文字列値。 なし スノーフレークのアカウント名。
gg.handler.<name>.user 必須 文字列値。 なし スノーフレーク・データ・ウェアハウス・ユーザー。
gg.handler.<name>.role オプション 文字列値。 ACCOUNTADMIN スノーフレーク・データ・ウェアハウス・ロール。
gg.handler.<name>.warehouse 必須 文字列値。 なし スノーフレーク・データ・ウェアハウス名。
gg.handler.<name>.database 必須 文字列値。 なし 接続中に使用される、スノーフレークのデフォルト・データベース名。
gg.handler.<name>.privateKeyFile 必須 文字列値。 なし ユーザーの秘密キー・ファイルへの完全修飾パスを指定します。これは、キーペア認証に使用されます。
gg.handler.<name>.privateKeyFilePassword オプション 文字列値。 なし 秘密キー・ファイルが暗号化されている場合の、秘密キー・ファイルのパスワードを指定します。
gg.handler.<name>.createTable オプション trueまたはfalse true trueに設定すると、ターゲット表が存在しない場合にはそれが自動的に作成されます。
gg.handler.<name>.flushTimeout オプション 数値 30秒 ターゲットにコミットするストリーミング操作のフラッシュ・タイムアウトを設定します。値は秒単位である必要があります。

9.2.33.2.4 クラスパス構成

スノーフレーク・ストリーミング・ハンドラでは、スノーフレーク取込みJava SDKが使用されます。gg.classpath構成パラメータにその取込みSDKへのパスが含まれていることを確認してください。

9.2.33.2.4.1 依存性

次のスクリプトを実行することで依存性ダウンローダ・ツールをダウンロードして依存性をダウンロードできます:

<OGGDIR>/DependencyDownloader/snowflake_streaming.sh.

依存関係ダウンロードの詳細は、依存関係ダウンロードを参照してください。

9.2.33.2.4.2 Maven座標
スノーフレーク取込みSDK:
<dependency>
      <groupId>net.snowflake</groupId>
      <artifactId>snowflake-ingest-sdk</artifactId>
      <version>2.1.0</version>
      <scope>provided</scope>
</dependency>

9.2.33.2.5 プロキシ構成

Replicatプロセスがプロキシ・サーバーより後ろで実行される場合は、jvm.bootoptionsプロパティを使用してプロキシ・サーバー構成を設定できます。

例:

jvm.bootoptions=
-Dhttp.useProxy=true 
-Dhttp.proxyHost=<some-proxy-address.com>
-Dhttp.proxy.port=<some-port-number>

9.2.33.2.6 スノーフレーク・ストリーミング・ハンドラのキー・ペア認証

スノーフレーク・ストリーミングAPIでは、キー・ペア認証を使用する必要があります。秘密キー・ファイルへのパスを、プロパティgg.handler.snow.privateKeyFileを使用して設定する必要があります。

秘密キー・ファイルが暗号化されている場合は、プロパティgg.handler.snow.privateKeyFilePasswordを使用してそのパスワードを指定します

また、プロパティgg.handler.snow.userを設定することで、スノーフレーク・ユーザーを含めてそれぞれの公開キーに割り当てられるようにします。

9.2.33.2.7 サンプル構成

このサンプル・プロパティ・ファイルは、ディレクトリ <OGGDIR>/AdapterExamples/big-data/snowflake_streaming/にもあります。
# Note: Recommended to only edit the configuration marked as  TODO

gg.handlerlist=snow
gg.handler.snow.type=snowflakestreaming
#TODO: Edit database user.
gg.handler.snow.user=<db-user>
#TODO: Edit account name.
gg.handler.snow.account=<account-name>
#TODO: Edit role name.
gg.handler.snow.role=<role-name>
#TODO: Edit warehouse name.
gg.handler.snow.warehouse=<warehouse-name>
#TODO: Edit default database name.
gg.handler.snow.database=<default-db-name>
#TODO: Edit path to the private key file.
gg.handler.snow.privateKeyFile=/path/to/private/key/file/rsa_key.p8
#TODO: Edit password for the private key file.
gg.handler.snow.privateKeyFilePassword=<some-password>
#TODO:Set the classpath to include Snowflake ingest SDK and the Snowflake JDBC driver.
gg.classpath=.snowflake-ingest-sdk-2.1.1.jar

9.2.33.2.8 トラブルシューティングと診断

  • スノーフレークへの接続の問題:
    • 構成パラメータ(accountuserrolewarehouseprivateKeyFileprivateKeyFilePasswordおよびdatabase)を検証します。
    • プロキシの背後でReplicatプロセスを実行している場合は、HTTP(S)プロキシ構成を確認します。
  • DDLがターゲット表に適用されない: GG for DAAでは、DDLレプリケーションはサポートされていません。
  • SQLエラー: SQLの実行中にエラーが発生した場合は、そのSQL文がバインド・パラメータ値とともにGG for DAAハンドラのログ・ファイルに記録されます。