ビッグデータ市場の成長に伴い、従来のリレーショナルデータベース管理システム(RDBMS)は、オンライン分析処理(OLAP)シナリオのニーズを満たすことができなくなっています。このトピックでは、OracleデータベースからAlibaba Cloudのビッグデータ処理プラットフォームであるDataHubにデータをリアルタイムで同期する方法について説明します。その後、OGG(Oracle GoldenGate)用DataHubプラグインを使用してデータを分析できます。
OGG
1. 背景情報
ビッグデータ市場の成長に伴い、従来のRDBMSは、OLAPシナリオのニーズを満たすことができなくなっています。このトピックでは、OracleデータベースからAlibaba Cloudのビッグデータ処理プラットフォームであるDataHubにデータをリアルタイムで同期する方法について説明します。その後、OGG(Oracle GoldenGate)用DataHubプラグインを使用してデータを分析できます。
OGGは、異種環境全体でログベースの構造化データレプリケーションを行うためのツールです。プライマリとセカンダリのOracleデータベース間のデータバックアップに使用されます。また、OracleデータベースからIBM Db2やMySQLデータベースなどの他のデータベースにデータを同期するためにも使用されます。次の図は、OGGの論理アーキテクチャを示しています。OGGはソースデータベースとデスティネーションデータベースにデプロイされ、データポンプ、マネージャー、抽出、コレクター、レプリケーションのプロセスが含まれます。

マネージャープロセス: OGGの制御プロセスです。ソースデータベースとデスティネーションデータベースの両方に、1つだけマネージャープロセスがあります。マネージャープロセスは、他のプロセスを開始、停止、および監視するために使用されます。
抽出プロセス: ソースデータベースのテーブルまたはトランザクションログからデータを抽出するプロセスです。初期データロードと増分データ同期の両方に抽出プロセスを設定できます。初期データロードの場合、抽出プロセスはソーステーブルからターゲットデータベースにデータを直接同期します。ソースデータをデスティネーションデータベースと同期させておくために、抽出プロセスは初期データロード後に増分データ操作言語(DML)およびデータ定義言語(DDL)操作をキャプチャします。このトピックでは、増分データ同期について説明します。
データポンププロセス: 抽出プロセスは、キャプチャされたすべての操作をソースデータベースのトレイルファイルに書き込みます。データポンププロセスは、ソースデータベースのトレイルファイルを読み取り、ネットワーク経由でデスティネーションデータベースのリモートトレイルファイルにデータ操作を送信します。
コレクタープロセス: デスティネーションデータベースのプロセスです。ソースデータベースからデータを受信し、トレイルファイルを生成します。
レプリケーションプロセス: デスティネーションデータベースのトレイルファイルを読み取り、DMLまたはDDL操作を再構築し、デスティネーションデータベースに適用するプロセスです。
このトピックで説明するプラグインは、レプリケーションプロセスとして機能します。OGGは、トレイルファイルを分析することにより、更新されたデータをDataHubに適用するレプリケーション機能を提供します。DataHubのデータは、Realtime Computeを使用してリアルタイムで処理でき、オフラインデータ処理のためにMaxComputeに保存できます。OGG用DataHubプラグインの現在のバージョンは 2.0.8 です。このトピックの最後にある最新バージョンのパッケージをダウンロードするか、GitHub からソースコードをダウンロードできます。
2. サポートされているデータベースバージョン
データベース | サポートされているバージョン | プラグインバージョン |
Oracle | 11g~19c | 2.0.2~2.0.8 |
MySQL | Enterprise EditionおよびCommunity Edition | 2.0.3~2.0.8 |
3. シナリオ
次の例では、OGG用DataHubプラグインの使用方法について説明します。ソースOracleテーブルには、販売注文に関する情報が保存されています。テーブルには3つのフィールドが含まれています。フィールド名はoid、pid、numで、それぞれ注文ID、商品ID、商品数量を示します。これらのフィールドのデータ型はすべてINTです。増分データ同期を実行する前に、DataXを使用して、ソーステーブルからMaxComputeに既存のデータを同期します。増分データを同期するには、次の手順を実行します。(1) DataHubにトピックを作成し、トピックのスキーマを(string record_id, string optype, string readtime, bigint oid_before, bigint oid_after, bigint pid_before, bigint pid_after, bigint num_before, bigint num_after)に設定します。(2) OGG用DataHubプラグインをインストールして設定し、次のパラメーターを指定してフィールドマッピングを設定します。
<ctypeColumn>optype</ctypeColumn>
<ctimeColumn>readtime</ctimeColumn>
<cidColumn>record_id</cidColumn>
<columnMapping>
<column src="oid" dest="oid_after" destOld="oid_before" isShardColumn="true"/>
<column src="pid" dest="pid_after" destOld="pid_before"/>
<column src="num" dest="num_after" destOld="num_before"/>
</columnMapping>optypeパラメーターは、データ更新のタイプを示します。 optypeパラメーターの有効な値は、挿入、削除、更新操作を表すI、D、Uです。 readtimeパラメーターは、データ更新の時刻を示します。(3) プラグインが正しく実行されると、データの更新がソーステーブルからDataHubに同期されます。たとえば、ソーステーブルにレコード(1,2,1)を挿入すると、DataHubは次のレコードを受信します。
+--------+------------+------------+------------+------------+------------+------------+------------+------------+
| record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
+-------+------------+------------+------------+------------+------------+------------+------------+------------+
| 14810373343020000 | I | 2016-12-06 15:15:28.000141 | NULL | 1 | NULL | 2 | NULL | 1 |レコードの値を変更する場合、たとえば、numフィールドの値を20に変更すると、DataHubは元の値と更新された値の両方を含む次の更新されたレコードを受信します。
+-------+------------+------------+------------+------------+------------+------------+------------+------------+
| record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
+--------+------------+------------+------------+------------+------------+------------+------------+------------+
| 14810373343080000 | U | 2016-12-06 15:15:58.000253 | 1 | 1 | 2 | 2 | 1 | 20 |(4) ソースデータベースでOracle GoldenGate Software Command Interface(GGSCI)を起動します。GGSCIで、stats dhextコマンドを実行して、各テーブルの操作統計をクエリします。デスティネーションデータベースでコマンドを実行して、ソースデータベースとデスティネーションデータベースの操作統計が同じかどうかを確認することもできます。
リアルタイム分析
Realtime Computeを使用して、オフライン分析によって生成された前日のデータを集計できます。たとえば、販売注文の総数と各商品の販売量に関する情報をリアルタイムで取得できます。受信データの変更ごとに、変更された値を識別し、統計をリアルタイムで更新できます。
オフライン分析
オフライン分析を容易にするために、DataHubデータをMaxComputeに保存できます。次のコマンドを実行して、MaxComputeに指定されたスキーマでテーブルを作成します。
create table orders_log(record_id string, optype string, readtime string, oid_before bigint, oid_after bigint, pid_before bigint, pid_after bigint, num_before bigint, num_after bigint);MaxComputeにデータを同期するためにDataConnectorを作成します。詳細については、「MaxComputeへのデータの同期」をご参照ください。DataHubに流れ込むデータは、自動的にMaxComputeに同期されます。MaxComputeに同期されたデータは、データが同期された時刻に基づいて異なるパーティションに保存することをお勧めします。たとえば、毎日の増分データは独立したパーティションに保存されます。このようにして、1日のデータ同期が完了すると、対応するパーティションに保存されているデータを同じ日に処理できます。その日の増分データを最新の完全データとマージできます。その後、最終的な完全データが取得されます。説明を簡単にするために、次の例ではパーティションは考慮されていません。この例では、2016年12月6日に生成された増分データが使用されます。前日の完全データはorders_baseテーブルに保存され、DataHubから同期された増分データはorders_logテーブルに保存されます。2つのテーブルをマージすると、最終的な完全データはorders_resultテーブルに書き込まれます。MaxComputeで次のSQLステートメントを実行して、上記の操作を実行します。
INSERT OVERWRITE TABLE orders_result
SELECT t.oid, t.pid, t.num
FROM
(
SELECT oid, pid, num, '0' x_record_id, 1 AS x_optype
FROM
orders_base
UNION ALL
SELECT decode(optype,'D',oid_before,oid_after) AS oid
, decode(optype,'D', pid_before,pid_after) AS pid
, num_after AS num
, record_id x_record_id
, decode(optype, 'D', 0, 1) AS x_optype
FROM
orders_log
) t
JOIN
(
SELECT
oid
, pid
, max(record_id) x_max_modified
FROM
(
SELECT
oid
, pid
, '0' record_id
FROM
orders_base UNION ALL SELECT
decode(optype,'D',oid_before,oid_after) AS oid
, decode(optype,'D', pid_before,pid_after) AS pid
, record_id
FROM
orders_log ) g
GROUP BY oid , pid
) s
ON
t.oid = s.oid AND t.pid = s.pid AND t.x_record_id = s.x_max_modified AND t.x_optype <> 0;4. パラメーター
configure
パラメーター | デフォルト値 | 必須 | 説明 |
batchSize | 1000 | いいえ | 一度にDataHubに書き込むことができるレコードの最大数。 |
batchTimeoutMs | 5000 | いいえ | 新しいフラッシュがトリガーされるまでの最大待機時間。最小値:1000。単位:ミリ秒。 |
dirtyDataContinue | false | いいえ | ダーティレコードを無視するかどうかを指定します。 |
dirtyDataFile | datahub_ogg_plugin.dirty | いいえ | ダーティレコードを保存するファイルの名前。 |
dirtyDataFileMaxSize | 500 | いいえ | ダーティレコードを保存するファイルの最大サイズ。単位:MB。 |
retryTimes | -1 | いいえ | 許可される最大再試行回数。 -1は無限の再試行を示します。 0は再試行なしを示します。 0より大きい値は、指定された回数の再試行を示します。 |
retryInterval | 3000 | いいえ | 2回連続する再試行の間隔。単位:ミリ秒。 |
disableCheckPointFile | false | いいえ | チェックポイントファイルの作成を禁止するかどうかを指定します。 |
checkPointFileName | datahub_ogg_plugin.chk | いいえ | アダプタープロセスのチェックポイントファイル名。 |
storageCtimeColumnAsTimestamp(非推奨) | false | いいえ | このパラメーターは非推奨です。時間値はDataHubの対応するフィールドタイプに変換されます。元の時間値がTIMESTAMPタイプの場合、値はマイクロ秒単位のタイムスタンプに変換されます。元の時間値がSTRINGタイプの場合、値はyyyy-MM-dd HH:mm:ss.SSSSSS形式の文字列に変換されます。 |
charset | UTF-8 | いいえ | Oracleのデータベース文字セット。ほとんどの場合、文字化けが発生しない限り、このパラメーターを設定する必要はありません。 |
commitFlush | true | いいえ | コミットされていないトランザクションをストレージに書き込むかどうかを指定します。このパラメーターをtrueに設定すると、データ損失を防ぐことができますが、全体的な実行パフォーマンスに影響します。パフォーマンスのボトルネックが発生しない限り、このパラメーターをtrueに設定してください。 |
reportMetric | false | いいえ | メトリックを報告するかどうかを指定します。 |
reportMetricIntervalMs | 5 60 1000 | いいえ | メトリックが報告される間隔。時間は、各レポート後に再計算されます。単位:ミリ秒。 |
buildCorePollSize | 設定されたテーブルの数 | いいえ | データ解析用スレッドプールの最小スレッド数。 |
buildMaximumPoolSize | buildCorePollSizeパラメーターの2倍の値 | いいえ | データ解析用スレッドプールの最大スレッド数。 |
writeCorePollSize | 設定されたテーブルの数 | いいえ | DataHubにデータを書き込むためのスレッドプールの最小スレッド数。 |
writeMaximumPoolSize | 設定されたテーブルの数 | いいえ | DataHubにデータを書き込むためのスレッドプールの最大スレッド数。 |
defaultOracleConfigure
パラメーター | デフォルト値 | 必須 | 説明 |
sid | - | はい | Oracleデータベースのシステム識別子(SID)。 |
schema | - | はい | Oracleデータベースのスキーマ。 |
dateFormat(非推奨) | yyyy-MM-dd HH:mm:ss | いいえ | タイムスタンプが変換される形式。 |
defaultDatahubConfigure
パラメーター | デフォルト値 | 必須 | 説明 |
endPoint | - | はい | DataHubのエンドポイント。 |
project | - | はい | DataHubプロジェクトの名前。 |
accessId | - | はい | DataHubにアクセスするために使用されるAccessKey ID。 |
accessKey | - | はい | DataHubにアクセスするために使用されるAccessKeyシークレット。 |
compressType | - | いいえ | データ圧縮形式。有効な値:DEFLATEおよびLZ4。デフォルトでは、データは圧縮されません。 |
enablePb | false | いいえ | データ転送にProtocol Buffers(Protobuf)を有効にするかどうかを指定します。 |
ctypeColumn | - | いいえ | データ更新タイプを示すDataHubのフィールド。この設定は、マッピングのctypeColumnパラメーターで上書きできます。値はSTRINGタイプである必要があります。 |
ctimeColumn | - | いいえ | データの挿入、更新、または削除操作が実行された時刻を示すDataHubのフィールド。この設定は、マッピングのctimeColumnパラメーターで上書きできます。値はSTRINGまたはTIMESTAMPタイプである必要があります。 |
cidColumn | - | いいえ | 更新されたレコードのシーケンス番号を示すDataHubのフィールド。この設定は、マッピングのcidColumnパラメーターで上書きできます。シーケンス番号は、レコードが更新されるにつれて増加します。複数のシーケンス番号は連続していない場合があります。値はSTRINGタイプである必要があります。 |
constColumnMap | - | いいえ | 各レコードに指定された単一の定数値を含む追加フィールド。このフィールドの異なるレコードに指定された値は、c1 = xxx、c2 = xxxのようにコンマ(、)で区切られます。この設定は、マッピングのconstColumnMapパラメーターで上書きできます。このフィールドは、ソースデータベースのデータ更新時刻を示します。次の表に、このフィールドで使用できるパラメーターを示します。 |
constColumnMap
値 | 説明 |
%t | 1970年1月1日木曜日00:00:00以降に経過したミリ秒数を示すUNIXタイムスタンプ。 |
%a | 曜日の名前の省略形。例:月。 |
%A | 曜日のフルネーム。例:月曜日。 |
%b | 月の名前の省略形。例:1月。 |
%B | 月のフルネーム。例:1月。 |
%c | 日付と時刻。例:2005年3月3日木曜日23:05:25。 |
%d | 月の日付。例:01。 |
%D | 日付。例:05/09/20。 |
%H | 24時間制の時。有効な値:00~23。 |
%I | 12時間制の時。有効な値:01~12。 |
%j | 年の通算日。有効な値:001~366。 |
%k | 24時間制の時。有効な値:0~23。 |
%m | 月。有効な値:01~12。 |
%M | 分。有効な値:00~59。 |
%p | 現在の日付の期間。有効な値:amおよびpm。 |
%s | 1970年1月1日木曜日00:00:00以降に経過した秒数を示すUNIXタイムスタンプ。 |
%S | 秒。有効な値:00~59。 |
%y | 年の下2桁。有効な値:00~99。 |
%Y | 年。例:2010。 |
%z | タイムゾーン。例:UTC + 8。 |
MaxComputeにデータを同期した日付をパーティションフィールドの値として使用するには、<constColumnMap>ds=%Y%m%d</constColumnMap>パラメーター設定を追加します。20200509などのパラメーター値は、DataHubのdsフィールドに書き込まれます。
mapping
パラメーター | デフォルト値 | 必須 | 説明 |
oracleSchema | - | いいえ | このパラメーターを設定しない場合、defaultOracleConfigureパラメーターで指定されたスキーマが使用されます。 |
oracleTable | - | はい | Oracleテーブルの名前。 |
datahubProject | - | いいえ | このパラメーターを設定しない場合、defaultDatahubConfigureパラメーターで指定されたプロジェクトが使用されます。 |
datahubAccessId(非推奨) | - | いいえ | このパラメーターは非推奨です。デフォルトでは、defaultDatahubConfigureパラメーターで指定されたAccessKey IDが使用されます。 |
datahubAccessKey(非推奨) | - | いいえ | このパラメーターは非推奨です。デフォルトでは、defaultDatahubConfigureパラメーターで指定されたAccessKeyシークレットが使用されます。 |
datahubTopic | - | はい | DataHubトピックの名前。 |
shardId(非推奨) | - | いいえ | シャードのID。このパラメーターを設定すると、シャードIDは自動的に更新されません。例:0,1,2。 |
rowIdColumn | - | いいえ | レコードのIDを示すDataHubのフィールド。値はSTRINGタイプである必要があります。このパラメーターは、ソースOracleテーブルに主キーがない場合に使用されます。 |
ctypeColumn | - | いいえ | このパラメーターは、defaultDatahubConfigureのctypeColumnパラメーターと同じです。 |
ctimeColumn | - | いいえ | このパラメーターは、defaultDatahubConfigureのctimeColumnパラメーターと同じです。 |
cidColumn | - | いいえ | このパラメーターは、defaultDatahubConfigureのcidColumnパラメーターと同じです。 |
constColumnMap | - | いいえ | このパラメーターは、defaultDatahubConfigureのconstColumnMapパラメーターと同じです。 |
columnMappingのパラメーター
パラメーター | デフォルト値 | 必須 | 説明 |
src | - | はい | Oracleテーブルのフィールド名。 |
dest | - | はい | DataHubトピックのフィールド名。 |
destOld | - | いいえ | データがDataHubトピックに送信される前のデータを記録するフィールドの名前。 |
isShardColumn | false | いいえ | ハッシュキー値に基づいてシャードIDを生成するかどうかを指定します。 |
isKeyColumn | false | いいえ | 変更後の値がNULLであるが、変更前の値がNULLでない場合、変更前のこのパラメーターの値をdestパラメーターに対応するDataHubフィールドに書き込むかどうかを指定します。 |
isDateFormat | true | いいえ | 時間値をdateFormatパラメーターで指定された形式に変換するかどうかを指定します。このパラメーターは、対応するDataHubフィールドがTIMESTAMPタイプの場合にのみ有効です。Oracleのフィールドのデータ型がDATEまたはTIMESTAMPの場合、このパラメーターを設定する必要はありません。このパラメーターをfalseに設定すると、ソースデータはLONGタイプである必要があります。 |
dateFormat | yyyy-MM-dd HH:mm:ss[.fffffffff] | いいえ | 時間値が変換される日付形式。ほとんどの場合、値がデフォルトの形式に準拠していない場合を除き、このパラメーターを設定する必要はありません。 |
isDefaultCharset | true | いいえ | Oracleのデフォルトの文字セットを使用するかどうかを指定します。ほとんどの場合、文字化けが発生しない限り、このパラメーターを設定する必要はありません。最初に文字セットを設定してから、文字化けが発生しているフィールドに対してこのパラメーターをfalseに設定する必要があります。 |
5. よくある質問
トラブルシューティング用のファイル:
datahub-ogg-plugin.log: DataHubプラグインのログ。ほとんどの問題は、このようなログに報告されたエラーを確認することで解決できます。このタイプのログは、プラグインディレクトリのlogサブディレクトリに保存されます。
ggserr.log:監視ログ。ほとんどの場合、ogg / adapterディレクトリの監視ログでユーザー操作と起動状態を確認できます。抽出プロセスの無効な設定や特定のダイナミックリンクライブラリ(DDL)の欠落などの報告されたエラーは、監視ログに記録されます。
dirrpt:プロセスレポートファイル。 VIEW REPORTコマンドを実行して、プロセスレポートファイルのエラー情報を表示します。 ggserr.logとプラグインログファイルの両方にエラーが報告されずにデータがデスティネーションデータベースに送信される場合、このファイルに記録されたエラー情報が見つかる可能性があります。
dirchk: OGGのプロセスのチェックポイント情報を保存するログファイル。
datahub_ogg_plugin.chk: DataHubプラグインのチェックポイント情報を保存するログファイル。
Q:DataHubにデータを書き込めない場合はどうすればよいですか?
A:プロセス全体を確認してください。
dirdatファイルにソースデータベースから読み取られたデータが保存されているかどうかを確認します。そうでない場合、原因はソースデータベースの抽出プロセスにあります。
dirdatファイルにデスティネーションデータベースに複製されたデータが保存されているかどうかを確認します。そうでない場合、原因はソースデータベースのデータポンププロセスにあります。
プラグインのログファイルを表示して、データがチェックポイントによってスキップされたか、プラグインでエラーが発生したかどうかを確認します。これらが最も一般的な原因です。
データがデスティネーションデータベースに送信され、プラグインのログファイルにエラーが記録されていない場合は、dirrptサブディレクトリのログファイルを確認します。デスティネーションデータベースに作成されたチェックポイントによってデータがスキップされる可能性があります。
Oracleスキーマが正しく設定されているかどうかを確認します。 Oracleスキーマがソースデータベースのスキーマと一致しないため、データがスキップされる可能性があります。
Q:レコードIDをクエリできないが、他のフィールドは返される場合はどうすればよいですか?
A:ほとんどの場合、この問題は設定エラーが原因である可能性があります。設定を注意深く確認する必要があります。
プラグインのバージョンを確認します。バージョン2.0.3以降でのみ、レコードIDをクエリできます。
ソースデータベースの抽出プロセスのトークンが、
TABLE OGG_TEST。*、tokens(TKN-ROWID = @ GETENV('RECORD'、'rowid'));という構文で正しく設定されているかどうかを確認します。たとえば、TKN-ROWIDを誤ってTKN_ROWIDと入力すると、クエリ要求は失敗します。宛先データベースの configure.xml ファイルで
<rowIdColumn></rowIdColumn>が構成されているかどうかを確認します。次の図に示すように、Logdumpコマンドを実行して、レコードIDを取得できるかどうかを確認します。

Q:TKN-ROWIDのトークン句でエラーが発生した場合はどうすればよいですか?
エラーメッセージ:
2020-01-17 16:17:17 INFO OGG-06509 Oracle GoldenGate Capture for Oracle, dhext.prm: ソーステーブルOGG_TEST.ORDERSに次のキー列を使用しています:OID。
2020-01-17 16:17:17 INFO OGG-01298 Oracle GoldenGate Capture for Oracle, dhext.prm: 列関数診断メッセージ:「RECORD」列が見つかりません。
2020-01-17 16:17:17 ERROR OGG-00369 Oracle GoldenGate Capture for Oracle, dhext.prm: TKN-ROWIDのトークン句でエラーが発生しました。
2020-01-17 16:17:17 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, dhext.prm: プロセスが異常終了しています。A:トークン構文TABLE OGG_TEST。*、tokens(TKN-ROWID = @ GETENV('RECORD'、'rowid'));を使用しても行IDを取得できない場合は、次の方法を使用して問題のトラブルシューティングを行います。
プラグインのバージョンを確認します。バージョン2.0.3以降でのみ、行IDをクエリできます。
OGGが提供する公式サンプルでトークン構文を確認します。
構文が一貫している場合は、
@ GETENV('RECORD'、'rowid'))部分の一重引用符(')を二重引用符(")に変更します。マネージャープロセスを再起動します。
Q:「dsOperation.getPosition():xxxxxxx古いsendPositionはxxxxxです。この操作をスキップします。重複している可能性があります。」というエラーが返されるのはなぜですか?
A:ほとんどの場合、この問題は、ソースデータベースでプロセスが再起動するために発生します。このエラーは、DataHubプラグインのチェックポイントが重複していることを示しています。システムはしばしば誤って重複を識別します。さらに、OGGのチェックポイントは、アプリケーションの通常の動作には十分です。 DataHubプラグインでチェックポイントファイルの作成を回避するために、disableCheckPointFileをtrueに設定できます。今後のバージョンでは、DataHubプラグインのチェックポイントは使用されなくなります。
Q:ログエラー「操作を作成できません:com.goldengate.atg.datasource.ConcurrentTransactionException:同じソーストランザクションに対して複数の「トランザクション開始」操作が受信されました。現在のトランザクション開始位置:xxx(xxx);現在のトレイル位置:xxx」が表示されるのはなぜですか?
A:ソースデータベースのトランザクションが競合しています。ソースOracleデータベースに問題がないか確認してください。
Q:データがDataHubに送信された後、8時間の遅延が発生するのはなぜですか?
A:javaue.propertiesファイルでgoldengate.userexit.timestampパラメーターをUTC + 8に設定してから、DataHub Writerを再起動します。
Q:DataHubプラグインがデータを解析した後、特定のフィールドが空のままになるのはなぜですか?
A:SET DEBUGコマンドを実行して、OGGでデバッグモードを有効にします。報告された完全データがソースデータベースのデータと一致するかどうかを確認します。
報告されたデータがソースデータと一致する場合、問題はcolumnMappingパラメーターの設定が正しくないことが原因である可能性があります。
報告されたデータがソースデータと一致しない場合は、抽出プロセスからの結果データを確認します。詳細については、「Logdumpユーティリティの使用」をご参照ください。ログファイル内の特定のREDOブロックアドレス(RBA)をクエリできます。
Q:OGG 12.3を使用しているときに、ソースデータベースのトレイルファイルで解析エラーが発生した場合はどうすればよいですか?
A:OGG 12.2をインストールするか、デスティネーションデータベースの抽出プロセスの設定でRMTTRAIL ./dirdat/stをRMTTRAIL ./dirdat/st format RELEASE 12.2に変更することをお勧めします。
Q:「java.lang.NumberFormatException:入力文字列:xxxx」というエラーが返されるのはなぜですか?
A:OracleとDataHub間のマッピングを確認します。詳細については、「OracleとDataHubのデータ型間のマッピング」を参照してください。たとえば、OracleのSTRINGタイプのdestOldパラメーターの値をDataHubのBIGINTタイプの値に変換すると、マッピングは無効になります。
Q:「String index out of range:10」というエラーが返されるのはなぜですか?
エラーメッセージ:
2020-01-14 10:03:24 [main] ERROR OperationHandler - ダーティデータ:WF_YN_07.CJ_GLQX202001への挿入[B] [列:27] [位置:00000007260404799638(seqno = 726、rba = 404799638)] [時間:2020-01-14 08:49:43.883741]
java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外です:10
at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:407)
at java.lang.StringBuilder.setCharAt(StringBuilder.java:76)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.convertStrToMicroseconds(RecordBuilder.java:272)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.setTupleData(RecordBuilder.java:242)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildTupleRecord(RecordBuilder.java:172)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildRecord(RecordBuilder.java:82)
at com.aliyun.odps.ogg.handler.datahub.operations.OperationHandler.processOperation(OperationHandler.java:50)
at com.aliyun.odps.ogg.handler.datahub.operations.InsertOperationHandler.process(InsertOperationHandler.java:31)
at com.aliyun.odps.ogg.handler.datahub.DatahubHandler.operationAdded(DatahubHandler.java:108)
at oracle.goldengate.datasource.DsEventManager $ 3.send(DsEventManager.java:439)
at oracle.goldengate.datasource.DsEventManager $ EventDispatcher.distributeEvent(DsEventManager.java:231)
at oracle.goldengate.datasource.DsEventManager.fireOperationAdded(DsEventManager.java:447)
at oracle.goldengate.datasource.AbstractDataSource.fireOperationAdded(AbstractDataSource.java:464)
at oracle.goldengate.datasource.UserExitDataSource.addOperationToTransactionAndFireEvent(UserExitDataSource.java:1337)
at oracle.goldengate.datasource.UserExitDataSource.createOperation(UserExitDataSource.java:1305)
at oracle.goldengate.datasource.UserExitDataSource.createOperation(UserExitDataSource.java:1046)A:デフォルトでは、Oracleからマッピングされた時間値はDATEまたはTIMESTAMPタイプです。値は、DataHubの2020-01-10:10:00:00などの日付と時刻の文字列として変換されます。したがって、デフォルトの形式ではない時間値を渡すと、エラーが発生します。この問題を解決するには、日付形式です columnMapping で parameter を false に設定します。
Q:更新前の値を取得できない場合はどうすればよいですか?
A:ソースデータベースでGETUPDATEBEFORESパラメーターが設定されているかどうかを確認します。
Q:ソーステーブルに主キーがあるのに、更新された値が空なのはなぜですか?
A:次のシナリオでは、ソーステーブルに主キーがある場合とない場合の更新操作を取得するためのさまざまな操作について説明します。
主キーがないテーブルの場合、フィールドの値がAからBに更新されると、更新操作は
"B" [before="A"]になります。フィールドが更新されず、値がCの場合、更新操作は"C" [before="C"]になります。主キーがあるテーブルの場合、フィールドの値がAからBに更新されると、更新された操作は
"B" [before="A"]になります。フィールドが更新されず、値がCの場合、更新された操作は"" [before="C"]になります。解決策1:たとえば、テーブルにA、B、Cの3つのフィールドがあるとします。フィールドAは主キーとして設定されています。フィールドBが更新されない場合、フィールドBの更新された値は空のままになります。フィールドBを元の値と同じ値に設定する場合は、ソースデータベースの抽出プロセスで
TABLE OGG_TEST。*、keycols(a、b);を指定します。解決策2:columnMapでisKeyColumnパラメーターを指定します。例:
<column src="b" dest="b" destOld="b_old" isKeyColumn="true"/>。
Q:「Unsupported major.minor version 52.0」というエラーが返される場合はどうすればよいですか?
エラーメッセージ:
2019-12-23 18:03:58 [main] ERROR UserExitMain - java.lang.UnsupportedClassVersionError:com / aliyun / datahub / client / model / RecordSchema:サポートされていないメジャー.マイナーバージョン52.0
java.lang.UnsupportedClassVersionError:com / aliyun / datahub / client / model / RecordSchema:サポートされていないメジャー.マイナーバージョン52.0
at oracle.goldengate.datasource.DataSourceLauncher。<init>(DataSourceLauncher.java:161)
at oracle.goldengate.datasource.UserExitMain.main(UserExitMain.java:108)
原因:org.springframework.beans.factory.BeanDefinitionStoreException:ファクトリメソッド[public final oracle.goldengate.datasource.GGDataSource oracle.goldengate.datasource.factory.DataSourceFactory.getDataSource()]が例外をスローしました。ネストされた例外はjava.lang.UnsupportedClassVersionErrorです:com / aliyun / datahub / client / model / RecordSchema:サポートされていないメジャー.マイナーバージョン52.0
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570)
... 11その他
原因:java.lang.UnsupportedClassVersionError:com / aliyun / datahub / client / model / RecordSchema:サポートされていないメジャー.マイナーバージョン52.0A:インストールしたJava Development Kit(JDK)バージョンが環境要件を満たしていないため、エラーが発生します。 JDKバージョン1.8をダウンロードしてインストールするか、GitHubからソースコードをダウンロードしてJARパッケージをコンパイルすることをお勧めします。
Q:「モジュール./libggjava_ue.soを開けません-libjsig.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません」というエラーが返される場合はどうすればよいですか?
A:OGGバージョン、クエリするファイル、および環境変数を確認します。マネージャープロセスまたはマシンを再起動してみてください。マシンを再起動することで問題は解決する可能性がありますが、この解決策は推奨されません。
Q:「OGG-00425テーブルxxx.xxxの定義を取得するためのDBログインが確立されていません」というエラーが返される場合はどうすればよいですか?
A:ソース定義ファイルを再生成し、ファイルをデスティネーションデータベースに複製します。
Q:「defaultDatahubConfigureはnullです」というエラーが返されるのはなぜですか?
エラーメッセージ:
2020-01-17 17:28:32 [main] ERROR DatahubHandler - 初期化エラー
java.lang.RuntimeException:defaultDatahubConfigureはnullです
at com.aliyun.odps.ogg.handler.datahub.ConfigureReader.reader(ConfigureReader.java:117)A:プラグインV2.0.3でスペルミスが修正されました。プラグインV2.0.2に固執する場合は、構成ファイルのパラメーター名をdefalutDatahubConfigureからdefaultDatahubConfigureに変更します。
Q:デスティネーションデータベースで「OGG-00425 Oracle GoldenGateコレクター:ホスト名localhostをインターネットアドレスに変換できませんでした」というエラーが返される場合はどうすればよいですか?
A:デスティネーションデータベースの/ etc / hostsファイルでホスト名localhostにマップされているIPアドレスをリセットします。
Q:JVMが共有ライブラリ(.so)をロードできない場合はどうすればよいですか?
A:共有ライブラリのパスをLD_LIBRARY_PATH環境変数に追加してから、マネージャープロセスを再起動します。例:export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$JAVA_HOME/lib/amd64:$JAVA_HOME/lib/amd64/server。
Q:次のシナリオでどうすればよいですか。「2015-06-11 14:01:10 ERROR OGG-01161テーブルOGG_TEST.T_PERSONに指定された列インデックス(5)が無効です。最大列= 5」というエラーが返されます。テーブルにフィールドを追加すると、フラットファイル書き込み用アダプターとJMSアダプターが機能しません。ソースデータベースのOGGには問題が見つかりません。
A:テーブルのスキーマがソースデータベースとデスティネーションデータベースで一致していません。 DEFGEN構成ファイルを作成し、ファイルをデスティネーションデータベースのdirdefディレクトリにコピーする必要があります。次に、レプリケーションプロセスを再起動します。
Q:OGGレポートファイルで「列値の取得中にエラー(4)が発生しました」というエラーが報告されるのはなぜですか?
A:ほとんどの場合、これはOGGがトレイルファイルを解析できないためです。デバッグログを表示して、エラーを報告したRBAを特定し、チェックポイントを調整してRBAをスキップすることで、問題を解決できます。
6. リリースノート
2.0.2
2.0.3
レコードIDは、ソースOracleテーブルから取得できます。
DataHubのDECIMALやTIMESTAMPなどのデータ型がサポートされています。
プラグインV2.0.3でスペルミスが修正されました。プラグインV2.0.2に固執する場合は、構成ファイルのパラメーター名をdefalutDatahubConfigureからdefaultDatahubConfigureに変更します。
Protobufを使用したデータ圧縮とデータ転送がサポートされています。
2.0.4
データベース文字セットを設定できます。この機能により、データがUTF-8でエンコードされていないデータベースの文字化けを防ぐことができます。
2.0.5
パフォーマンスが最適化され、1秒あたりのトランザクション数(TPS)が最大70%増加しました。
ログのメトリックを報告できます。
次の問題が修正されました。constColumnMapパラメーターが取得される時刻が実際の時刻と異なります。
2.0.6
次の問題が修正されました。過剰なスレッドデータが存在します。
次の問題が修正されました。更新された値が空で、ハッシュできません。
DataHubのTINYINT、SMALLINT、INTEGER、FLOATなどのデータ型がサポートされています。
2.0.7
プラグインは、ビッグデータ12.3.2.1用のOGGに適合しており、OGGアプリケーションアダプターはサポートされなくなりました。
2.0.8
プラグインは、ビッグデータ 19.1.0.0 用の OGG に適合しており、OGG アプリケーションアダプターはサポートされなくなりました。