保護中: DBMoto 8.5.3.3 リリースノート

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

コメントを読むにはパスワードを入力してください。 -->

DB2 LUWのトランザクションログを利用したミラーリング【リアルタイムレプリケーションツールDBMoto】

DBMotoでは、DB2 LUW(DB2 for Linux Unix and Windows)からのミラーリングレプリケーションの形式として、トリガー形式DB2ログ利用形式の2つを用意しています。
トリガー形式ではレプリケーション対象のテーブルに対し、更新を検知する3つのトリガーとログ用テーブルを作成して変更点を検知しますが、対象テーブルに対し既存のトリガーがあり新たに設定できない場合などにはDB2ログ利用形式を採用します。

DB2ログ利用形式ではDB2のdb2ReadLog APIを使用し、ログを取得します。

DB2ログ利用形式の場合は、DB2側で事前準備が必要となります。以下は早見表です。

■ユーザ権限
DBADMまたはSYSADM権限を持ったユーザ。
これはストアドプロシージャを作成しDB2のAPI経由でログを読み取るのに必要です。
■ログ設定
LOGARCHMETH1パラメータが、LOGRETAINまたはDISKであること。
このパラメータを変更した場合、DB2側の仕様上オフラインフルバックアップの実施が必要です。
例)コマンドラインでは、db2 “BACKUP DB climb TO /home/db2inst1/dbbackup”
■DB2へのファイル設置先
このファイルはストアドプロシージャを作成する元となるファイルです。
インスタンスのホームディレクトリ直下のfunctionディレクトリに配置します。
例)/home/db2inst1/sqllib/function
■テンポラリテーブルスペースの使用
もしテンポラリテーブルスペースがない場合は作成する必要があります。


ここから先ではスクリーンショットを用い具体的な設定方法を案内します。

まずはDB2のログ設定を確認します。
ログ設定のパラメータはLOGARCHMETH1です。この値がLOGRETAINDISKである必要があります。
この設定を変更した後は、オフラインフルバックアップを実施する必要があります。
※アプリケーションが接続中だとオフラインバックアップが実施できません。
003

次にDBMotoから接続する際のユーザの権限を確認します。
DBADMまたはSYSADM権限があることを確認します。これがない場合、DB2のAPIを利用できません。

次にDB2上に配置するファイルを確認します。
このファイルはDBMotoインストール先フォルダ内のServerFiles->DB2UDBフォルダにあります。
複数ありますが、これはOSの種類とバージョン、そしてDB2のバージョンによって使用するファイルが変わります
ファイル名は「(OS種類およびバージョン)_(DB2バージョン)_db2udbreadlog03」という形で命名されているので、お使いの環境に対応するファイル名のものを選択してください。
※万が一存在していない場合は、弊社にお問い合わせください。用意いたします。
001

次にこのファイルをDB2に配置します。設置先のインスタンスユーザのホームディレクトリの、functionディレクトリに配置します。
このときファイル名をdb2udbreadlog03に変更する必要があります。パーミッションや所有者の変更は不要です。
002

次にDBMotoからDB2への接続を作成します。DBMotoのソース接続作成ウィザードの「セットアップ情報」の段階で「トランザクションを使用」にチェックを入れ、プルダウンメニューから「DB2UDB」を選択します。
下の確認ボタンをクリックし、ストアドプロシージャがすでにあるか確認します。
004

以下のアラートが出力されたら、OKを押します。このアラートは接続先のDB2にDBMotoのストアドプロシージャがまだない、または古いバージョンで作成されたものであることを示しています。
007

インストールボタンが有効になっているので、それをクリックすると、以下のアラートが表示されます。「はい」をクリックします。
008

「ログリーダーライブラリバージョン」が表示されれば、ストアドプロシージャが作成されています。
006


正常に利用できる場合、DB2 LUWからのレプリケーション作成時に、「ソースログ情報」の画面で「参照」ボタンを押すと、トランザクションIDが取得されます。
010

タグ: , ,

[DBMoto]オンプレミスDBからAzure SQL Databaseへレプリケーションによる簡単移行連携

DBMotoはMicrosoft Azure SQL Databaseとのリアルタイムレプリケーションに対応しています。
オンプレミスのDBからAzure SQLへ簡単に移行・連携することが可能です。
20151001-18

●Azure SQL Databaseの構築

Azureへログインし、左メニューからSQLデータベースを選択し、新規でDBを作成します。
20151001-01

データベース名やパフォーマンスレベル、照合順序などを設定します。
照合順序はSQL Serverの標準と同様のJapanese_CI_ASを選択しました。
20151001-02

ログイン情報を設定します
20151001-03

しばらくするとDBが作成されます
20151001-04

DBMotoマシンからAzureへ接続するためにDBMotoマシンからアクセスして「このIPアドレス用にMicrosoft Azureファイアウォールルールを設定する」をクリックし、接続を許可します。もしくは他マシンからアクセスしてDBMotoマシンのIPアドレスを許可します。
また、DBMotoから接続する際の接続先サーバのホストをメモしておきます。
20151001-05

実際にAzureへの接続を確認するため、SQL Server用のManagement Studioを使用して接続します。
20151001-06

正しくAzureに接続できたことを確認します。
20151001-07

●DBMotoでの設定

DBMotoからAzureへ接続する際に、データベースは「Microsoft Azure SQL Database」を選択します。
接続ドライバは.NET Framework内蔵のSQL Clientを使用するため別途準備は不要です。
20151001-08

Azureのホスト、ユーザ名、パスワード、DB名を入力して接続を確認します。
20151001-09

今回はオンプレミスのOracleからAzure SQL Databaseへレプリケーションすることを例に、Oracleのテーブル情報を元にAzure上にテーブルを作成します。
20151001-10

このように複製元のOracleのテーブル構成を元にAzure用に適切なデータタイプ等が自動選定されます。手動でも変更可能です。
20151001-11

発行されるクエリを確認し、テーブル作成を行います。
20151001-12

あとはレプリケーションジョブを作成してレプリケーションの準備は完了です。

●DBMotoでのレプリケーション検証

まずはデータの確認です。複製元のOracleは下記のデータとなっています。
20151001-13

続いてAzureのデータの確認です。先ほどDBMotoからテーブルを作成したのみですので空っぽです。
20151001-14

DBMotoのレプリケーションサービスを開始し、まずは全件リフレッシュが実行されます。
下記のようにAzure上に正しく全レコードがレプリケーションされていることを確認します。
20151001-15

続いて差分レプリケーション確認のため、Oracle上で意図的にデータの更新をかけます。
※Oracle SQL Developerで更新しました。
20151001-16

その後、今度はSQL Server Management Studioにて正しく差分のデータが反映されていることを確認しました。
20151001-17

このようにオンプレミスDBからAzure SQL Databaseへ簡単にレプリケーションによる移行・連携が可能です。
またAzureから他DBへのレプリケーションにも対応しています。その際はレプリケーション対象のテーブルにトリガーを作成して差分レプリケーションを行うことも可能です。

タグ: , ,

[DBMoto]Oracle順序オブジェクト(シーケンス)のレプリケーションをスクリプトで実現

DBMotoを使用してOracleのデータを差分レプリケーションする場合、Redoログを参照して直接トランザクションを確認します。
しOracleの順序オブジェクト(シーケンス)はトランザクション処理ではなくRedoログに情報が記録されないため、DBMotoで普通にレプリケーションを行うことができません。

DBMotoをディザスタリカバリ等のBCP目的で使用される場合には、テーブルデータは同期が取れても順序オブジェクトの同期が取れないということになり、この場合は順序オブジェクトを手動で移動したりシーケンスの最後の値を手動で設定する等が必要になります。

しかしDBMotoの標準機能であるスクリプトを記述することで、疑似的ではありますが順序オブジェクトのレプリケーションが可能となります。

●順序オブジェクトのレプリケーションを実現させるための準備と流れ

1. ソースとターゲットのシーケンスを予め[NOCACHE]にします。
⇒ALTER SEQUENCE シーケンス名 NOCACHE
2. ソースとターゲットDBにダミーテーブルを準備します。(レコード数は0で問題ありません)
3. ダミーテーブルを使用したリフレッシュのレプリケーション定義を作成します。
4. レプリケーション定義に対してリフレッシュを定期間隔(1分おき等)で実行するようスケジュール設定します。
5. レプリケーション定義に対して、下記からダウンロード可能なスクリプトを適用します。

ダミーテーブルを使用してスケジュールリフレッシュ毎にスクリプトを実行し、スクリプトから順序オブジェクトをレプリケーションする、という流れになります。
スクリプトは下記よりダウンロードいただけます。

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

Namespace DBRS

Public Class SequenceName
Public owner As String
Public name As String
Public incrementBy As Integer
Public lastNumber As Integer
End Class

Public Class ReplicationScript : Inherits IReplicationScript

Dim sequenceArrayList As New ArrayList()

Public Overrides Sub Record_onBeforeMapping(recSource As IRecord, ByRef AbortRecord As Boolean)
‘ Do this so that no record is written to the target dummy table
AbortRecord = True
End Sub

Public Overrides Sub Refresh_onPrepareRefresh(ByRef CancelRefresh As Boolean, ByRef Filter As String)

‘ Here, we are identifying and initializing the sequences we want to replicate

AddLog("debug> Refresh_onPrepareRefresh()", 0)
sequenceArrayList.Clear()

‘ ここにスキーマ名とシーケンス名を設定します。
Dim selectCondition = "SEQUENCE_OWNER = ‘schemaname’ AND SEQUENCE_NAME LIKE ‘%SEQ%’"

Dim conn as IDbConnection = Nothing
Dim cmd as IDbCommand = Nothing
Dim reader as IDataReader = Nothing
Dim opened As Boolean = False

Try
conn = InternalSourceConnection
If conn.State <> ConnectionState.Open Then
AddLog("debug> open source connection because it hasn’t been", 0)
conn.Open
opened = True
End If
cmd = conn.CreateCommand
cmd.CommandText = "SELECT SEQUENCE_OWNER, SEQUENCE_NAME, INCREMENT_BY, LAST_NUMBER FROM ALL_SEQUENCES WHERE " & selectCondition & " ORDER BY 1,2"
AddLog("debug> cmd.CommandText = " & cmd.CommandText, 0)
reader = cmd.ExecuteReader
While reader.Read
Dim seq = new SequenceName
seq.owner = reader.GetString(0)
seq.name = reader.GetString(1)
seq.incrementBy = reader.GetDecimal(2)
seq.lastNumber = reader.GetDecimal(3)
sequenceArrayList.add(seq)
AddLog("debug> " & seq.owner & "." & seq.name & " incr:" & seq.incrementBy.ToString & " lastnum: " & seq.lastNumber , 0)
End While
If sequenceArrayList.Count = 0 Then
AddLog("Warning, no sequences will be replicated.",0)
AddLog("This statement returns no rows: [" + cmd.CommandText + "]",0)
End If
Catch ex As Exception
AddLog("Exception in Internal Target Connection: " & ex.ToString,0)
Finally
If (not reader is Nothing) Then
reader.Close
End If
If (not cmd is Nothing) Then
cmd.Dispose
End If
If opened = True Then
conn.Close
End If
End Try

AddLog("debug> sequenceArrayList.Count = " & sequenceArrayList.Count.ToString, 0)

End Sub

Public Overrides Sub Refresh_onAfterRefresh()

AddLog("debug> Refresh_onAfterRefresh()…", 0)

Dim conn as IDbConnection = InternalTargetConnection
Dim cmd as IDbCommand = conn.CreateCommand
Dim cmd2 as IDbCommand = conn.CreateCommand
Dim reader as IDataReader = Nothing
Dim opened As Boolean = False

Try

If conn.State <> ConnectionState.Open Then
AddLog("debug> open target connection because it hasn’t been", 0)
conn.Open
opened = True
End If

Dim seq As SequenceName

For Each seq In sequenceArrayList
cmd.CommandText = "select LAST_NUMBER from ALL_SEQUENCES where SEQUENCE_OWNER=’" & seq.owner & "’ AND SEQUENCE_NAME=’" & seq.name & "’"
AddLog("debug> lastNumber = " & seq.lastNumber.ToString & ", target sql = " & cmd.CommandText, 0)
reader = cmd.ExecuteReader
Dim nextval As Integer = -1
If reader.Read Then
nextval = reader.GetDecimal(0)
AddLog("debug> target nextval = " & nextval.ToString, 0)
reader.Close
While (seq.incrementBy > 0 AND seq.lastNumber > nextval) OR (seq.incrementBy < 0 AND seq.lastNumber < nextval)
AddLog("debug> 1) lastNumber " & seq.lastNumber.ToString & " > nextval " & nextval.ToString, 0)
cmd2.CommandText = "select " & seq.owner & "." & seq.name & ".NEXTVAL from ALL_OBJECTS where ROWNUM <= ABS(" & ((seq.lastNumber-nextval)/seq.incrementBy).ToString & ")"
AddLog("debug> cmd2.CommandText = " & cmd2.CommandText, 0)
reader = cmd2.ExecuteReader
While reader.Read
‘AddLog("debug> 2) lastNumber " & seq.lastNumber.ToString & " > nextval " & nextval.ToString, 0)
nextval = reader.GetDecimal(0)+seq.incrementBy
End While
reader.Close
End While
End If
Next

Catch ex As Exception
AddLog("Exception in Internal Target Connection: " & ex.ToString,0)
Finally
if (not reader is Nothing) Then
reader.Close
End If
if (not cmd is Nothing) Then
cmd.Dispose
End If
If opened = True Then
conn.Close
End If
End Try

End Sub

End Class
End Namespace
[/vb]

●スクリプトの内容

1. ソースとターゲット側のシーケンスの最後の値を抽出します。
2. 両者の値を比較し、【ソース>ターゲット】の場合には【ソース=ターゲット】になるまで、ターゲット側のシーケンスに対してNEXTVALを実行します。

●スクリプト適用手順

メタデータは下記の構成となっています。
・テーブル「EMPLOYEE」が順序オブジェクトの疑似レプリケーション用ダミーテーブル(レコードはなし)
・テーブル「TABLE1」が順序オブジェクトを使用している実テーブル
・レプリケーション「TABLE1」が、実テーブルTABLE1のミラーリング構成
・レプリケーション「順序レプリケーション」は、ダミーテーブルEMPLOYEEのリフレッシュ構成
⇒これに対してスクリプトを適用します。

リフレッシュスケジュールを1分間隔で実行するよう設定します。

「スクリプトを使用」にチェックを入れ、スクリプト画面を開きます。

スクリプトをコピーして適用します。

タグ: , ,

保護中: DBMoto 8.5.2.7 リリースノート

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

保護中: DBMoto 8.5.2.7 リリースノート はコメントを受け付けていません -->

[DBMoto]Amazon Auroraを正式サポート!オンプレミスDBからの移行やDB間の連携に!

DBの移行・連携・災害対策用DBレプリケーションツールDBMotoはAmazon RDS for Auroraの正式サポートを開始しました。

Amazon AuroraはMySQLと互換性があり、MySQLの5倍の性能を持ちます。またAmazon RDSの特徴であるプロビジョニング、パッチの適用、バックアップ、リカバリ、マルチAZ配置オプションによる障害検知、リペアなどが可能です。

DBMotoを使用することで、オンプレミスDBのOracle・SQL Server・MySQL・DB2(AS/400,z/OS,LUW)などからAmazon Auroraへ簡単に移行したり・レプリケーションによる異種DB間の連携を行うことが可能です。
20150808-19

今回はDBMotoを使用してオンプレミスDBからAmazon Auroraへレプリケーションするための簡単な手順をご紹介します。

なお、さらに詳細な「Amazon Auroraへのレプリケーション検証レポート」(PDF:23ページ分)は下記サイトよりダウンロード可能です。
https://www.climb.co.jp/soft/dbmoto/whitepaper/

●Amazon Auroraのインスタンス作成

AWSのRDS画面からAuroraのインスタンスを選択します。
※2015/8/8現在、Auroraの提供は米国リージョン等一部での提供となっています。順次日本リージョンでの提供も開始されるそうです。
20150808-01

インスタンス名・ユーザ名等を設定します。
20150808-02

インスタンスが作成されると、「クラスターエンドポイント」が表示されます。これが接続先情報となり、のちにDBMotoからの設定時に使用します。
20150808-03

●DBMotoマシンでの準備

DBMotoはWindowsマシンにインストールし、エージェントレスで稼働します。
インストールは1分ほどで完了し、DBサイドへのエージェント導入は不要です。
このため簡単にレプリケーション環境を構築することが可能です。
また、DBMotoマシンからAuroraへ接続する際は、MySQLへの接続時と同様にMySQL Connector/NETを使用します。
以下よりダウンロードが可能です。
http://dev.mysql.com/downloads/connector/net/

●DBMotoからAuroraへの接続

まず予め複製元のソースDBの接続設定を済ませておきます。
今回はオンプレミスのOracleを使用しています。
20150808-04

続いてAuroraへの接続を作成します。
20150808-05

DBの種類はMySQLを選択します。
20150808-06

接続先の情報を入力します。ここでAuroraのクラスターエンドポイントを使用します。
20150808-07

●DBMotoからAuroraへのテーブル作成

DBMotoは複製元のソースDBのテーブル情報を元にAuroraへ簡単にテーブル作成することが可能です。
20150808-08

データタイプは適切なものが選定され、サイズやPK、NULL制約等はソースDBの情報が引き継がれます。また手動で変更することももちろん可能です。
20150808-09

●DBMotoでのレプリケーションジョブの作成

どのようにレプリケーションするか、テーブル単位でジョブを作成します。
20150808-10

レプリケーションモードは以下に対応しています。
・リフレッシュ・・・全レコードの一括転送
・ミラーリング・・・ソースからターゲットへの片方向差分レプリケーション
・シンクロナイゼーション・・・ソースとターゲット間の双方向差分レプリケーション
今回はOracleからAuroraへのリフレッシュ及びミラーリングの手順でジョブを作成します。
なお、DBMotoはAuroraからの差分レプリケーションにも対応しています。
20150808-11

ジョブの作成が完了すると、以下のようにレプリケーションの状況を一目で把握できるようになります。
20150808-12

●レプリケーション検証

それでは実際にレプリケーションを行います。
レプリケーションはWindowsサービスのDBMotoを開始することで実行できます。
サービスを開始するとまず初期レプリケーションとして、全件の転送であるリフレッシュが実行されます。
リフレッシュ後は自動で差分のミラーリングモードへ移行します。

ソースのOracleには以下のようなデータのテーブルがあります。
一方でAuroraはDBMotoからテーブル作成を行ったのみですのでデータは空っぽです。
20150808-15

Windowsサービスを開始するとリフレッシュが稼働し、OracleからAuroraへ全レコードが転送されます。
DBMotoでも件数等ステータスを確認可能です。
20150808-14

正しくレプリケーションされたかどうかを確認します。
AuroraはMySQL互換のため、ここではMySQL Workbenchを使用し、正しく全レコードがレプリケーションされていることを確認しました。
20150808-15

続いて差分のミラーリングを行うため、Oracleにて意図的に更新をかけます。
20150808-16

DBMotoで反映された旨確認します。
20150808-17

MySQL Workbenchを使用し、正しくミラーリングされたことを確認しました。
20150808-18

このようにDBMotoを使用することで、オンプレミスDBからAmazon Auroraへ簡単にレプリケーションを行い、移行やDB間の連携を実現することができます。

タグ: , ,

仮想マシンで構築されたSQL Serverを簡単バックアップ、トランザクションレベルでのリストア [Veeam Backup & Replication]

SQL Serverは、障害に備え保護する必要のある重要なアプリケーションの1つです。この記事では、仮想マシンで構築されたSQL Serverをイメージベースでバックアップし、トランザクションレベルでリストアすることが可能なVeeam Backup & Replicationについてご紹介します。

Veeam Backup & Replicationは、VMware/Hyper-V仮想環境に特化したイメージベースのバックアップソフトウェアです。Microsoft VSSと連携して整合性のとれたバックアップを取得できます。さらに、SQL Serverのトランザクションログのバックアップも対応しているため、指定したトランザクションの状態までデータベースを復旧することが可能です。

参考:VeeamでSQL Serverのトランザクションログまでバックアップ

このようにVeeamでは、整合性のとれたVM全体のバックアップを行います。しかし、誤ってレコードを削除してしまったなど、一部のレコードを復旧するために、VM全体をリストアするのは、大変です。そこで、用意されているのがVeeam Explorer for SQL Serverというツールになります。このツールを使用することで、次のリストアが行えます。

参考:ここまでできる。VeeamからSQL Serverの復旧

 

データベースファイルのリストア

データベースファイルをSQL Server VMのバックアップから直接リストアすることができます。インスタンスやデータベースなどMS SQL Serverの階層情報を表示できるので個別に選択して、次のような複数の方法でリストアすることができます。

  • 現在の復元ポイントへのリストア
  • 選択した時点へのリストア
  • 選択したトランザクション直前の状態へのリストア

vefs_01

 

トランザクションログのリストア

Veeamのトランザクションログのエージェントレスバックアップとリストアを使用すれば、MS SQL Serverログトランザクションの正確な時点に迅速にリストアすることができます。

vefs_02

現在、バージョン8ですが、バージョン9からOracleをサポートする予定です。

参考:Ver9新機能予告「Veeam Explorer for Oracle」トランザクションレベルの復旧を実現

タグ: , , , ,

保護中: DBMoto 8.5.1.6 リリースノート

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

タグ:

[DBMoto]EBCDICのDB2(AS/400,z/OS)からのレプリケーションは特殊文字も外字もOK!

DBMotoはIBM i(AS/400)やメインフレーム(z/OS)向けDB2からOracle等異種DBへのレプリケーションをサポートします。
DB2の文字コードがEBCDICの場合、レプリケーションの際にはDBMotoにてUnicodeへ変換し、レプリケーション先DBの文字コードに合わせて再度変換します。
20150611-01

文字コードがEBCDICなのでどうしても文字化けを心配されがちですが、DBMotoは条件付きですべてのDB2の文字をレプリケーション可能です。

●EBCDICからUnicodeへの変換の仕組み

DBMotoはEBCDICからUnicodeへの変換の際にICUという文字変換ライブラリを使用しており、このライブラリに基づいて各文字ごとにマッピングされています。
下記のサイトにて実際にどのEBCDICがどのUnicodeに関連付けされているか確認可能です。

CCSID=5026の場合
https://github.com/unicode-org/icu-data/blob/master/charset/data/ucm/ibm-5026_X120-1999.ucm

CCSID=5035の場合
https://github.com/unicode-org/icu-data/blob/master/charset/data/ucm/ibm-5035_X120-1999.ucm

基本的には上記サイトに記載のEBCDICコードはすべてDBMotoでレプリケーション可能となります。

●特殊文字のレプリケーション

上記サイトに記載のないEBCDICコードはICUにおいてUnicodeへ関連付けされていないため、DBMotoでのレプリケーション時にはそのままですと文字化けしてしまいます。

具体的には「NEC選定文字コード」と呼ばれる下記の機種依存文字はそのままですと文字化けします。
20150611-02

しかしDBMotoには任意のEBCDICの文字を任意のUnicodeへ変換するための拡張機能を用意しておりますので、拡張用の変換テーブルを別途実際にはレプリケーションは可能となります。
※拡張用の変換テーブルは個別対応とさせていただいております。対応には検証も含めお時間をいただく場合があります。

●IBM拡張文字セット・NECのIBM選定文字セット

これらはICUにてUnicodeへマッピングされており、文字化けせずレプリケーション可能です。

●外字

これらもICUにてUnicodeへマッピングされております。

例:
(EBCDIC)\x6941 → U+E000(Unicode)
(EBCDIC)\x6942 → U+E001(Unicode)
(EBCDIC)\x6943 → U+E002(Unicode)
(EBCDIC)\x6944 → U+E003(Unicode)

従いまして文字コードとしては外字もレプリケーション可能ですが、
レプリケーション先のDBへアクセスするクライアントマシンにて外字登録を行う必要があります。
外字登録を行わないと表示上は文字化けしますが内部データとしては正しいUnicodeを持っている状態です。

タグ: , , , , , ,

【DBMoto】レプリケーションの統計情報が一括で確認できるダッシュボード機能

DBMoto ver8.5より、レプリケーションの統計情報が一括で確認できるダッシュボード機能が搭載されました。これによりある期間内の各テーブルのレプリケーション成功率や、レプリケーショングループ単位のスループットなどが確認できます。
DBMotoダッシュボード画面

各テーブルの下記のような情報が閲覧できます。

・処理されたレコード
・失敗したレコード
・全レコード
・セッション数
・スループット

ダッシュボードを開くには、DBMotoのMsnagement Centerの画面で、メタデータを右クリックし、”ダッシュボードを表示する”を選択します。
ダッシュボードを表示する

ダッシュボード画面の上部にある”Selected Time Interval”から表示する期間を設定できます。ドラッグすることで、時間単位の表示も可能です。
表示期間の設定

画面中央にあるグラフではレプリケーショングループごとに分けられて表示されています。確認したいテーブルが含まれているグループをクリックすることで、画面右側にグループに含まれているテーブル名や、処理されたレコード、成功率が表示されます。画面の下部では処理されたレコードがグラフィカルに表示されます。処理されたレコードに対しての、全レコードや失敗したレコード、セッション数も確認できます。
ダッシュボード機能

画面左側のダッシュボードチャートの項目の”セッションタイプ”から、リフレッシュセッション、ミラーリングセッションの表示切り替えも可能です。”チャートを表示する”からスループットを選択すると、画面下部の情報が切り替わります。処理時間と処理されたレコード件数が表示されます。
スループット

コメントする -->

DBMotoのレプリケーションパフォーマンスを向上させる方法

DBMotoのレプリケーションはデフォルト設定のままお使いいただいても、十分に性能を発揮できるようになっていますが、適宜環境に合わせて設定を変更していただければパフォーマンスの向上を望めます。

■概要

DBMotoの処理パフォーマンスは、1つ変わるだけでも大きく変わることがあります。DBMotoの処理時間は利用可能なリソースに依存します。

  • DBMSサーバとDBMotoが実行されているサーバとの間の接続のネットワーク帯域
  • 関係するマシンのプロセッサ数
  • プロセッサのタイプ
  • 利用可能なメモリ
  • CPU使用率

DBMotoのレプリケーションデザインは、レプリケーション処理中のボトルネックを回避するよう、慎重にバランスをとる必要があります。
気をつけるべき指標は以下になります。

  • ソースとターゲットの接続数
  • レプリケーション対象のテーブル数
  • レプリケーション対象のテーブルそれぞれのレコードサイズとレコード数
  • レプリケーションモード(リフレッシュ・ミラーリング・シンクロナイゼーション)
  • ソースデータベースの秒ごとのトランザクション数
  • データベース接続の開始およびクエリ処理を最適化するレプリケーショングループ

例えば、レプリケーションされるテーブルのサイズとトランザクション数は、単一のフルリフレッシュとその後の連続したミラーリングを実行するより、特定の期間はリフレッシュを連続して実行するほうが、便利であるかどうかを評価するのに重要です。

また、DBMoto Management CenterはDBMoto Dashboardへのアクセスを提供します。

DBMotoダッシュボード画面

これは指定したDBMotoメタデータと履歴ファイルまたは履歴データベースの内容をもとに、一定時間内のレプリケーションデータとパフォーマンスを分析するツールです。
選択したテーブルのセットにおける、それぞれのテーブルに対する以下の情報を供給します。

  • 処理されたレコードの総計
  • 処理に失敗したレコードの総計
  • レコードの総計
  • レプリケーションセッションの総計
  • 単位時間あたりの、すべてのレプリケーションで処理されたレコードの総計
  • 特定のレコードをレプリケーションするのにかかった平均時間

これにより、指定期間内の、レプリケーションによるセッション数やレプリケーションされたレコード数などを確認し、どのような設定を行うことが適切であるか、判断することが可能です。
詳細は下記弊社ブログ記事をご覧ください。
【DBMoto】レプリケーションの統計情報が一括で確認できるダッシュボード機能


上記を踏まえて、以下の設定を適用することにより、自社環境でパフォーマンスを改善できるかどうかを検討してください。


■ミラーリングとシンクロナイゼーションにおけるログチェック間隔

ミラーリングおよびシンクロナイゼーションモードでは、デフォルトでは60秒間隔でトランザクションログを参照しますが、よりリアルタイム性を追求したい場合は、15秒間隔に変更することが可能です。

ログチェックの頻度の変更は、以下の手順で行います。

  1. Data Replicatorを停止するか、レプリケーションを無効化します。
  2. レプリケーションを選択し右クリックします。
  3. メニューからプロパティを選択します。mirroring_interval_01
  4. レプリケーションプロパティダイアログで、「優先」タブを開きます。
  5. 参照間隔」フィールドの値を変更します。デフォルト値は60秒です。mirroring_interval_02
  6. OK」を押し、レプリケーションプロパティダイアログを閉じます。

レプリケーションを有効化しData Replicatorを起動させれば、新しい間隔でレプリケーションが実施されます。
ただし15秒以内に処理が終わらない量のトランザクションが発生している場合、この設定を行うと処理が滞留してかえってリアルタイム性を損ないます。ご注意ください。


■履歴・ログをデータベースに保存する

履歴・ログはデフォルトでテキストファイルに保存されますが、大量のレプリケーションが実行されている場合、テキストファイルではなくデータベースに記録を保存すると、レプリケーション性能がよくなることがあります。

  1. Data Replicatorを停止します。
  2. Data Replicatorオプションを開きます。20141118-4
  3. Data Replicatorオプションダイアログで、ログタブを選択します。
  4. ログ出力先」フィールドで、ドロップダウンリストから、「データベース」を選択します。history_to_database_01
  5. メタデータ保存先のデータベース(デフォルトではローカルで使用されるSQL Server CE)、またはDBMotoで接続可能な任意のデータベースを選択します。
  6. 必要に応じて保存されるメッセージの数を制限できます。DBMoto Dashboardツールは時間に応じたパフォーマンスを表示するので、メッセージの数を制限することは、表示可能なデータの量を削減することに注意してください。
  7. 履歴ログを有効」オプションにチェックを入れます。これにより履歴ファイルもデータベースに保存されます。history_to_database_02
  8. OKを押し、ダイアログを閉じます。

Data Replicatorを起動すると、設定にしたがいデータベースへの保存を開始します。

他のオプションに関しては以下の弊社ブログ記事をご覧ください。
DBMotoがサポートするログの出力先・・・ファイル、DB、Windowsイベントログ、Apache Log4Net


■SQL ServerおよびMySQLへのリフレッシュパフォーマンスを改善する

SQL ServerまたはMySQLに対するリフレッシュ性能を向上させる方法として、バルクインサートの設定を変更する方法があります。

ターゲット接続ウィザードにおいて、接続に使うドライバに、SQL ServerであればMicrosoft SQL Server .NET Data ProviderMySQLであればMySQL .NET Data Providerを選択していることが条件です。

  1. Data Replicatorを停止するか、レプリケーションを無効化します。
  2. レプリケーションプロパティを開き、優先タブを選択します。
  3. リフレッシュオプションで、「Insertモード」がBulkInsertになっていることを確認します。
  4. ブロックサイズ」を調整します。概ね、50から100の間で最適なパフォーマンスを発揮しますが、実際の値は、デフォルトの設定値の場合と比較して設定してください。

refresh_performance_01

レプリケーションを有効化しData Replicatorを起動させれば、レプリケーションで新しいバルクインサートのサイズが適用されます。


■ミラーリング時の読み込み量を変更する

AS400/SQL Server/Oracle/トリガー形式のミラーリング性能を向上させる方法として、ジャーナルからデータを読み込む量を変更する方法があります。
ミラーリング間に発生するトランザクションが大量にある場合に、このブロックサイズ設定は有効です。

DBMotoではジャーナルから読み込んだレコードを一時ファイルに保存します。もしファイルが多数のレコード、または少数ではあるがフィールド数が大きいレコードを含んでいると、パフォーマンスに影響が出ます。
この場合、一度に扱うレコードの数を制限することが可能です。
最大ミラーリングブロックサイズ」プロパティの値を250にすれば、1度にレプリケーションするレコード数は250に限られます。

※画像はAS400のものですが、SQL Server/Oracleおよびその他のトリガー形式でも設定項目名は変わりません。

  1. Data Replicatorを停止します。
  2. ソース接続のリストからデータベースの接続を選択し、右クリックで開くメニューから「プロパティ」を選択します。20150519-1
  3. 開いたソース接続プロパティダイアログから、「最大ミラーリングブロックサイズ」プロパティを探します。as400_mirroring_02
  4. レコードのサイズと、一度にミラーリングしたいレコードの数に応じて値を設定します。
  5. OK」をクリックして接続プロパティダイアログを閉じます。

■ミラーリング時のターゲット更新単位を変更する

DBMotoではレプリケーションの一貫性を保つため、ミラーリングではデフォルトで単一レコードの更新ごとにコミットを行います。ただこの場合、コミット単位が細かくなるため、ターゲットDBの性能によってパフォーマンスが低下することがあります。

これに対して、ソースがOracle、Microsoft SQL Server、IBM DB2 for i、 IBM DB2 LUW、 IBM Informixの場合(トランザクションログ方式がトリガーの場合は不可)、ソースでのコミット単位と同様のコミット単位でターゲットにまとめて、更新をコミットすることができます。この設定を行うことで、ソース側のコミット単位にもよりますが、パフォーマンスを向上させることができます。

  1. Data Replicatorを停止します。
  2. レプリケーション選択し、右クリックで開くメニューから「プロパティ」またはグループを選択し、「レプリケーションを編集」を選択します。
  3. 開いたレプリケーションプロパティダイアログの「優先」で、「コミットモード」プロパティを探します。
  4. CommitmentControl」に変更します。
  5. OK」をクリックし、プロパティダイアログを閉じます。

■スレッド設定の変更でパフォーマンスを上げる

マシンスペックが低く、かつVistaなどの古いOSを使用している場合に関して有効な方法です。
下記弊社ブログ記事に詳細がまとまっていますので、こちらをご参照ください。
[DBMoto]スレッド設定の調整でレプリケーション速度を向上させる方法

また、各レプリケーションを処理するスレッドごとに優先順位を設定することも可能です。
優先タブの「一般」から、スレッド優先順位で設定が可能です。
refresh_performance_01


■リフレッシュ時のSELECT COUNTを行わない

DBMotoがリフレッシュを行う際は、ソーステーブルにあるレコードの数をSELECT COUNT文で取得してから、実際のデータをレプリケーションします。
このSELECT COUNT文は総レコード数をレプリケーション開始時に通知するために行われるものであり、レプリケーション処理そのものにはかかわりません。

SELECT COUNT文はInnoDBを使用しているMySQLなど、大量のレコードがあるテーブルに行うとタイムアウトエラーを起こす可能性があります。
タイムアウトエラーを起こす場合、DBMotoの設定でSELECT COUNT文の発行を行わないようにできます。

レプリケーションプロパティの、優先タブから、「レコード数をスキップ」をTrueに変更します。

20150604-01


■ターゲットテーブルへの仮想PK設定時のパフォーマンス向上方法

DBMotoではテーブルに主キーが設定されていない場合に、仮想PKという機能を使うことで、1つまたは複数のフィールドを疑似的にPKであると認識させてミラーリングレプリケーションを実施できます。

ターゲットに仮想PKを設定しているとき、ミラーリングの更新量が多い(特にUPDATE文)とレプリケーションのパフォーマンスが劣化することがあります。その際は、仮想PKと指定しているフィールドにINDEXを付与するとパフォーマンスが改善されます。

仮想PKに関しては、この弊社ブログ記事をご覧ください。
差分レプリケーションに必要なDBの主キーとDBMotoの仮想PK

コメントする -->

[DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)

DBMotoでは通常のレプリケーションに加え、複製元(ソース)のデータを関数を使用して変換し、複製先(ターゲット)にレプリケーションを行う機能が実装されております。

使用できる関数は以下の通りです。

・C#の関数
・VBの関数
・ユーザ関数

C#、VBの標準関数を使用できる他、DBMoto内に関数をオリジナルで定義し、ユーザ関数としてご利用いただくことも可能です。

例:
・Trim関数:前後の空白を除去する 「  テーブルデータ  」⇒「テーブルデータ」
・Ucase関数:小文字を大文字へ変換する 「Table Data」⇒「TABLE DATA」
・日付型を数値のみに変換する独自のユーザ関数 「2015/05/26」⇒「20150526」

●言語の選択

C#とVBをDBMoto内で混在させることはできないため、どちらか一方に統一する必要があります。以下の手順でC#とVBの切り替えが可能です。

1. グローバルスクリプト画面を開きます。
20150526-01

2. スクリプト言語からC#かVBを選択します。デフォルトはC#です。
20150526-02

●関数適用手順

1. テーブルのカラム単位でマッピングがされているので、関数を適用するカラムを右クリックし「関数へのマッピング」を選択します。
20150526-0320150526-0420150526-05

2. カラムに対して関数を適用します。下記の画面ではVBのTrim関数を適用している例です。
※VBの場合は[カラム名].Trim()、C#の場合は[カラム名].ToString().Trim()
20150526-06

3. 関数適用後は。マッピングの矢印の色が緑に変わります。
20150526-07

●ユーザ関数作成・適用手順

ユーザ関数はまずグローバルスクリプトにて関数を定義し、次にマッピング画面で関数名を指定する手順となります。

1. グローバルスクリプト内のGlobalクラス内に関数を定義します。下記の画面ではVBにてユーザ関数を定義しています。
20150526-08

2. ユーザマッピング画面で1で定義した関数名を指定します。
20150526-09

●特定の文字に変換するための置換関数

ソースのデータを特定の文字に変換する際にはReplace関数を使用します。
以下の例ではソースの「愛」という文字を「あい」へ変換してレプリケーションします。VBとC#どちらも同じです。

[vb]
[カラム名].Replace("愛", "あい")
[/vb]

Replace関数はUnicodeの文字コードも指定可能です。
VBの場合は下記のように記述できます。

[vb]
‘ 「ChrW(&Hxxxx)」のxxxxにUnicodeを記載します。愛が「611B」
[カラム名].Replace(ChrW(&H611B), "あい")
[/vb]

C#の場合は下記のように記述できます。

[csharp]
// 「\uxxxx」のxxxxにUnicodeを記載します。愛が「611B」
[カラム名].Replace("\u611B", "あい");
[/csharp]

●関数の一括設定

関数をマッピング画面でカラム単位で1つずつ設定するのはどうしても時間がかかります。この時間を短縮し、一括で設定することが可能です。

1. 関数の一括設定はグローバルスクリプト内のMappingRuleクラスにて記述します。
下記の例ではVBでVARCHARのカラムに対し、Replace関数にて「愛」を「あい」へ変換する設定を一括で行うための内容です。
20150526-10

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

Namespace DBRS
Public Class GlobalScript : Inherits IGlobalScript

End Class

Public Class MappingRule : Inherits IMappingRule
<MappingRuleAttribute("Replace(VARCHAR)", "「愛」を「あい」へ変換")> _
Public Function Function1 (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 = "VARCHAR" Then
sExpression.Append("[" + sTargetName + "].Replace(ChrW(&H611B), ""あい""")
End If
Return True
Else
Return False
End if

End Function
End Class

Public Class GlobalEvents : Inherits IGlobalEvents

End Class
End Namespace
[/vb]

2. マッピング画面にて「カスタムマッピング」から該当のものを選択します。
20150526-11

3. 一括で設定されていることを確認します。
20150526-12

タグ: , ,

パフォーマンスを確認するレプリケーションアクティビティビューア【リアルタイムレプリケーションツールDBMoto】

レプリケーションアクティビティビューワは、特定のレプリケーションインスタンス中のレコード処理をグラフィカルな表現で提供します。

ミラーリングの遅延や処理量の履歴を表示することで、トランザクション量の分析を助け、DBMoto Data Replicatorのパフォーマンスを最適化する設定の発見を容易にします。

注:レプリケーションアクティビティビューアは、Microsoft Windowsグラフコントロール(MSChart.exe)を必要とします。

また、この機能は.NET Framework 3.5 SP1が必要です。(DBMoto自体(最新版)は.Net Framework 4.0で稼働します)

ビューワは3つのツールで構成されます。

■Transaction Latency Chart
※一番上のグラフです。

このグラフは最新のトランザクション処理時間(トランザクションがないときは最終のスケジュールされたミラーリングの時間)と現在の時刻を比較します。
両者間のタイムラグがトランザクション遅延時間のしきい値(Data Replciatorオプションダイアログの一般タブで設定)を超過した場合、グラフの斜線領域は赤で表示され、レプリケーションモニタのトランザクション遅延状況カラムには、しきい値警告が表示されます。

これはData Replicatorとレプリケーションの現在の設定により、Data Replicatorがトランザクションを処理しきれていない可能性を示します。

グラフの左側のカラムでは表示されたエリアで最も高く表示されている値に基づき、秒単位で値が表示されます。
グラフが更新されたときに、左側のカラムの範囲はリセットされることがあります。

グラフは自動的に3秒ごとに更新されます。このパラメータは変更できません。

※「トランザクション遅延時間のしきい値」オプションの設定箇所
transaction_latency2

グラフの色について
■グレー
Data Replicatorオプションダイアログのトランザクション遅延時間のしきい値フィールドよりも長い期間中に、新しいトランザクションがなかったことを示します。
■青
ログから読み込まれた最後のトランザクション時間以降の進行状況を示します。最後のトランザクション時間は、読み取り専用プロパティとしてレプリケーションのプロパティに記録されています。
■緑
スケジュールにより開始した最後のミラーリング時間以降の進行状況を示します。(レプリケーションプロパティにおいてレプリケーションのミラーリングインターバル設定に基づきます。)
■赤
Data Replicatorオプションダイアログのトランザクション遅延時間のしきい値フィールドで設定された制限に達していることを示します。それは、トランザクションログのチェック間隔が、処理する必要のあるトランザクションの数に追いつくことができないことを示しています。

一定期間後にレプリケーションを有効にした場合、チャートははじめに、最後に処理されたトランザクションと現在の時刻の間に大きな差があるため、赤色のグラフで高い値が表示されます。ミラーリングが開始され次第、この表示は更新されます。

■Records Processed Dial
※左下のグラフです。

インターバルごとに処理されたレコード数の平均に基づき、レコードの処理速度が表示されます。表示は3秒ごとに更新されるため、処理されたトランザクションの数は3秒ごとの平均値が表示されます。

■History Chart
※右下のグラフです。

選択したインターバルに基づき処理されたレコードの数を表示します。このチャートは10分ごとに更新されます。
このチャートで表示されている情報は、DBMotoログから取得されています。
チャートは、10分ごとにログを読み込み、レプリケーション情報を探します。
したがって、このチャートは(レプリケーションではなく)Management Centerのパフォーマンスに影響します。

パフォーマンスは、一般的にはDBMotoログがテキストファイルに収められているときよりも、データベースに収められているときのほうが良いです。
Management Centerの応答時間への影響を回避するために、必要がないときはReplication Activityタブを閉じてください。

コメントする -->

[DBMoto]DDSで作成された物理ファイルをDBMotoにてPK認識するためには(DB2 for AS/400)

DB2 for AS/400でDDS(Data Description Specifications)を使用して物理ファイル(テーブル)を作成した場合、DBMotoでPK(主キー)を認識する為に設定を変更する必要があります。

1. DBMoto Data Replicatorサービスが起動している場合は停止します。

2. AS/400の接続名を右クリックし「プロパティ」を選択します。
20150519-1

3. 「拡張された主キーを使用」をTrueへ変更します。
20150519-2

4. 既にDBMotoにてテーブルを選択済みの場合は、テーブル情報を反映するために「スキーマ情報更新」を行います。
20150519-3

以上で設定は完了です。

タグ: , ,

[DBMoto][スクリプト]条件付きレプリケーションを行うサンプルVBスクリプト

DBMotoでは下記のような条件付きレプリケーションが可能です。

・値が~を満たすときのみレプリケーション
・登録、更新、削除のうち一部のみレプリケーション

下記は登録・更新・削除時にフィールドの値が20140711未満の場合はレプリケーションしない(20140711以降のみレプリケーション)するためのサンプルスクリプトです。

登録時のみ・・・recSource.OperationType = enmOperationType.Insert
更新時のみ・・・recSource.OperationType = enmOperationType.Update
削除時のみ・・・recSource.OperationType = enmOperationType.Delete
レプリケーションを停止・・・AbortRecord = True
レプリケーションを稼働・・・AbortRecord = False

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 Record_onBeforeMapping( recSource As DBMotoPublic.IRecord, ByRef AbortRecord As Boolean, ByRef DisableReplication As Boolean)
        ' カラム名の変数
        Dim strField As String
        ' 登録・更新・削除時
        If (recSource.OperationType = enmOperationType.Insert) Or (recSource.OperationType = enmOperationType.Update) Or (recSource.OperationType = enmOperationType.Delete) Then
        ' DBのカラム名を指定して値を取得
        strField = CType(recSource.GetValueAfter("Field").ToString(), Integer)
        ' 20140711 未満はレプリケーションをスキップ(Abort=True)する
        If (strField < "20140711") Then
            AbortRecord = True
        Else
            AbortRecord = False
        End If
        End If
    End Sub

    End Class
End Namespace
タグ: