Syniti DR -Oracle
まず更新対象レコードがターゲットに存在しない場合に「Record to update not found in target table」警告が発生し、その後DBMotoは補完INSERTを行います(行わないようにすることも可能です)
しかし Oracle のトランザクションログモードがLog Readerの場合、REDOログから取得できる情報は更新したカラムとPKのみとなります。
このため更新していないカラムはNULLとしてターゲットへのINSERTを行い、結果NOT NULL制約のカラムがあるとエラーになります。
対処方法は以下の2通りです。
1. Oracle のトランザクションログモードを「トリガー」にする(Oracle 10gかつDBMoto v9以降)
2. Oracle に対して以下のクエリを発行し、すべてのカラム情報をREDOログから取得できるようにする。
>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
Syniti DR
本エラーは例えばOracle 11.2のクライアントを使用している場合「oracore11.dll」にて障害が発生した旨Windowsイベントログに記録されている可能性があります。
一部の条件下にて本事象が発生するケースがあり、エラー発生までの流れは以下の通りです。
1. DBMoto から Oracle へ Oracle クライアントで接続するためコネクションをオープンする
2. このオープンしたタイミングで Oracle クライアント側のoracore11.dll というファイル関連で何らかの障害が発生しエラーとなる可能性がある
3. 2に引きずられて DBMoto の Data Replicator が強制終了する
つまり、発生トリガーは1の「Oracle へのコネクションを確立した際」です。
これまで発生事例から Windows のダンプファイルの解析、マイクロソフト社のダンプ解析ツール ADPlus でさらに詳細を解析するなどし下記のことが判明しております。
・エラーは Oracle 側の DLL で発生している
・エラーは .NET Framework の外で発生している
・DBMoto はすべて .NET Framework 内で動作するので本エラーが DBMoto 起因である可能性は極めて低い
(DBMoto が原因の場合は .NET Framework 内でエラー発生する)
・再現するマシンが一部に限られている
回避策としてレプリケーション毎に Oracle への接続をオープンにしないようコネクションプールを有効にする方法がございます。設定手順は以下の通りです。
1. Data Replicator サービスを停止します
2. ターゲットの Oracle 接続を右クリック→「プロパティ」を開きます。
3. 接続 Oracle .NET Driver の右にあるボタンをクリックします。
4. Pooling が False になっているので True へ変更します。
これにより Oracle へのコネクションプーリングが有効となり、
本事象は発生しなくなります。
Syniti DR -Oracle
Oracleからのミラーリング時にはデフォルトでアーカイブログを参照し、またその際にCONTINIOUS_MINEオプションを有効にしています。
一部のOracle環境ではCONTINIOUS_MINEオプションをオンにしているとミラーリングタイミングがバラバラになることがあります。
CONTINIOUS_MINEオプションを外すとこの事象が解消することがあります。
オプションの切り替えにより、レプリケーションの性能劣化やOracleに対する負荷増加が発生することはほとんどありません。
Syniti DR -MySQL
可能です。
ただし、DBMotoではDML文のみレプリケーションするため、パーティションがDDL文で削除されたときはそれを反映できません。
Syniti DR
リフレッシュとミラーリングが可能です。
ミラーリング時の注意点として、DBMotoは差分データの取得にトランザクションログを用いていますが、マテリアライズビューにあるレコードに対するUPDATE操作をOracleが内部で行う際、UPDATEではなくDELETEとINSERTを組み合わせて行っているため、トランザクションログの数が1つではなく、2つになっています。
DBMotoのレコード処理件数表示はトランザクションログをベースにしている都合上、マテリアライズドビューのリフレッシュモードが「完全」の場合は、ビュー上の全レコード数×2、「部分」の場合は、UPDATE対象レコードの数×2の数が、レコード処理件数として表示されます。これはOracle側の仕様によるものです。
Syniti DR -Oracle
OracleとDBMoto間のネットワーク障害によるものです。
Syniti DR -Oracle
●Minimal Level
レプリケーションするテーブルのみ(最低限)にサプリメンタルロギングの設定が行われます。
以下のSQLが実行されます。
・サプリメンタルロギング設定時
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
・レプリケーション作成時
ALTER TABLE テーブル名 ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS
●Database Level
データベース全体(すべてのテーブル)に対してサプリメンタルロギングの設定が行われます。
以下のSQLが実行されます。
・サプリメンタルロギング設定時
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS
Syniti DR -Oracle
OracleのRedoログが1周してDBMotoが参照しに行くIDが既になくなってしまった際に発生するエラーです。
復旧はリフレッシュするか、最新のトランザクションIDを取得する必要があります。
また、このエラーが頻発する場合はRedoログのサイズ設定を見直す必要があります。
Syniti DR -Oracle
以下のサイトからOracleクライアント又はODACをダウンロード可能です。
http://www.oracle.com/technetwork/jp/database/windows/downloads/index.html
また、Oracleデータベースのバージョンに関わらず、ドライバのバージョンは11を使用してください。
Syniti DR -Oracle
対応しておりますが、ミラーリングとシンクロナイゼーションについては、
Log Server経由のみ対応しています。
Syniti DR -Oracle
DBMoto側のOracleクライアントドライバを最新の11gにしてください。Oracle側の既知不具合です。
Syniti DR -Oracle
Redoログを参照します。事前にサプリメンタルロギングの設定が必要ですが、DBMotoから行うことが可能です。