DB2 データソースは、DB2 データベースとの間でデータを読み取るおよび書き込むための双方向チャネルを提供します。この機能により、大量のデータを迅速に処理できます。本トピックでは、DataWorks の DB2 に対するデータ同期機能について説明します。
サポートされるバージョン
DB2 Reader および DB2 Writer は、IBM Data Server Driver for JDBC and SQLJ 4.11.77 ドライバーを使用します。DB2 ドライバーとデータベースサービスのバージョンマッピングの詳細については、公式ドキュメントをご参照ください。
制限事項
DB2 Reader および DB2 Writer は、サーバーレスリソースグループおよびData Integration 専用リソースグループをサポートしています。パブリックリソースグループおよびカスタムリソースグループはサポートされていません。
DB2 Writer は、データ同期フレームワークを通じて Reader からデータを取得し、
insert into文を使用して DB2 にデータを書き込みます。プライマリキーまたは一意なインデックスの競合が発生した場合、競合する行は書き込まれません。パフォーマンス向上のため、DB2 Writer はPreparedStatement + BatchをrewriteBatchedStatements=trueとともに使用します。データはスレッドコンテキストバッファーにバッファリングされ、バッファーが指定されたしきい値に達したときにのみ書き込みリクエストが送信されます。説明タスクには、少なくとも
insert into権限が必要です。タスク構成時に preSql パラメーターおよび postSql パラメーターで指定する文に応じて、その他の権限も必要になる場合があります。オフライン同期では、ビューからのデータ読み取りがサポートされています。
DB2 AES 暗号化アルゴリズムはサポートされていません。
サポートされるフィールドの型
DB2 Reader および DB2 Writer は、オフライン読み取りおよび書き込み操作において、ほとんどの DB2 データの型をサポートしています。ただし、一部のデータの型はサポートされていません。ご利用のデータの型を慎重に確認することを推奨します。
以下の表に、DB2 Reader および DB2 Writer がサポートする DB2 データの型を示します。
型カテゴリ | DB2 データの型 |
整数型 | SMALLINT |
浮動小数点型 | DECIMAL、REAL、DOUBLE |
文字列型 | CHAR、CHARACTER、VARCHAR、GRAPHIC、VARGRAPHIC、LONG VARCHAR、CLOB、LONG VARGRAPHIC、DBCLOB |
日時型 | DATE、TIME、TIMESTAMP |
ブール型 | なし |
バイナリ型 | BLOB |
データソースの追加
DataWorks で同期タスクを開発する前に、データソース管理の手順に従って、必要なデータソースを DataWorks に追加する必要があります。DataWorks コンソールでパラメーターの説明を確認し、データソース追加時の各パラメーターの意味を理解してください。
データ同期タスクの開発
同期タスクの設定方法および手順については、以下の設定ガイドをご参照ください。
単一テーブル向けオフライン同期タスクの設定ガイド
手順の詳細については、「コードレス UI でのタスク設定」および「コードエディタでのタスク設定」をご参照ください。
コードエディタにおけるすべてのパラメーターおよびスクリプトデモについては、「付録:スクリプトデモおよびパラメーター説明」をご参照ください。
完全データベース向けオフライン読み取り同期タスクの設定ガイド
手順の詳細については、「完全データベース向けリアルタイム同期タスクの設定」をご参照ください。
よくある質問
アクティブ/スタンバイ同期におけるデータ復元の問題
DB2 のアクティブ/スタンバイディザスタリカバリ構成では、セカンダリデータベースが継続的に binlog を使用してプライマリデータベースからデータを復元します。この同期プロセスには本来、時間的な遅延が存在します。特にネットワーク遅延が悪化すると、セカンダリデータベース上のデータがプライマリデータベースの完全かつリアルタイムなミラーにならない可能性があります。これにより、両データベース間に大きなデータ不整合が生じる場合があります。
整合性制約
DB2 は強力な整合性を備えたクエリインターフェイスを提供するリレーショナルデータベース管理システム (RDBMS) です。たとえば、同期タスク実行中に別のデータソースがデータベースにデータを書き込んだ場合でも、DB2 のスナップショット機能により、DB2 Reader は更新されたデータを取得しません。
上記の説明は、シングルスレッドモデルにおける DB2 Reader のデータ同期整合性に適用されます。DB2 Reader は構成に応じてデータを並列で抽出可能です。そのため、厳密なデータ整合性は保証できません。
DB2 Reader が splitPk パラメーターに基づいてデータをパーティション分割する場合、複数の並列タスクを起動してデータを同期します。これらの並列タスクは同一の読み取りトランザクションに属さず、時間間隔によって分離されています。生データに対して、複数の並列タスクが読み取るスナップショットは不完全または不整合となる可能性があります。
マルチスレッド環境における整合性のあるスナップショットを実現する技術的ソリューションは存在しません。この問題はエンジニアリング的観点からのみ対処可能であり、トレードオフを伴います。要件に応じて、以下のソリューションを検討してください。
シングルスレッド同期を使用します。このモードではデータはパーティション分割されません。欠点は同期速度が遅くなりますが、データ整合性は十分に維持されます。
ソースデータが静的であることを保証するために、他のデータライターを無効にします。たとえば、テーブルをロックするか、セカンダリデータベースへの同期を停止します。欠点として、オンラインサービスに影響を与える可能性があります。
データベースエンコーディングの問題
DB2 Reader は Java Database Connectivity (JDBC) を使用してデータを抽出します。JDBC は各種エンコーディングとネイティブ互換性があり、基盤レイヤーでエンコーディング変換を実行します。そのため、DB2 Reader にエンコーディングを明示的に指定する必要はありません。DB2 Reader は自動的にエンコーディングを検出し、トランスコードします。
増分データ同期の方法
DB2 Reader は JDBC SELECT 文を使用してデータを抽出します。そのため、
SELECT…WHERE…を使用して、以下の方法で増分データ抽出を実行できます。オンラインアプリケーションがデータベースにデータを書き込む際に、変更が発生した時刻を示すタイムスタンプを `modify` フィールドに格納します。これには新規データ、更新データ、論理削除データが含まれます。このようなアプリケーションの場合、前回同期時のタイムスタンプを使用する `WHERE` 句を DB2 Reader に設定できます。
新規追加専用データの場合、前回同期時の最大自動インクリメント ID を使用する `WHERE` 句を DB2 Reader に設定できます。
ビジネスロジックで新規データと更新データを区別する特定のフィールドを使用していない場合、DB2 Reader は増分データ同期を実行できません。この場合、完全データ同期のみが可能です。
SQL セキュリティ
DB2 Reader はデータ抽出用の SELECT 文をカスタマイズできる querySql パラメーターを提供します。DB2 Reader は querySql 文に対してセキュリティチェックを一切実行しません。
付録:スクリプトデモおよびパラメーター説明
コードエディタを使用したバッチ同期タスクの設定
コードエディタを使用してバッチ同期タスクを設定する場合は、統一されたスクリプトフォーマット要件に基づき、スクリプト内で関連パラメーターを設定する必要があります。詳細については、「コードエディタでのタスク設定」をご参照ください。以下に、コードエディタを使用してバッチ同期タスクを設定する際にデータソースに対して設定が必要なパラメーターを示します。
Reader スクリプトデモ
{
"type":"job",
"version":"2.0",// バージョン番号。
"steps":[
{
"stepType":"db2",// プラグイン名。
"parameter":{
"password":"",// パスワード。
"jdbcUrl":"",// DB2 データベースの JDBC 接続文字列。
"column":[
"id"
],
"where":"",// フィルター条件。
"splitPk":"",// データパーティション分割に使用するフィールド。
"table":"",// テーブル名。
"username":""// ユーザー名。
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"stream",
"parameter":{},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"// エラーレコード数。
},
"speed":{
"throttle":true,// throttle を false に設定すると、mbps パラメーターは無効になり、レート制限は適用されません。throttle を true に設定すると、レート制限が適用されます。
"concurrent":1, // 並列ジョブ数。
"mbps":"12"// レート制限。1 mbps は 1 MB/s に相当します。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}Reader スクリプトパラメーター
パラメーター | 説明 | 必須 | デフォルト値 |
datasource | データソースの名前。コードエディタはデータソースの追加をサポートしています。このパラメーターの値は、追加済みデータソースの名前と一致している必要があります。 | はい | なし |
jdbcUrl | DB2 データベースの JDBC 接続文字列。JDBC URL は公式 DB2 仕様に準拠している必要があります。形式は | はい | なし |
username | データソースのユーザー名。 | はい | なし |
password | データソースの指定ユーザー名に対応するパスワード。 | はい | なし |
table | データを同期するテーブル。1 つのジョブで同期できるのは 1 つのテーブルのみです。 | はい | なし |
column | 設定済みテーブルから同期するカラム。フィールドは JSON 配列で記述します。デフォルトではすべてのカラムが使用されます。例:[ * ]:
| はい | なし |
splitPk | DB2 Reader がデータを抽出する際、splitPk を指定すると、splitPk で表されるフィールドを使用してデータパーティション分割を実行できます。これにより、データ同期システムは並列タスクを起動して、より効率的にデータを同期します:
| いいえ | "" |
where | フィルター条件。DB2 Reader は、指定された column、table、および where パラメーターに基づいて SQL 文を構築し、その SQL 文に基づいてデータを抽出します。 ビジネスシナリオでは、当日に生成されたデータのみを同期したい場合があります。その場合、where 条件を | いいえ | なし |
querySql | 一部のビジネスシナリオでは、where パラメーターだけではフィルター条件を十分に記述できない場合があります。そのような場合、このパラメーターを使用してフィルター SQL 文をカスタマイズできます。このパラメーターを設定すると、データ同期システムは table パラメーターおよび column パラメーターを無視し、このパラメーターの内容を使用してデータをフィルターします。 たとえば、複数テーブル結合後のデータを同期するには、 | いいえ | なし |
fetchSize | このパラメーターは、データベースサーバーから 1 回のバッチで取得するレコード数を指定します。この値は、データ同期システムとサーバー間のネットワーク通信回数を決定し、データ抽出パフォーマンスを大幅に向上させる可能性があります。 説明 fetchSize の値が大きすぎると(>2048)、データ同期プロセスでメモリ不足 (OOM) エラーが発生する可能性があります。 | いいえ | 1024 |
Writer スクリプトデモ
{
"type":"job",
"version":"2.0",// バージョン番号。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"db2",// プラグイン名。
"parameter":{
"postSql":[],// データ同期タスク完了後に実行する SQL 文。
"password":"",// パスワード。
"jdbcUrl":"jdbc:db2://ip:port/database",// DB2 データベースの JDBC 接続文字列。
"column":[
"id"
],
"batchSize":1024,// 1 回のバッチで送信するレコード数。
"table":"",// テーブル名。
"username":"",// ユーザー名。
"preSql":[]// データ同期タスク開始前に実行する SQL 文。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"// エラーレコード数。
},
"speed":{
"throttle":true,// throttle を false に設定すると、mbps パラメーターは無効になり、レート制限は適用されません。throttle を true に設定すると、レート制限が適用されます。
"concurrent":1, // 並列ジョブ数。
"mbps":"12"// レート制限。1 mbps は 1 MB/s に相当します。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}Writer スクリプトパラメーター
パラメーター | 説明 | 必須 | デフォルト値 |
jdbcUrl | DB2 データベースの JDBC 接続文字列。JDBC URL は公式 DB2 仕様に準拠している必要があります。形式は jdbc:db2://ip:port/database です。接続添付コントロール情報を追加することも可能です。 | はい | なし |
username | データソースのユーザー名。 | はい | なし |
password | データソースの指定ユーザー名に対応するパスワード。 | はい | なし |
table | データを同期する先のテーブル。 | はい | なし |
column | データを書き込む宛先テーブルのフィールド。フィールドはカンマ (,) で区切ります。例:"column": ["id", "name", "age"]。すべてのカラムに順番に書き込むには、アスタリスク (*) を使用します。例:"column": ["*"] 。 | はい | なし |
preSql | データ同期タスク開始前に実行する SQL 文。現在、1 つの SQL 文のみを実行できます。たとえば、古いデータを消去するために使用できます。 | いいえ | なし |
postSql | データ同期タスク完了後に実行する SQL 文。コードレス UI では 1 つの SQL 文のみが許可されています。コードエディタでは複数の SQL 文がサポートされています。たとえば、タイムスタンプを追加するために使用できます。 | いいえ | なし |
batchSize | 1 回のバッチで送信するレコード数。この値を適切に設定することで、データ同期システムと Db2 間のネットワーク通信回数を大幅に削減し、全体的なスループットを向上させることができます。この値を過度に高く設定すると、データ同期プロセスで OOM エラーが発生する可能性があります。 | いいえ | 1024 |