分離されたシステム間で関連情報を共有することは、データの品質と可用性を向上させることができるため、組織にとってますます重要になっています。複数のディレクトリサーバーで使用可能で一貫性のあるデータセットがあると便利な状況はたくさんあります。そのため、実行するための一般的な方法を知っています SQLサーバー データの同期は重要です。
データの可用性と一貫性は、データ複製とデータ同期プロセスによって実現できます。データレプリケーションは、フォールトトレランスまたはアクセシビリティの向上を目的として、データベースの1つ以上の冗長コピーを作成するプロセスです。データの同期とは、2つ以上のデータベース間でデータの整合性を確立し、その後の継続的な更新によってその整合性を維持するプロセスです。
多くの組織では、さまざまなシステム間でデータ同期を実行することが望ましく、困難です。データ同期を実行する必要がある多くのユースケースを見つけることができます。
データ同期のための独自の方法や全会一致で合意された方法はありません。このタスクはケースごとに異なり、データ構造が複雑なため、一見単純なはずのデータ同期でさえ複雑になる可能性があります。実際のシナリオでは、データ同期は多くの複雑なタスクで構成されており、実行に時間がかかる場合があります。新しい要件が発生した場合、データベーススペシャリストは通常、同期プロセス全体を再実装する必要があります。これを行う標準的な方法がないため、レプリケーション以外に、データ同期の実装が最適になることはめったにありません。その結果、メンテナンスが困難になり、費用が高くなります。データ同期の実装と保守は非常に時間のかかるプロセスであり、それ自体がフルタイムの仕事になる可能性があります。
おそらくMicrosoftSync Frameworkを使用して、データ同期タスクのアーキテクチャを手動で実装することも、Microsoft SQLServerを管理するためのツール内で既に作成されたソリューションから利益を得ることができます。 Microsoft SQL Serverデータベースのデータ同期を解決するために使用できる最も一般的な方法とツールについて説明し、いくつかの推奨事項を示します。
ソースと宛先の構造(データベース、テーブルなど)に基づいて、構造が類似または異なる場合のユースケースを区別できます。
これは、ソフトウェア開発ライフサイクルのさまざまな段階でデータを使用する場合によくあります。たとえば、テスト環境と本番環境のデータ構造は非常に似ています。一般的な要件は、テストデータベースと本番データベースの間でデータを比較し、本番データベースからテストデータベースにデータをインポートすることです。
構造が異なる場合、同期はより複雑になります。これは、より頻繁に繰り返されるタスクでもあります。一般的なケースは、あるデータベースから別のデータベースにインポートすることです。最も一般的なケースは、あるソフトウェアが別の会社によって管理されている別のソフトウェアからデータをインポートする必要がある場合です。通常、インポートはスケジュールに基づいて自動的に実行する必要があります。
使用する方法は、個人的な好みと解決する必要のある問題の複雑さによって異なります。
構造がどれほど類似しているかに関係なく、データ同期を解決するために4つの異なる方法を選択できます。
最も簡単で面倒な解決策は、同期用のSQLスクリプトを手動で作成することです。
INSERT
、UPDATE
、およびDELETE
の3つのスクリプトが必要になるため、非常に面倒です。INSERT
、UPDATE
、場合によってはDELETE
)を変更する必要があります。テーブルSource
と列ID
の間で同期を行いますおよびValue
、および同じ列のテーブルTarget
。
テーブルに同じ主キーがあり、ターゲットテーブルに自動インクリメント(ID)主キーがない場合は、次の同期スクリプトを実行できます。
ビジュアルコミュニケーションデザインとグラフィックデザイン
-- insert INSERT INTO Target (ID, Value) SELECT ID, Value FROM Source WHERE NOT EXISTS (SELECT * FROM Target WHERE Target.ID = Source.ID); -- update UPDATE Target SET Value = Source.Value FROM Target INNER JOIN Source ON Target.ID = Source.ID -- delete DELETE FROM Target WHERE NOT EXISTS (SELECT * FROM Source WHERE Target.ID = Source.ID)
この方法では、ツールを使用してソースデータとターゲットデータを比較できます。比較プロセスでは、ソースデータベースとの違いをターゲットデータベースに適用するSQLスクリプトが生成されます。
データの比較と同期のためのプログラムはたくさんあります。これらのプログラムはほとんど同じアプローチを使用します。ユーザーはソースデータベースとターゲットデータベースを選択しますが、他の選択肢としては、DBバックアップ、SQLスクリプトを含むフォルダー、またはソース管理システムへの接続があります。
ヘッダーファイルを使用したC ++
以下は、データ比較アプローチを使用する最も一般的なツールです。
最初のステップでは、データが読み取られるか、ソースとターゲットからのより大きなデータのチェックサムが読み取られます。次に、比較プロセスが実行されます。
これらのツールは、同期のための追加設定も提供します。
データの同期に必要な次の構成オプションを設定する必要があります。
デフォルトでは、主キーまたはUNIQUE
制約が使用されます。主キーがない場合は、列の組み合わせを選択できます。同期キーは、ソースの行とターゲットの行をペアにするために使用されます。
デフォルトでは、テーブルは名前でペアになっています。これを変更して、必要に応じてペアリングすることができます。 dbForge Data Compareソフトウェアでは、SQLクエリをソースまたは宛先として選択できます。
確認後、ツールはソースデータとターゲットデータを比較します。プロセス全体は、すべてのソースデータとターゲットデータをダウンロードし、指定された基準に基づいてそれらを比較することで構成されます。デフォルトでは、同じ名前のテーブルと列の値が比較されます。すべてのツールは、列名とテーブル名のマッピングをサポートしています。また、IDENTITY
を除外する可能性もあります(自動インクリメント)列、または値を比較する前にいくつかの変換を行う(丸め浮動小数点タイプ、大文字小文字の無視、NULL
を空の文字列として扱うなど)データのダウンロードが最適化されます。データ量が多い場合は、チェックサムのみがダウンロードされます。この最適化はほとんどの場合に役立ちますが、操作を実行するための時間要件はデータの量とともに増加します。
次のステップでは、移行が生成されたSQLスクリプトがあります。このスクリプトは、保存することも、直接実行することもできます。安全のために、このスクリプトを実行する前にデータベースのバックアップを作成することもできます。 ApexSQL Data Diffツールは、選択したデータベースでスクリプトを実行する実行可能プログラムを作成できます。このスクリプトには、変更方法のロジックではなく、変更が必要なデータが含まれています。これは、定期的なインポートを提供するためにスクリプトを自動的に実行できないことを意味します。これがこのアプローチの最大の欠点です。
以下に、これらのツールの一般的なUIを示します。
この方法は、データ比較方法と非常によく似ています。前の方法との唯一の違いは、データの比較がなく、生成されたSQLスクリプトにデータの違いは含まれていませんが、同期ロジックが含まれていることです。生成されたスクリプトは、ストアドプロシージャに簡単に保存でき、定期的に(たとえば、毎晩)実行できます。この方法は、データベース間の自動インポートに役立ちます。この方法のパフォーマンスは、データ比較方法よりもはるかに優れています。
自動生成されたSQLによる同期は、によってのみ提供されます。 SQLデータベーススタジオ 。
SQL Database Studioは、データ比較メソッドと同様のインターフェースを提供します。ソースとターゲット(データベースまたはテーブル)を選択する必要があります。次に、オプション(同期キー、ペアリング、マッピング)を設定する必要があります。すべてのパラメーターを設定するためのグラフィカルなクエリビルダー機能があります。
2つのデータベース(AおよびB)。それぞれに2,000,000行の1つのテーブルが含まれています。テーブルは、同じSQLServer上の2つの異なるデータベースにあります。このテストは、2つの極端なケースをカバーします。1)ソーステーブルに2,000,000行すべてが含まれ、ターゲットテーブルが空です。同期は多くのINSERTS
を提供する必要があります。 2)ソーステーブルとターゲットテーブルには2,000,000行が含まれています。違いは1行だけです。同期では、UPDATE
を1つだけ提供する必要があります。
RedGateデータ比較には3つのステップが必要です。
ApexSQL Data Diffには、次の2つの手順が必要です。
SQL Database Studioは、同期全体を1つのステップで実行します。以下は、秒単位の同期時間です。 「個々のステップ」というラベルの付いた列には、上記の同期ステップの期間が表示されます。
ケースA.多くのINSERT | ケースA.多くのINSERT(個々のステップ) | ケースB.1行を更新する | ケースB.1行を更新します(個別の手順) | |
---|---|---|---|---|
SQLデータベーススタジオ | 47 | 5 | ||
RedGateデータ比較 | 317 | 13 + 92 + 212 | 2. 3 | 22 + 0 + 1 |
ApexSQLデータ差分 | 188 | 18 + 170 | 26 | 25歳以上 |
低いほど良いです。
同じテストですが、データベースは異なるSQLサーバー上にあり、リンクサーバーを介して接続されていません。
ケースA.多くのINSERT | ケースA.多くのINSERT(個々のステップ) | ケースB.1行を更新する | ケースB.1行を更新します(個別の手順) | |
---|---|---|---|---|
SQLデータベーススタジオ | 78 | 44 | ||
RedGateデータ比較 | 288 | 17 + 82 + 179 | 25 | 24 + 0 + 1 |
ApexSQLデータ差分 | 203 | 18 + 185 | 25 | 24 + 1 |
dbForgeデータ比較 | 326 | 11 + 315 | 16 | 16 + 0 |
低いほど良いです。
Javaでプログラミング言語を作成する方法
結果から、同期アルゴリズムはSQL Serverに依存していないため、RedGateとApexがデータベースが同じSQLServer上にあるかどうかを気にしないことは明らかです。 SQL Database Studioは、SQLServerのネイティブ機能を使用します。したがって、データベースが同じサーバー上にある場合、結果はより良くなります。
1つの幅の広いテーブルを多数の小さな関連テーブルに同期する必要がある場合もあります。
この例は、小さなテーブルContinent
、Country
、およびCity
に同期する必要がある1つの広いテーブルSourceDataで構成されています。スキームを以下に示します。
SourceDataのデータは、次の画像のようになります。
INSERT INTO Continent (Name) SELECT SourceData.Continent FROM SourceData WHERE (SourceData.Continent IS NOT NULL AND NOT EXISTS (SELECT * FROM Continent tested WHERE tested.Name =SourceData.Continent )) GROUP BY SourceData.Continent;
INSERT INTO City (Name, CountryId) SELECT SourceData.City, Country.Id FROM SourceData LEFT JOIN Continent ON SourceData.Continent = Continent.Name LEFT JOIN Country ON SourceData.Country = Country.Name AND Continent.Id = Country.ContinentId WHERE SourceData.City IS NOT NULL AND Country.Id IS NOT NULL AND NOT EXISTS (SELECT * FROM City tested WHERE tested.Name = SourceData.City AND tested.CountryId = Country.Id) GROUP BY SourceData.City, Country.Id;
このスクリプトはもっと複雑です。これは、テーブルのレコードがCountry
であるためです。およびContinent
見つける必要があります。このスクリプトは、欠落しているレコードをCity
に挿入しますと塗りつぶしContryId
正しく。
UPDATE
およびDELETE
スクリプトは、必要に応じて同じ方法で作成することもできます。
INSERT
、UPDATE
、およびDELETE
の3つのスクリプトが通常必要です)。この種の同期(テーブル全体から多くの関連テーブルへ)は、さまざまなユースケースに焦点を合わせているため、データ比較メソッドでは実行できません。データ比較メソッドは、挿入されるデータを含むSQLスクリプトを生成するため、関連するテーブルで参照を検索する簡単な機能はありません。そのため、この方法を使用するアプリケーションは使用できません(SQLServerのdbForgeデータ比較、RedGate SQLデータ比較、Apex SQLデータ差分)。
ただし、SQL Database Studioを使用すると、同期スクリプトを自動的に作成できます。次の図には、SQL DatabaseStudioのデータ同期用エディターと呼ばれる要素があります。
エディタは、よく知られているクエリビルダーのように見え、非常によく似た方法で機能します。各テーブルには定義済みの同期キーが必要ですが、テーブル間には定義済みの関係もあります。上の図には、同期用のマッピングもあります。列リスト(画像の下部)には、テーブルの列がありますCity
(他のテーブルについても同様です)。
列CountryId
およびName
同期キーとして選択されます。同期キーは、ソーステーブルとターゲットテーブルの行を一意に識別する列のセットです。主キーを使用することはできませんId
これはソーステーブルにないため、同期キーとして。
同期後、テーブルは次のようになります。
上記の例では、ソースとして1つの幅の広いテーブルがありました。ソースデータがいくつかの関連するテーブルに格納されている場合の一般的なシナリオもあります。 SQL Database Studioのリレーションは、外部キーではなく列名を使用して定義されます。このようにして、CSVファイルまたはExcelファイルからインポートすることもできます(ファイルは一時テーブルにロードされ、同期はそのテーブルから実行されます)。一意の列名を付けることをお勧めします。これが不可能な場合は、それらの列にエイリアスを定義できます。
データ同期は、INSERT
、UPDATE
、またはDELETE
のシーケンスで構成されます。コマンド。これらのコマンドのシーケンスを作成する方法は複数あります。この記事では、同期SQLスクリプトを作成するための3つのオプションについて説明しました。最初のオプションは、すべてを手動で作成することです。それは実現可能であり(ただし時間がかかりすぎる)、SQLを複雑に理解する必要があり、作成と保守が困難です。 2番目のオプションは、商用ツールを使用することです。次のツールを検討しました。
最初の3つのツールは非常によく似ています。それらはデータを比較し、ユーザーに違いを分析させ、選択された違いを(自動的にまたはコマンドラインからでも)同期させることができます。これらは、次の使用シナリオに役立ちます。
各ツールは、何らかの理由で愛されています。dbForgeには優れたUIと多くのオプションがあり、ApexSQLは他のツールよりもパフォーマンスが高く、RedGateが最も人気があります。
レール上のルビーは何をしますか
4番目のツールであるSQLDatabase Studioは、動作が少し異なります。変更ではなく、同期ロジックを含むSQLスクリプトを生成します。すべての作業はデータベースサーバー上で直接行われるため、パフォーマンスも優れています。データベースサーバーと同期ツール間のデータ転送は必要ありません。このツールは、次のユースケースに役立ちます。
RedGate Data Compare、ApexSQL Data Diff、dbForge Data Compareなど、データ比較メソッドを使用するツールを使用できます。再利用可能なSQLスクリプトを自動的に生成するSQLDatabaseStudioを使用できます。
データに基づく比較は、コストのかかるサードパーティのツールを使用して自動的に実行できます。または、違いを示す比較SQLスクリプトを作成することもできますが、それははるかに時間がかかり、再利用性が低くなります。
SQLスクリプト(INSERT、DELETE、UPDATE)を記述して、SQLデータベースを手動で同期することも、有料のサードパーティツールを使用することもできます。サードパーティのツールは、データを比較して同期SQLスクリプトを生成することで機能します。または、同期ロジックを設定して、それに基づいてSQLスクリプトを生成することもできます。