DBMotoでのBLOB・CLOBデータタイプのレプリケーションサポートについて

BLOB/CLOBのレプリケーションをサポートするデータベースは下記の通りです。

●IBM Infomix、SQL Server、MySQL
⇒リフレッシュ(全件)、ミラーリング(差分)共にBLOB/CLOBをサポートします

●IBM DB2(AS/400)、IBM DB2(LUW)、IBM DB2(z/OS)、Oracle、SAP Sybase ASE、SAP SQL Anywhere
⇒リフレッシュ(全件)のみBLOB/CLOBをサポートします

なお、DBMotoではカラム単位でマッピングを設定可能であるため、BLOB/CLOBのカラムをレプリケーション対象外と指定することで、BLOB/CLOB以外のカラムをレプリケーションする設定も可能です。

タグ: ,

[DBMoto]レプリケーションエクスポート機能でレプリケーションを移行

DBMotoには、開発環境で作成したレプリケーションを、スキーマが異なるだけでテーブル構造がまったく一緒の運用環境にコピーできる機能が用意されています。

それが今回の記事で紹介するレプリケーションエクスポート機能です。

この機能では指定したソースデータベースとターゲットデータベース間にあるレプリケーションを、同じインスタンスの別スキーマ、別インスタンス、さらには別種のデータベース間にもコピーが可能です。

設定はもちろん、マッピング、スクリプトも引き継ぐことができます。
特定のレプリケーションをコピーしない選択をすることもできます。

それでは具体的な設定方法を以下に紹介します。

設定例

  • 元のソースデータベース/スキーマ:Oracle 11g/OKAMOTO
  • 元のターゲットデータベース/スキーマ:SQL Server/(dbo)OKAMOTO
  • 先のソースデータベース/スキーマ:Oracle 11g RAC/STUDY
  • 先のターゲットデータベース/スキーマ:SQL Server/(dbo)STUDY

※いずれのデータベース/スキーマも、事前にDBMoto上に登録してください。


  1. Data Replicatorを停止します。
  2. ソース接続またはターゲット接続の「データベース名」または「スキーマ名」上で右クリックします。
    開いたメニューから「レプリケーションをエクスポート」を選択します。
  3. 000

  4. 以下のウィザードが開きます。「次へ」をクリックします。
  5. 001

  6. 既存のソース接続で、データベースとスキーマを選択します。
  7. 002

  8. 既存のターゲット接続で、データベースとスキーマを選択します。
  9. 003

  10. 新規のソース接続で、エクスポートで作成されるレプリケーションの、ソースとなるデータベースおよびスキーマを選択します。
  11. 004

  12. 新規のターゲット接続で、エクスポートで作成されるレプリケーションの、ターゲットとなるデータベースおよびスキーマを選択します。
  13. 005

  14. 「4」と「5」で指定したデータベース・スキーマ間にあるレプリケーションの一覧が表示されます。
    この中からエクスポート対象とするレプリケーションを選択します。
  15. 006

  16. エクスポート先のテーブル名が、オリジナルのテーブル名と異なる場合は「テーブル」欄のボタンから開くウィザードにて、テーブル名を指定できます。
  17. 007

  18. 最後にサマリーが表示されます。「開始」をクリックするとセットアップが始まります。
  19. 009

  20. 進捗が表示され、プログレスバーが右端まで進めば終了です。
  21. 010

  22. エクスポート機能で作成されたレプリケーションには「(オリジナルのレプリケーション名)_EXP」という名前が設定されます。適宜変更を加えることが可能です。
  23. 011


なお、使用時には以下の点にご注意ください。

  • データベース側でなく、DBMoto側で定義したPK(擬似PK)の設定は引き継がれません。
    これはレプリケーションで指定するのではなく、テーブルで指定する設定のためです。
  • フィールドの型やサイズといった、テーブル構造がエクスポート元と先で一致していないと、そのレプリケーションはエクスポートされません。
  • エクスポート先のスキーマにテーブルが存在しない場合もエクスポートされません。テーブルを自動的に作成することはありません。
コメントする -->

Storage I/Oの監視【DPA (旧Ignite)のVer9機能】

DPA(旧Ignite)のVer9から、新たにStorage I/Oの監視機能が追加されました。

データベースの速度が低下する原因は、CPUの負荷だけでなくStorage I/Oの負荷も関係しています。
DPAでは、SQL文の応答時間において、ストレージのレイテンシやスループット性能がどこまで影響を及ぼしているかを確認することができます。

さらに現在と過去の動向を相互に関連付けながら監視できるため、Storge I/Oの負荷がデータベースのボトルネックとなっているかを容易に特定できます。

閲覧方法も他の監視項目と同様、Webブラウザ上でクリックしてドリルダウンしながら確認できます。
DPAのWebブラウザ画面で監視するデータベースを選択し、”Storage I/O”のタブをクリックします。

DPA1

クリックすると、下の画像のようなグラフが表示されます。

DPA2

上のグラフでは、ファイル別にStorage I/0が割いていた時間を表示しています。
タブの”Read” “Write”を選択することで、読み込みと書き込みの時間別に確認することもできます。
下のグラフでは、全待機時間の中でStorage I/0に割いている時間の割合を表示しています。

またタブの”Current”をクリックすると現在のI/O負荷の状況を一括で確認できます。

DPA3

日次ごとのグラフで表示されていますが、クリックすることで時間ごと、分ごとにドリルダウンできます。

DPA4

画面左上の”Select a File”を選択することで、選択したファイルのより詳細な情報を閲覧できます。

DPA5

画面上部では、表示方法を切り替える事でレイテンシやスループットの動向を確認できます。
画面下部では、タブを切り替える事でSQL文やDBのユーザを特定することが出来ます。

DPA6

タグ:

SAP HANA から他RDBからのレプリケーション(クライアント準備編、AWSを利用)

WindowsからSAP HANAへ接続するためには以下のツールが必要です。
・SAP HANA Client(接続ドライバ)
・SAP HANA Studio(GUI開発ツール)

今回はWindowsマシンからSAP HANA Developer Editionへ接続する手順を紹介します。
事前にSAP HANA on the AWSでDBレプリケーション(AWS準備編)にてSAP HANAの構築が完了していることが前提となります。

【SAP HANA Clientのインストール】

SAP HANA ClientはODBCやJDBCなどのドライバが含まれているツールでWindowsなどのクライアントマシンから接続する際に必要となります。
また、DBMotoから接続する際にも必要となります。

以下のサイトからダウンロード可能です。(Developer Editionのみとなります)
https://hanadeveditionsapicl.hana.ondemand.com/hanadevedition/
20140922-09

インストール手順は特に難しくなく、ウィザードに沿って進めていくのみです。
20140922-11

【SAP HANA Studioのインストール】

SAP HANA StudioはSAP HANAをWindows等のクライアントマシンからGUIで一元管理が行える開発ツールです。Eclipseベースとなっており、イメージとしてはDB2のクライアント開発ツールであるIBM Data Studioのようなものです。
なお、SAP HANA Studioインストール時には予めJREがインストールされている必要があります。

以下のサイトからダウンロード可能です。(Developer Editionのみとなります)
https://hanadeveditionsapicl.hana.ondemand.com/hanadevedition/
20140922-10

インストール手順は特に難しくなく、ウィザードに沿って進めていくのみです。
20140922-12

【SAP HANA StudioからSAP HANAへ接続】

SAP HANA Studioを使用して実際にSAP HANAのシステムへ接続してみます。
まずSAP HANA Studioを起動し、Add Systemを選択します。
20140922-13

Host NameとInstance Numberを入力します。
Host NameはAWS上のPublic DNSまたはPublic IPからコピペします。
Instance Numberは00です。
20140922-14

SAP HANAへ接続するためのUser NameとPasswordを入力します。
User NameはSYSTEM、パスワードはDeveloper Editionの場合はMANAGERとなります。最後にFinishを押下します。
20140922-15

接続が行えますと下記のようにフォルダがツリー表示されます。
20140922-16

続いて、DBMoto検証用にスキーマ(カタログ)を作成するのですが、Oracleなどと同様にユーザ名=スキーマのようですので、ここではユーザを作成します。
20140922-17

ユーザ名とパスワードを入力し、デプロイボタンをクリックします。
今回はスキーマとしての用途での作成のため、権限(ロール)の設定は特に行っていません。
20140922-18

作成したユーザ名が正しく表示されていることを確認します。
20140922-19

以上でクライアントでの準備は完了です。

タグ: ,

SAP HANA で、他RDBからのレプリケーション(AWS準備編)

SAP HANAはDBMotoに対応しており、OracleやSQL ServerなどのRDBからSAP HANAに対してレプリケーション(全件・差分)することが可能です。

今回はAmazon Web Service(以下AWS)のEC2上にSAP HANAを構築する手順をご紹介します。SAP HANA on the AWSというサービスでSAP HANA Developer Editionを使用します。

【前準備】
1. AWSのアカウントがない場合は作成します。
2. SCN(SAP Community Network)のユーザー登録を行います。
http://scn.sap.com/docs/DOC-18437

3. AWSでKey Pairを作成します。
20140922-01

【SAP HANA構築】
1. 下記のサイトへアクセスしSCNアカウントでログインします。
https://sapsolutionsoncloudsapicl.netweaver.ondemand.com/clickthrough/index.jsp?solution=han&provider=amazon

2. AWS Account ID(AWSのアカウントページで確認可能)を入力し、RegionをAsis Pacific(Tokyo)にします。
20140922-02

3. StackのNameに任意の名前を入力します。
20140922-03

4. HANAInstanceSizeは既定の「m2.xlarge」で十分です。KeyNameはAWSで作成したKey Pairの名前を入力します。
20140922-04

5. この画面では何もせずそのままNextで次へ進みます。
20140922-05

6. 内容に問題がなければContinueをクリックします。
20140922-06

7. Create New Stackをクリックします。
20140922-07

8. EC2のInstance画面を開くと、SAP HANAのインスタンスが作成されていることが確認できます。初期インストールには数分かかります。最終的にStatus Checksに2/2 checksと表示されればインストールは完了です。
20140922-08

以上でAWSへのSAP HANA構築は完了です。

【補足】
費用はSAP HANAのライセンスは不要でAWSの料金として1時間当たり$0.62程度発生するようです。

タグ: ,

Database Performance Analyzer (旧Ignite)サーバから問題のあるセッションを切断

Igniteはレコードをロックしてしまっているなどの、問題のあるセッションを特定し、Igniteサーバから切断することが可能です。
セッション情報はIgniteのWebブラウザ上で、対象のDBのSessを選択することで閲覧出来ます。
Ignite_Session1

下記のような画面が表示され、アクティブなセッション数等を確認できます。
現在の状況を確認するには、画面上部にあるCurrentをクリックします。
Ignite_Session2

レコードのロック等でブロックされているセッションがある場合には、
画面右下のReal-Time SessionsCurrently Blockedにブロックされているセッション数が表示されます。
こちらをクリックすると、より詳細な情報が確認できます。
Ignite_Session3

下の画面のように、ユーザ名がCLIMBのセッションがロックしているため、ユーザ名DBMOTOのセッションは待機しているということがわかります。
Ignite_Session4

ロックしているセッションを切断します。
Action > Kill Sessionよりセッションを切断することが出来ます。
Ignite_Session5

これによりブロックが解消されました。
Sessionsタブをクリックすると現在の全てのセッション情報が確認できます。
Ignite_Session6

先ほど切断したCLIMBのセッションが無いことが確認できます。

タグ:

[DB2]レプリケーション作成時にエラー発生した際の対処法:STATE:54040 – CODE:-1424

対象DBMoto:すべてのバージョン
対象データベース:DB2(Windows, Linux, AIX, z/OS)
レプリケーションモード:ミラーリング・シンクロナイゼーションでトリガーモード使用時
発生条件:レプリケーション作成完了時にエラー発生

●エラー内容:

ログリーダーに新しいレプリケーションを追加する際にエラー。
コマンド’CREATE TRIGGER …; END’の実行にエラーが発生しました。
SqlDb2DRDA: DRDA Execute exception occurred.execute: Too many transition tbles: “2” – STATE:54040 – CODE:-1424
execute: Too many transition tbles: “2” – STATE:54040 – CODE:-1424

●エラー発生理由

DBMotoはトリガーを使用した差分レプリケーションの際に、レプリケーション定義作成と同時に該当テーブルに対してトリガーを作成します。
本エラーはそのトリガー作成するために必要な「システム一時表スペース」がDB2側で不足していることが原因です。
テーブルのカラム数が多い場合に発生することがあります。

●対処法

対処法は以下の通りとなります。

(1)バッファープールのサイズを 32KB で作成する
(2)(1)を使用するようにシステム一時表スペースを作成する

以下はDB2クライアントアクセスツール「IBM Data Studio」での対処手順です。

1. バッファー・プールを右クリックし「バッファー・プールの作成」を選択します。
20140812-01

2. ページ・サイズを「32768」に変更して保存します。
20140812-02

3. 変更プランで適用します。
20140812-03 20140812-04 20140812-05

4. 表スペースを右クリックし「システム一時表スペースの作成」を選択します。
20140812-06

5. バッファー・プールを先ほど選択したものへ変更し保存します。
20140812-07

6. 変更プランで適用します。
20140812-08 20140812-09 20140812-10

以上で設定は完了です。
DBMotoにて正常にレプリケーションを作成できることをご確認ください。

※バッファプールはCLPにて以下のコマンドで確認可能です。
SELECT BPNAME, BUFFERPOOLID, NPAGES, BLOCKSIZE, PAGESIZE FROM SYSCAT.BUFFERPOOLS
20140812-11

※表スペースはCLPにて以下のコマンドで確認可能です。
LIST TABLESPACES SHOW DETAIL
20140812-12

 

タグ:

DBMoto ver8.2.1.10 PostgreSQLのXML,UUID型に対応開始

DBMoto ver8.2.1.10より、PostgreSQLのXML型UUID型のリフレッシュ、およびミラーリングの対応を開始しました。

PostgreSQLにターゲットテーブルを作成する際にも、XML型、UUID型の指定が可能です。

PostgreSQL

マッピング情報でも各データ型の表示が確認できます。

PostgreSQL1

コメントする -->

Database Performance Analyzer (旧Ignite)の情報からSQLチューニング実践:索引編

SQLチューニングは、データベースのパフォーマンスを向上させるために欠かせません。パフォーマンスの根本的な原因は、SQL文による可能性が高いからです。

IgniteはSQLチューニングにも役立ちます。今回は得た情報からSQLチューニングを行なう例をご紹介します。

まず今回使用するサンプルテーブルは以下のようなものです。

テーブル名は”TOSHIHIRO.EMPLOYEE_TEST”で400万件のレコードが入っている状態です。データベースはOracleを使用します。

SQL tuning for IGNITE

・E_ID:社員のIDナンバー [ PK (プライマリーキー) 付与 ]
・E_NAME:社員の名前
・E_SALARY:社員の年収

このテーブルから社員の月収が一千万以上の社員情報のみ抽出します。以下のようなSQL文を実行してみます。
SQL > select * from TOSHIHIRO.EMPLOYEE_TEST where E_SALARY/12>=10000000

結果は次のようになりました。
SQL tuning for IGNITE1

1.2秒かかっています。Igniteを使用して、このSQL文を調べてみます。
SQL tuning for IGNITE2

上の棒グラフにより、かかった時間と、どの要因によるものかが特定できます。 今回は赤いのでMemory/CPUによるものです。クリックすると解決策が掲示されます。
SQL tuning for IGNITE3

解決策から索引を付与することにより、時間を短くすることができることがわかります。 SQL Dateから今回のSQL文の実行経過も確認できます。
SQL tuning for IGNITE4

索引を使用するため、SQLチューニングを行った場合の効果も確認できます。
SQL tuning for IGNITE5

索引を付与したことにより、Costの値が小さくなってることが確認できます。

実際にSQLチューニングを行った、以下のSQL文を実行します。
SQL > select * from TOSHIHIRO.EMPLOYEE_TEST where E_SALARY>=10000000*12

結果は次のようになります。
SQL tuning for IGNITE6

大幅に時間が短縮されました。

タグ:

DBMotoのリモート接続モードを使用した負荷分散

DBMotoは「リモート接続モード」に対応しています。
例えばDBMotoを2ライセンス(2構成)ご購入いただいている場合、ライセンスは以下の方法にて生成することが可能です。それぞれのメリットとデメリットもまとめました。

1. 2ライセンスを1つのライセンスファイルにまとめる

【メリット】1台のDBMotoマシンのみで運用可能
【デメリット】2構成分を1つのマシンでレプリケーションするため負荷がかかる可能性がある

2. 2ライセンスそれぞれ別々のライセンスファイルとする

【メリット】DBMotoマシンは2台なのでレプリケーション処理を分散可能
【デメリット】DBMotoマシンを2台用意する必要がある

さて、2の別々のライセンスファイルとした場合のデメリットを補う方法が「リモート接続モード」です。リモート監視用のDBMotoマシンをもう1台用意していただく必要がありますが、2台のレプリケーション用DBMotoマシンへ接続可能であるため、事実上1の1つのライセンスファイルにまとめたときと同様に一元管理が可能となります。
※しかも2のメリットである負荷分散も可能!!

接続イメージは下記の通りです。

●リモート接続モード設定手順

リモート接続モード用のDBMotoマシンをインストール時に「Remote Management Center Installation」を選択します。このモードでインストール時はライセンスファイルの適用は不要です。
20140526-5

インストール完了後、レプリケーション用のDBMotoマシンへリモート接続設定を行います。まず「新しいサーバを追加」を選択します。
20140526-1

任意の接続名と接続先IPアドレスを入力します。ポートは既定の58361のままで問題ございません。
20140526-3

実際に2台のレプリケーション用DBMotoマシンへ接続した際の画面です。このようにmetadataがそのまま読み込まれます。
20140526-4

【リモート接続モード使用時の注意点】
・リモート接続の際は、レプリケーション用DBMotoマシンにてDBMoto Server Agentが稼働している必要があり、ポート58361の解放が必要です。
・リモート接続後のmetadataにて直接設定が可能ですが、DB接続時にはリモート接続モードのDBMotoマシンから接続する仕様です。DB接続の際はリモート接続モードのDBMotoマシンにDBの各ドライバが必要です。
・DBMoto Data Replicatorの実行はレプリケーション用DBMotoマシンにて行います。

 

コメントする -->

2つのソーステーブルからターゲットの一つのレコードにレプリケーション

2つのテーブルを1つのテーブルにレプリケーションす場合には以下のような手順で実施します。
1.一つのターゲットテーブルに対して、各ソーステーブルからレプリケーションを作成します。
2.ターゲットテーブルでのトランケートや結合を制御するため、各レプリケーションでスクリプトを設定します。
3.レプリケーションを一つのグループに設定します。
4.全てのレコードを削除し、ターゲットテーブルをクリーンアップします。
5.レプリケーションを実行します。

画像1テーブル1
画像2マッピング
画像3スクリプト

例として、以下のようなレプリケーションを行う場合をご紹介します。

MULTITEST1 > MULTITEST3のレプリケーションを作成します。
1.マッピング設定でID, NAME, COMPANYをマッピングします。
2.UNITにはvbNullをマップします。

3.レプリケーションを無効にし、ウィザードを完了します。
4.レプリケーションのプロパティを開きます。
5.スクリプトの使用にチェックを入れ、以下のスクリプトを追加します。

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

Namespace DBRS
    Public Class ReplicationScript : Inherits IreplicationScript
      Dim PrimaryKey As String
      Dim Field As String
      Dim Table2 As String 

      Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean, ByRef Filter As String)
    'リフレッシュ時のレコード削除を無効化
        CancelTruncate = True
      End Sub

      Public Overrides Sub Record_onAfterMapping( recSource As DBMotoPublic.IRecord,  recTarget As DBMotoPublic.IRecord, ByRef AbortRecord As Boolean, ByRef DisableReplication As Boolean)
        Table2 = """asami"".MULTITEST2" 'もう一方のテーブル
        PrimaryKey = "ID" '主キー
        Field = "UNIT" 'vbNullをマップしたフィールド
        '主キーが変更されていない場合
        If recTarget.GetValueAfter(PrimaryKey) = Nothing Then
          recTarget.SetValueAfter(Field, Nothing)
        '主キーが変更されている場合(またはinsert)
        Else
          InterpolationFields (recTarget)
        End If
      End Sub
      '補間するためにFieldの値を検索
      Private Sub InterpolationFields (recTarget As IRecord)
        Dim cmd As System.Data.IdbCommand
        Dim rs As System.Data.IdataReader
        Dim SQL As String
        'Table2からPrimaryKeyのレコードを検索
        SQL = "Select * From " + Table2 + " Where " + PrimaryKey + " = " & recTarget.GetValueAfter(PrimaryKey)
        'レプリケーションのソース接続情報を取得
        cmd = SourceConnection.CreateCommand
        'コマンドにSQLクエリを代入
        cmd.CommandText = SQL
        'SQLを実行
        rs = cmd.ExecuteReader
        'FieldのvbNullを取得した値に置き換え
        While rs.Read
          recTarget.SetValueAfter(Field, rs(Field))
        End While
        rs.Close
      End Sub
    End Class
End Namespace
[/vb]

MULTITEST2 > MULTITEST3のレプリケーションを作成します。
1.マッピング設定でID, NAME, UNITをマッピングします。
2.COMPANYにはvbNullをマップします。
3.レプリケーションを無効にし、ウィザードを完了します。
4.レプリケーションのプロパティを開きます。
5.スクリプトの使用にチェックを入れ、以下のスクリプトを追加します。

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

Namespace DBRS
    Public Class ReplicationScript : Inherits IreplicationScript
      Dim PrimaryKey As String
      Dim Field As String
      Dim Table1 As String
      Dim Table2 As String
      Dim Table3 As String 

      Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean, ByRef Filter As String)
            CancelTruncate = True
      End Sub

      Public Overrides Sub Record_onAfterMapping( recSource As DBMotoPublic.IRecord,  recTarget As DBMotoPublic.IRecord, ByRef AbortRecord As Boolean, ByRef DisableReplication As Boolean)
        Table1 = """asami"".MULTITEST1" 'もう一方のソーステーブル
        Table2 = """asami"".MULTITEST2" 'ソーステーブル
        Table3 = "ASAMI.MULTITEST3" 'ターゲットテーブル
        PrimaryKey = "ID" '主キー
        Field = "UNIT" 'もう一方のレプリケーションでvbNullをマップしたフィールド
        'insert,update,deleteでの場合分け
        Select Case recTarget.OperationType
          'insertの場合、ターゲットのFieldに対してupdateを実施
          Case enmOperationType.Insert
            UpdateFields(recTarget)
            AbortRecord = True
          'updateの場合
          Case enmOperationType.Update
            '主キーが変更されている場合、ターゲットの変更前のFieldをNullにupdate
            If recTarget.GetValueAfter(PrimaryKey) <> recTarget.GetValueBefore(PrimaryKey) Then
              SetNull(recTarget)
            End If
            'ターゲットのFieldに対してupdateを実施
            UpdateFields(recTarget)
            AbortRecord = True
            'Deleteの場合
            Case enmOperationType.Delete
        'Fieldをnullにupdate
              SetNull(recTarget)
              AbortRecord = True
        End Select
      End Sub

      'Fieldに対するupdate
      Private Sub UpdateFields (recTarget As IRecord)
        Dim SQL As String
        SQL = "Update " + Table3 + " Set "
        'FieldがNullの場合はNullにupdate
        If recTarget.GetValueAfter(Field) = Nothing Then
          SQL = SQL + " " + Field + " = Null "
        'Fieldの値でupdateを実施
        Else
          SQL = SQL + " " + Field + " = '" + recTarget.GetValueAfter(Field) + "'"
        End If
        '主キーに変更がない場合は変更前の主キーのレコードをupdate
        if recTarget.GetValueAfter("ID") = Nothing then
          SQL = SQL + " Where " + PrimaryKey + " = '" + recTarget.GetValueBefore(PrimaryKey) +  "'"
        '主キーが変更されている場合は変更後の主キーのレコードをupdate
        else
          SQL = SQL + " Where " + PrimaryKey + " = '" + recTarget.GetValueAfter(PrimaryKey) +  "'"
        End if 

        AddLog ("UpdateFields SQL: " + SQL, 0)
        Try
          Dim cmd As System.Data.IdbCommand
          cmd = TargetConnection.CreateCommand
          cmd.CommandText = SQL
          cmd.ExecuteNonQuery()
        Catch Ex As System.Exception
          AddLog (Table2 + ".*_onAfterFieldMapping (UpdateFields): Cannot update field UNIT on Table " + Table3 + " (" + Ex.Message + ")", 1)
        End Try
      End Sub
      'FieldをNullにupdate
      Private Sub SetNull (recTarget As IRecord)
        Dim SQL As String

        SQL = "Update " + Table3 + " Set " + Field + " = Null Where ID = '" + recTarget.GetValueBefore(PrimaryKey) +  "'"
        AddLog ("SetNull: " + SQL, 0)
        Try
            Dim cmd As System.Data.IdbCommand
            cmd = TargetConnection.CreateCommand
            cmd.CommandText = SQL
            cmd.ExecuteNonQuery()
        Catch Ex As System.Exception
            AddLog (Table2 + ".*_onAfterFieldMapping (SetNull): Cannot update field UNIT on Table " + Table3 + " (" + Ex.Message + ")", 1)
        End Try
      End Sub
    End Class
End Namespace
[/vb]

このようにスクリプトを使用することでターゲットテーブルの一つのレコードを2つのソーステーブルから作成可能です。
しかし、このスクリプトには以下のような制限もあります。
・リフレッシュ時には手動でのターゲットテーブルのレコード削除が必須
・MULTITEST1に存在しない主キーをMULTITEST2にinsertした場合、MULTITEST3にその情報は連携されない
等々

そのため、連携を行うテーブルに合わせてスクリプトをカスタマイズする必要があります。

コメントする -->

DBMotoでの全件リフレッシュ・差分ミラーリングの再設定手順

【2014/1/14・3/31記事改訂】

●全件リフレッシュの再設定

リフレッシュは通常初回の1回のみ行われますが、何らかの理由でミラーリングが行えなくなって整合性が失われた場合(ログが流れてしまった等)などは、リフレッシュの再設定を行うことが可能です。

■バージョン8.1までの場合
1. レプリケーション名を右クリック「プロパティ」を開きます。
※グループ化されている場合はグループ名を右クリック「レプリケーションを編集」です。

2. 左ペインから「スケジュール」を選択し、「初期リフレッシュ実行」にチェックが入っていることを確認します。その後「現在」のボタンをクリックします。

3. 現在の時刻が取得されたことを確認し、設定は完了です。次回レプリケーション再開時にリフレッシュが実行されます。

■バージョン8.2以降の場合
1. レプリケーション名(あるいはグループ名)を右クリックすると「初期リフレッシュを実行」という項目があります。クリックします。
rerun_initial_refresh

2.クリックすると、次のような確認のためのアラートが出力されます。「はい」をクリックしますと、直ちにリフレッシュが開始されます。
rerun_initial_refresh_alert

※リフレッシュを行った際には、リフレッシュ開始前にミラーリング用のトランザクションIDを自動で再取得しますので、「初期リフレッシュ+ミラーリング」のレプリケーションの場合は、ミラーリングのトランザクションID再設定作業は不要です。

●差分ミラーリングの再設定

ミラーリングはDBのトランザクションログに保存されているトランザクションIDで管理されています。
何らかの理由で古いIDからのミラーリングを再度行われる場合には、IDを戻すことで実現可能となります。

1.  レプリケーション名を右クリック「プロパティ」を開きます。
※グループ化されている場合はグループ名を右クリック「レプリケーションを編集」です。

2.  左ペインから「優先」を選択し、「トランザクションID」の項目を確認します。これが今現在レプリケーションが完了済みのトランザクションIDとなります。このIDを直接任意の古いIDに変更することももちろん可能です。
任意のタイムスタンプの位置のIDを取得するためには、トランザクションIDの右側のボタンをクリックします。

3. 「日付または時刻」にチェックを入れ、戻したいIDの位置のタイムスタンプを設定します。

4. 元の画面に戻り、トランザクションIDが指定のタイムスタンプの位置のものに戻っていることを確認します。設定はこれで完了です。次回レプリケーション再開時にこのトランザクションIDからミラーリングが再開されます。

DBMotoでの全件リフレッシュ・差分ミラーリングの再設定手順 はコメントを受け付けていません -->

Syniti DR(DBMoto)でメール通知を行うアラート設定

Syniti DRでは、データベース間でのデータ連携に際して何らかのエラーやイベントが発生したときに、メールにてアラートを発する機能があります。

この機能はReplication Agent(旧Data Replicator)オプション(歯車アイコン)とレプリケーション個別での設定が可能です。

メールサーバの設定

使用するメールサーバの設定はReplication Agentオプションのメールタブで設定可能です。

Replication Agentアラート

Replication Agentオプションのアラートタブを開き、「アラートを追加」横のドロップダウンリストから「イベントアラートを追加」をクリックします。

イベントアラートにはデータ転送で使われるReplication Agent自体に問題が発生した場合に発せられるサーバイベントと個別のレプリケーションにおいて問題が発生した場合に発せられるレプリケーションイベントの2種類があります。

以降ではそれぞれのイベントにおける項目に関して説明します。

■サーバイベント

  • Replication Agentの開始:Replication Agent開始時にレポートを出します。
  • Replication Agentの停止:Replication Agent停止時にレポートを出します。
  • ログファイルサイズの最大値:ログファイルのサイズが右側で設定された最大値に到達した際に通知を出します。
  • Replication Agentの停止許容時間:Replication Agentが止まってからの時間が一定の長さに到達した際にメールを通知します。例えば、3時間に設定されたとき、ダウンタイムが3時間に到達した際にメールが一度送られます。
  • Replication Agent情報:Replication Agentの「情報」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「情報」メッセージを絞り込みます。
  • Replication Agentエラー:Replication Agentの「エラー」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「エラー」メッセージを絞り込みます。
  • Replication Agent警告:Replication Agentの「警告」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「警告」メッセージを絞り込みます。

■レプリケーションイベント

  • レプリケーション情報:それぞれのレプリケーションで、「情報」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「情報」メッセージを絞り込みます。
  • レプリケーションエラー:それぞれのレプリケーションで、「エラー」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「エラー」メッセージを絞り込みます。
  • レプリケーション警告:それぞれのレプリケーションで、「警告」レベルで生成されたすべてのコメントを通知します。フィルターオプションに部分文字列を入力することにより、受け取りたい「情報」メッセージを絞り込みます。
  • レプリケーションの待ち時間が指定した:現在の時間を、処理された最新のトランザクション時間(トランザクションがない場合は最新のスケジュール起動したミラーリング時間)と比較したときに、そのタイムラグがReplication Agentオプションの「一般」タブで指定した「トランザクション遅延時間のしきい値」を超えたときに通知をだします。「無効なレプリケーションを除外」するにチェックを入れると無効化されているレプリケーションを除外します。
  • レプリケーションのダウンタイムが次の値:いずれかのレプリケーションが停止してからの経過時間が、右で設定した数値に達したときにメールで通知します。例えば、3時間に設定されたとき、レプリケーションのダウンタイムが3時間に達したときに、メールを一度送信します。「無効なレプリケーションを除外」するにチェックを入れると無効化されているレプリケーションを除外します。
  • 検証の差異:レプリケーションプロパティのスケジュール>検証スケジュールにて設定されたソース/ターゲットテーブルの比較検証が実施された際に、差異を検出した場合に通知をだします。

アラートスケジュール

受け取るメールの数を制限します。デフォルトでは30分ごとにメールを1通送ります。無効にすると、すべてのアラートが個別でメール送付されるため、メールサーバが過負荷になる可能性があります。

メッセージレイアウト

  • 宛先:メールの送信先を表す欄になります。メールアドレスをセミコロン区切りで入力してください。
  • 件名:メールの件名になります。
  • 本文:メールの本文となります。[ALERT_XXXX]はシステムからのメッセージが自動挿入されます。
  • HTMLフォーマット:HTMLフォーマットでメールを送信するオプションです。デフォルトではオフです。
  • 添付:Syniti DRの直近のログを添付するかどうかのオプションです。

レプリケーション個別アラート

レプリケーションプロパティから個別のレプリケーションに対してアラートを設定することもできます。この際に設定できるレポートはレプリケーションイベントのみとなります。

タグ: ,

DBMotoレプリケーションに必要なMySQLユーザ権限

DBMotoで使用するMySQLユーザに必要な権限は下記の通りです。
ユーザ名を「dbmoto」とした場合の例となります。
※ワイルドカードとして”*”を使用する例も記載しています。

●ミラーリング複製元ソース用(トリガーを使用する場合)

// ユーザ作成
>CREATE USER ‘dbmoto’@’DBMotoマシンIPアドレス’ IDENTIFIED BY ‘dbmoto’;

// 読み取り権限(テーブル用)
>GRANT SELECT ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT SELECT ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// トリガー作成削除権限(テーブル用)
>GRANT TRIGGER ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT TRIGGER ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// トリガー有効化権限 ※バイナリログが有効化されていない場合は不要
>GRANT SUPER ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// テーブル作成削除権限(トリガーログテーブル用)
>GRANT CREATE, DROP ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT CREATE, DROP ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// 編集権限(トリガーログテーブル用)
>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// 権限反映
>FLUSH PRIVILEGES;

●ミラーリング複製元ソース用(MySQLバイナリログを使用する場合)

// ユーザ作成
>CREATE USER ‘dbmoto’@’DBMotoマシンIPアドレス’ IDENTIFIED BY ‘dbmoto’;

// 読み取り権限(テーブル用)
>GRANT SELECT ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT SELECT ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// バイナリログ用権限
>GRANT PROCESS, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
※MySQL 5.1のみ、上記に加えてFILE, SUPERの権限が必要です。

// 権限反映
>FLUSH PRIVILEGES;

●ミラーリング複製先ターゲット用

// ユーザ作成
>CREATE USER ‘dbmoto’@’DBMotoマシンIPアドレス’ IDENTIFIED BY ‘dbmoto’;

// ターゲットテーブル編集作成権限
>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON <SCHEMA>.<TABLE> TO ‘dbmoto’@’DBMotoマシンIPアドレス’;
>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON *.* TO ‘dbmoto’@’DBMotoマシンIPアドレス’;

// 権限反映
>FLUSH PRIVILEGES;

タグ: ,

DBMotoレプリケーションに必要なSQL Serverユーザ権限

【2014/1/30 記事改訂】

DBMotoで使用するSQL Serverユーザに必要な権限は下記の通りです。
ユーザ名を「dbmoto」とした場合の例となります。

■SQL Server Management Studioから簡易的に設定する場合

●テーブル用(ソース・ターゲット共通)

1. SQL Server Management Studioからデータベースに接続し、セキュリティ⇒ログイン⇒新しいログイン を選択します。

2. 認証方法は「SQL Server認証」を必ず選択してください。

3. ユーザマッピングの画面にて権限を付与したいレプリケーション対象のデータベース(スキーマ)にチェックを入れ、データベースロールにて「db_owner」にチェックを入れます。
※画面例ではVeeamBaukupというデータベースに対して権限を付与しています。
※レプリケーション対象のデータベースすべてに設定を行ってください。
※トランザクションレプリケーション(ミラーリング・シンクロナイゼーション)で、トリガーを使用する場合にはトリガーを配置するデータベースに対しても設定を行ってください。

●ディストリビュータ用

トランザクションレプリケーション(複製元ソース)でディストリビュータを使用する場合には、上記のテーブル専用ユーザとは別にsysadmin権限を持ったユーザが必要になります。
ユーザ作成画面にて、サーバーロールを選択し、サーバーロールで「sysadmin」にチェックを入れてユーザを作成してください。

■コマンドラインから最小限の権限を設定する場合:

●ミラーリング複製元ソース用

<※トリガー使用の場合>

// ログイン作成
>create login dbmoto with password = ‘dbmoto’;

// 使用データベース(テーブル用)※データベース名をclimbとする
>use climb;

// ユーザ作成
>create user dbmoto;

// セッション権限
>grant connect to dbmoto;

// 読み取り権限
>exec sp_addrolemember ‘db_datareader’, ‘dbmoto’; 又は
>grant select on schema::dbo to dbmoto; 又は
>grant select on dbo.テーブル名 to dbmoto;

// トリガー作成削除権限
>grant alter on schema::dbo to dbmoto;
>grant create table to dbmoto;

// 使用データベース(トリガーログテーブル用)※データベース名をdbmtrgとする
>use dbmtrg;

// ユーザ作成
>create user dbmoto;

// セッション権限
>grant connect to dbmoto;

// 読み取り権限
>exec sp_addrolemember ‘db_datareader’, ‘dbmoto’; 又は
>grant select on schema::dbo to dbmoto; 又は
>grant select on dbo.テーブル名 to dbmoto;

// テーブル作成削除権限
>grant alter on schema::dbo to dbmoto;
>grant create table to dbmoto;

// 編集権限
>exec sp_addrolemember ‘db_datawriter’, ‘dbmoto’ 又は
>grant insert, update, delete on schema::dbo to dbmoto;

<※ディストリビュータ使用の場合>

// テーブル用ログイン作成
>create login dbmoto with password = ‘dbmoto’;

// 使用データベース(テーブル用)※データベース名をclimbとする
>use climb;

// ユーザ作成
>create user dbmoto;

// セッション権限
>grant connect to dbmoto;

// 読み取り権限
>exec sp_addrolemember ‘db_datareader’, ‘dbmoto’; 又は
>grant select on schema::dbo to dbmoto; 又は
>grant select on dbo.テーブル名 to dbmoto;

// ディストリビュータ用ログイン作成
>create login dbmsa with password = ‘dbmsa’;
※トランザクションレプリケーション(複製元ソース)でディストリビュータを使用する場合には、テーブル専用ユーザとは別にsysadmin権限を持ったユーザが必要になります。 ここではユーザ名をdbmsaとしています。

// sysadmin 権限
>exec sp_addsrvrolemember ‘dbmsa’, ‘sysadmin’;

●ミラーリング複製先ターゲット用

// ログイン作成
>create login dbmoto with password = ‘dbmoto’;

// 使用データベース(テーブル用)※データベース名をclimbとする
>use climb;

// ユーザ作成
>create user dbmoto;

// セッション権限
>grant connect to dbmoto;

// 読み取り権限
>exec sp_addrolemember ‘db_datareader’, ‘dbmoto’; 又は
>grant select on schema::dbo to dbmoto; 又は
>grant select on dbo.テーブル名 to dbmoto;

// 編集権限
>exec sp_addrolemember ‘db_datawriter’, ‘dbmoto’ 又は
>grant insert, update, delete on schema::dbo to dbmoto;

// テーブル作成・TRUNCATE権限
>grant alter on schema::dbo to dbmoto;
>grant create table to dbmoto;

タグ: ,