複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】

例えば上記のように複数のAS/400にあるテーブル(物理ファイル)のレコードをOracleの1つのテーブルにレコード統合する場合、ソース・ターゲットのコネクション設定やレプリケーションの定義は通常と同じように作成しますが、注意が必要です。

DBMotoの初期レプリケーションであるリフレッシュは、まず最初にターゲットのレコードを削除(Truncate)するため、AS/400各サーバからリフレッシュを行ってしまうと、その都度Oracleのレコードを削除してしまうため、データの整合性が取れません。

回避策として、リフレッシュ時にレコードを削除しないように設定することが可能です。
レプリケーション定義で「リフレッシュ時にレコードを削除しない」スクリプトを記述します。

以下がそのスクリプトです。
DBMoto Ver 9以前の場合
———-

[vb]
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript
Imports System.Data

Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript

Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean)
CancelTruncate = true
End Sub

End Class
End Namespace
[/vb]

———-

DBMoto Ver 9.5以降の場合
———-

[vb]
Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript

Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean, ByRef Filter As String)
canceltruncate = True
End Sub

End Class
End Namespace
[/vb]


このスクリプトは今回のように複数テーブルからの統合目的以外の場合でも、リフレッシュ時に既にあるレコードを削除したくない場合にももちろん適用できます。

複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

SQL Serverのビューをレプリケーションする場合の注意点【リアルタイムレプリケーションツールDBMoto】

SQL Serverのビューを使用すると、特定のユーザに対して必要なデータだけを提供したり、複数テーブルからの参照を容易にするなど、非常に便利なものです。
ただし、ビューは参照(select)には向いていますが、登録・更新・削除(insert, update, delete)を行う場合は制限があります。

DBMotoでは登録・更新・削除によりレプリケーションを行うため、ビューの制限をクリアしていないとレプリケーションすることができません。

具体的にはベースの参照テーブルが1つの場合で単純にデータをselectするだけのビューであればリフレッシュに限りレプリケーションが可能です。


※図1:参照するテーブルが1つの場合の例。画面はSQL Server Management Studioでのビュー作成画面

しかし、ベースの参照テーブルが複数ある場合や、集計関数や計算を行うようなビューの場合はビューの仕様で更新等が行えません。


※図2:参照するテーブルが2つの場合の例。画面はSQL Server Management Studioでのビュー作成画面

このようなケースでDBMotoでレプリケーションを行おうとすると、以下のようなエラーメッセージがSQL Server側から返されます。

System.Data.SqlClient.SqlException: 変更が複数のベース テーブルに影響するので、ビューまたは関数 ‘xxxxx’ は更新可能ではありません。

 

タグ: ,

レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】

以前ののブログ記事で紹介した「レプリケーションの際にnullを特定の値に変換する方法 その1」は、テーブルのフィールドごとに設定する必要があったため、フィールドの数が多ければ多いほど設定に時間を要するというデメリットがありました。

今回紹介する方法は、同じテーブル内の同じデータタイプであれば、設定を1回で済ますことが可能で、設定に要する時間の短縮化が期待できます。

■スクリプトの準備

以下のスクリプトを準備します。
——————————
[vb]
Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript

Namespace DBRS
Public Class GlobalScript : Inherits IGlobalScript

Public Shared Function SetVAL(obj as Object, obj1 as Object) as Object
If obj is DBNull.Value Then
Return obj1
End if
If obj is nothing Then
Return obj
End if
If String.IsNullOrEmpty(obj.ToString()) = True  Then
Return obj1
Else
Return obj
End If
End Function

End Class

Public Class MappingRule : Inherits IMappingRule

<MappingRuleAttribute("CheckString", "Set function for NON nullable fields")>
Public Function CheckString (ByVal bIsForth As Boolean, ByVal sSourceName As String, ByVal iSourceOrdinal As Integer, ByVal sSourceType As String, ByVal sTargetName As String, ByVal iTargetOrdinal As Integer, ByVal     sTargetType As String, ByRef sExpression As System.Text.StringBuilder) As Boolean

If sSourceName = sTargetName Then
If sSourceType = "VARCHAR2" Then
sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")")
End If
Return True
Else
Return False
End if

End Function

End Class

Public Class GlobalEvents : Inherits IGlobalEvents

End Class
End Namespace
[/vb]
——————————

■マッピング画面でのスクリプト適用

マッピング画面にて「Custom Mapping」から「CheckString」(グローバルスクリプトで設定した関数名)を選択します。

今まで手動で「Map to Expression」を起動する必要があったものが、自動で一括設定されます。

■データタイプが複数ある場合

今までの設定では1つのテーブルに対して1つのデータタイプのみの場合にしか適用できません。複数のデータタイプに対して設定を行う場合、スクリプトにてIf Elseによる条件分岐にて実現できます。例えば以下のように記述します。
——————————
[vb]
If sSourceName = sTargetName Then
If sSourceType = "VARCHAR2" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
Else If sSourceType = "CHAR" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
Else If sSourceType = "NUMBER" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
End If
Return True
Else
Return False
End if
[/vb]
——————————

レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】

片方向レプリケーションで、ソースがNULLを許可するフィールド、ターゲットがNULLを許可しない(NOT NULL)フィールド同士でマッピングしていたとします。

この場合、ソースにNULLデータの更新があるとミラーリングによってターゲットにもNULLデータをレプリケーションしますので、NOT NULL制約違反によりエラーとなってしまいます。

DBMotoではスクリプトとExpression機能を使用することで、特定の値の更新があった際に別の値へ変換することができます。

■スクリプトの準備

以下のスクリプトを使用します。このスクリプトは「NULLもしくは空文字が更新されたときに、特定の値を返す」機能のメソッドです。
————-
Public Shared Function SetVAL(obj as Object, obj1 as Object) as Object
If obj is DBNull.Value Then
Return obj1
End if
If obj is nothing Then
Return obj
End if
If String.IsNullOrEmpty(obj.ToString()) = True  Then
Return obj1
Else
Return obj
End If
End Function

————-

スクリプトを適用するため、metadataを右クリックし、「グローバルスクリプト」を選択します。

グローバルスクリプト内に上記スクリプトを埋め込みます。

■マッピング画面でのスクリプト適用

フィールドマッピング画面にて対象のフィールドの矢印部分を右クリックし、Map To Expressionを選択します。

User Functionからグローバルスクリプトで設定した関数を選択し、第1引数にDBのフィールド名、第2引数に変換したい文字列を設定します。ここでは「”NODATA”」という文字列を設定しました。

以上で設定は完了です。この状態でソースにNULLや空文字の更新があった場合、スクリプトを介してターゲットに対しては「NODATA」という文字列でレプリケーションするようになります。

今回はNULLから特定の値への変換方法について紹介しましたが、もちろんNULL以外のデータからの変換も同様の記述で可能です。

■注意点

今回紹介の方法は、設定するフィールドが少ない場合には最適です。ただし、設定するフィールドが多い場合は、テーブルのフィールドごとに設定する必要がある分、設定に時間を要するというデメリットがありました。
同じテーブル内の同じデータタイプであれば、設定を1回で済ますことが可能で、設定に要する時間の短縮化が期待できます。
方法については以下の記事をご参照ください。
レプリケーションの際にnullを特定の値に変換する方法 その2

レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

Oracle (基幹データベース)とMS Access間でのリアルタイムなデータ・レプリケーション

企業におけるOracleなどの基幹データベースと、エンドユーザで一般的に使用されているMS AccessデータをDBMotoを利用してリアルタイムにレプリケーションできます。

DBMotoはOracle以外の多くのデータベースをサポートしているので基幹データベースはIBM DB2 for i(AS/400), IBM DB2 for z/OS(OS/390), IBM DB2 UDB, SQLServer等のデータベースが利用可能です。

DBMotoのレプリケーション・モードにはリフレッシュ、ミラーリング、シンクロナイゼーションの3種類のモードがあります。MS Accessを使用したレプリケーションはリフレッシュのみに対応しています。

レプリケーション方向は「Oracle <=双方向=> MS Access」、「Oracle ==片方向=> MS Access」、「 MS Access ==片方向=> Oracle」の3種類から選択できます。

タグ: , ,

Oracle/DB2 UDB/SQL Serverの各無償版もサポートしてます【リアルタイムレプリケーションツールDBMoto】

DBMotoは多くのデータベースをサポートしていますが、特に以下の無償版データベースもサポートしています。

・Oracle Express Edition(XE)
・DB2 UDB Express-C
・SQL Server Express Edition

●Oracle Express Edition(XE)は有償版と同様にトランザクションログ(Redo)を参照した差分レプリケーションが可能です。

●DB2 UDB Express-Cは有償版と同様にトランザクションログ(DB2ログ)の参照、又はトリガーテーブルを作成しての差分レプリケーションが可能です。

●SQL Server Express Editionについては、トリガーテーブルを作成しての差分レプリケーションは可能ですが、トランザクションログ(Distributor)を参照した差分レプリケーションには対応しておりません。(SQL Server Express側の制約によるもの)

無償版のデータベースは、有償版と比較して制限事項がいくつがあるので注意が必要ですが、制限事項をクリアできればDBMotoで問題なく異種データベース間のレプリケーションを実現できます。

●対応データベース一覧
//www.climb.co.jp/soft/dbmoto/outline/db.html

Oracle/DB2 UDB/SQL Serverの各無償版もサポートしてます【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

DBMotoマシンではどの程度のディスクサイズを考慮すべきか?【リアルタイムレプリケーションツールDBMoto】

DBMotoは.NET Framework2.0 SP2がインストールされたWindowsマシンで稼働します。インストーラのファイルサイズは約15MBと非常に軽量です。

では、DBMotoを運用するにあたって、ディスクサイズはどの程度を使用するのでしょうか?以下レプリケーションの際に使用するファイルについてまとめておきます。なお。開発元ではディスクサイズの空き容量として5GB以上を推奨しております。

1. 一時キャッシュファイル

DBMotoはレプリケーションの際に一時ファイル(synccache)を作成します。具体的には以下のようにファイルを作成します。

●リフレッシュの場合:
⇒ソースDBのデータをselectクエリでスキャンした結果を一時ファイルとして保存します。ファイルはDBMotoのBlock Size(デフォルト値50レコード)単位で作成されます。
●ミラーリングの場合:
⇒ソースDBのトランザクションログを参照し、新しいトランザクションがあれば結果を取得し一時ファイルとして保存します。


※参考:一時ファイルが作成されたところのイメージ

DBMotoは作成した一時ファイルを元にターゲットDBへレプリケーションするためのSQLを生成し、レプリケーション完了後に一時ファイルは削除されます。あくまで一時的なファイルなので、これによりディスクサイズを大きく圧迫する心配はありません。

2. ログファイル・historyファイル

ログファイルは主にエラー等が感知された場合やレプリケーションの開始終了時に出力され、historyファイルはレプリケーション間隔ごと(デフォルト60秒おき)に何件成功し何件失敗したかを出力します。


※参考:ログファイルの例


※参考:historyファイルの例

ログファイルやhistoryファイルは、デフォルトでは1ファイル最大10MB、ファイル作成数は無制限と設定されていますが変更は可能です。特にファイル作成最大数を設定することで、極端にディスクサイズを占領することを防止できます。


※参考:ログの出力サイズ等は設定変更可能

3. メタデータ(metadata)

DBMotoの設定情報はすべてmetadataとして、デフォルトでDBMotoマシンに保存されます。レプリケーション定義が多ければ多いほどサイズが大きくなりますが、少なくて数KB、多くても数MB程度なので、ディスクサイズへの影響はほとんどないと考えて問題ありません。

DBMotoマシンではどの程度のディスクサイズを考慮すべきか?【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

レプリケーション対象テーブルの選択を容易に【リアルタイムレプリケーションツールDBMoto】

DBMotoの最新版7.1.2.3において、新機能として「レプリケーション対象テーブルの選択をCSVリストから取り込み可能」になりました。

これまでのバージョンでは、下記のイメージ図のように、レプリケーション対象テーブルを選択する場合、一覧表示されるスキーマ名・テーブル名から対象テーブルを1つずつチェックする必要がありました。

最新バージョンでは、予めレプリケーション対象テーブルをCSV形式でリスト化することでこれまでのように1つずつ選択する必要なく、一括で選択できるようになりました。
以下設定手順です。

1. CSV形式で対象テーブルをリスト化します。左からカタログ名・スキーマ名・テーブル名です。カタログが存在しない場合は空文字として設定します。

2. DBMoto接続設定画面の中のテーブル選択画面にて「Import Form File」を選択し、CSVファイルを読み込みます。

3. CSVファイルを読み込むと、CASファイル内にリスト化されているテーブルのみが表示されますので、赤枠の全選択をクリックし、表示されている全テーブルを選択します。

レプリケーション対象テーブルの選択を容易に【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

レプリケーションの設定から処理までの流れ【リアルタイムレプリケーションツールDBMoto】

DBMotoはDBへの接続設定とレプリケーション定義の設定を行い、レプリケーションプロセスを実行することでレプリケーションを行います。ここでは設定の流れについて紹介いたします。

1.ソース(複製元)DBへの接続設定

  • 接続先情報の設定(IPアドレス・ユーザ名・パスワード等)
  • レプリケーション対象テーブルの選択
  • トランザクションログの参照設定

2. ターゲット(複製先)DBへの接続設定

  • 接続先情報の設定(IPアドレス・ユーザ名・パスワード等)
  • レプリケーション対象テーブルの選択
  • トランザクションログの参照設定
  • 必要に応じてテーブルの新規作成

3. レプリケーション定義の設定

  • レプリケーション方式の選択(片方向か双方向か)
  • テーブル・フィールドのマッピング設定
  • スケジュールの設定

※上記1~3の設定情報はすべてメタデータとして管理されます。メタデータは必要に応じてバックアップやリストアすることも可能です。また、メタデータはデフォルトではDBMotoマシンにSQL Server CE形式で保存されますが、リモートのDBに保存することも可能です。

4. レプリケーションプロセスの実行

アプリケーションとして実行することも、Windowsサービスとして実行することも可能です。

5. 初期レプリケーション(リフレッシュ)

  1. ソースDBのテーブルの全レコードを参照してselectでスキャン
  2. insertのSQLを生成し、ターゲットDBのテーブルへ転送

6. 差分レプリケーション(ミラーリング)

  1. ソースDBのトランザクションログを参照して新しいトランザクションを感知
    ⇒デフォルトで60秒周期で確認(変更可能)
  2. insert/update/deleteのSQLを生成し、ターゲットDBのテーブルへ転送
レプリケーションの設定から処理までの流れ【リアルタイムレプリケーションツールDBMoto】 はコメントを受け付けていません -->

ターゲットに存在しないレコードをソースで更新したときは?【リアルタイムレプリケーションツールDBMoto】

何らかの理由でターゲットにはレコードが存在していなくて、ソースのみに存在しているレコードを更新・削除した場合、DBMotoでは以下のような挙動になります。

・更新時 ⇒「ターゲットにレコードがありません」というWarningメッセージをログに出力し、レコードを登録します。
・削除時 ⇒「ターゲットにレコードがありません」というWarningメッセージをログに出力します。

更新時にはレコードを登録する、つまりデータの整合性を復活させるような挙動になります。
もし、勝手にレコードが登録されるのが困るということであれば、設定でOFFにすることも可能です。

以下の部分でチェックがON(デフォルト)であれば更新時にレコードがない場合に自動で登録します。
チェックをOFFにすると、更新時にレコードがない場合は登録処理は行われません。

コメントする -->

マッピング対象外のフィールドに値を挿入する方法【リアルタイムレプリケーションツールDBMoto】

DBMotoではソース(複製元)とターゲット(複製先)のテーブルでフール度の数が異なっている場合でも問題なくレプリケーションを定義することは可能です。しかしながら、ターゲットにレプリケーション対象外のフィールドが存在する場合、そのフィールドがnot null制約になっていると、レコード登録時にnot null制約エラーになってしまう場合があります。

回避方法として、DB側でデフォルト値を予め設定しておく方法もありますが、DBMotoにて決まった値や更新日時を挿入することも可能です。DBMotoで設定する場合は、Expressionという機能を使用します。

●設定例

以下のようなマッピング設定とします。右側のターゲットの「other」「other2」がソースにはないフィールドであり、マッピング対象外となっています。

ターゲットの該当フィールドを右クリックし、「Map to Expression」を選択します。

固定値を設定する例です。

システム日時を設定する場合はNowを指定します。

設定後は以下のような表示になります。

コメントする -->

マルチシンクロで同一レコードを更新したらどうなる?【リアルタイムレプリケーションツールDBMoto】

1対1のシンクロナイゼーションで双方の同一レコードを更新した場合、どちらが優先されるかは以下からオプションで選択可能です。

・ソースを優先
・ターゲットを優先
・タイムスタンプが速い方を優先
・ユーザスクリプト

3台以上の複数台のDBで一括同期を実現するマルチシンクロナイゼーションではどうでしょうか。

ケース1:ソースと、ターゲットのどれか1つで同一レコードを更新した場合は?
⇒通常のシンクロナイゼーションと同様、以下のオプションから選択可能です。
・ソースを優先
・ターゲットを優先
・タイムスタンプが速い方を優先
・ユーザスクリプト

ケース2:ターゲットのどれか2つ以上で同一レコードを更新した場合は?
⇒一番最初に更新したレコードが優先されます。先勝ちです。

コメントする -->

30台のDBに一括で同時にレプリケーションを実現【リアルタイムレプリケーションツールDBMoto】

DBMotoではソース(複製元)とターゲット(複製先)で双方向に差分レプリケーションする「シンクロナイゼーション」というレプリケーションモードがありますが、応用して3台以上のデータベースに一括でレプリケーションする「マルチシンクロナイゼーション」という機能があります。


マルチシンクロのイメージ。設定上はソース1とターゲットnとなり、どこかで更新があれば他すべてに同期を取ります。

例えばですが、マスターDBが1台、各支店ごとにDBがあり支店が全部で30ある場合、マスターDBで更新があれば30支店全部にレプリケーションします。また、ある支店で更新があった場合にはソースと他の支店全部にレプリケーションします。

●DBMoto設定イメージ

ソース(マスターDB)がOracle、ターゲット(30支店)がMySQLの場合の設定を行う場合、以下のように設定します。

Oracle <—> MySQL1(シンクロ)
Oracle <—> MySQL2(シンクロ)
・・・
Oracle <—> MySQL30(シンクロ)

上記レプリケーション定義(30個)を設定後、すべてグループ化してまとめます。


metadataの接続設定イメージです。


metadataのレプリケーション設定イメージです。最後にグループ化して1つにまとめています。

レプリケーションを開始したところ。まずはイニシャルリフレッシュで、ソースのレコードがすべてのターゲットにレプリケーションされたところです。

 

イニシャルリフレッシュ完了後、どれかいずれかのレコードを1件更新した場合、他すべてのDBに同期を取っているところです。

コメントする -->

Oracleのサプリメンタルロギング設定【リアルタイムレプリケーションツールDBMoto】

Oracleからのミラーリング時にはRedoログを参照して差分レプリケーションを行います。その際、事前設定としてOracleに対してサプリメンタルロギングの設定が必要となります。この作業はDBMotoからOracleへの接続設定の際に行うことができます。

DBMotoはLogMinerを使用してRedoログを参照しますが、LogMinerで分析するログ・ファイルを生成するには、その前にサプリメンタルロギングを有効にする必要があります。 サプリメンタルロギングが有効な場合、REDOログ・ ファイルの情報を役立てるために必要な補足情報がREDOストリームに記録されます。

●設定手順

Use Transactional Replicationにチェックを入れ、Verifyを押下します。

サプリメンタルロギングが設定されていない場合、下記のダイアログが表示されます。

Supplemental Log Minimal Levelにチェックを入れ、Installを押下します。

確認ダイアログが表示されますので、Yesを押下します。

再度、Verifyを押下します。

サプリメンタルロギングの設定がされているというダイアログが表示されます。

以上でサプリメンタルロギングの設定は完了です。

コメントする -->

MySQLでバイナリログを使用したミラーリング【リアルタイムレプリケーションツールDBMoto】

MySQLがソースDBのとき、これまでは「トリガー」を使用したミラーリングのみ可能でしたが、以下の条件を満たすことでMySQLのバイナリログを使用したミラーリングが可能になります。

●条件

・MySQL 5.1 以上であること
・DBMoto 6.6 以上であること

●準備するもの

拡張ファイル「DBMySqlUtil.dll」が必要です。
DBMoto には同梱されておりませんので、必要な方はお問い合わせください。

●設定手順

1. MySQLの設定ファイルにて、[mysqld]の部分に下記を追加します。

log-bin=binlog
binlog-format=ROW
server-id=111

2. MySQLの接続設定にあるトランザクションログの設定で、MySQLを選択してVerifyを押下します。

※以下のメッセージが表示されればOKで、バイナリログが正しく参照できていることを意味します。

※エラーが表示された場合は、以下の点確認します。

 ・1の設定が正しくできているか
 ・MySQLのバージョンが5.1以上であるか
 ・MySQLのユーザに権限が付与されているか
  付与されていない場合は下記を実行します。

  GRANT SELECT, PROCESS, FILE, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO dbmoto@’%’;
  Flush Privileges;

3. DBMotoインストールディレクトリに「DBMySqlUtil.dll」をコピーします。これはバイナリログを参照したミラーリングをする際に必要なものです。

4. レプリケーション設定にあるトランザクションログ取得設定で、Readを押下して最新のトランザクションIDを取得します。

以上で設定は完了です。あとは実際にミラーリングを実行するだけです。

コメントする -->