web-dev-qa-db-ja.com

SQL Server-スキーマのみのバックアップ/復元

100台を超えるサーバーにDBがあり、特定のUATデータベースに一度に1つだけの構造をバックアップ/復元したいと考えています。それらはすべて同じものと呼ばれますが、スキーマの点で異なります。たとえば、誰かがデータを別の列にバックアップし、元の列を更新し、バックアップ列を削除していない場合などです。

列のサイズもさまざまです(つまり、あるサーバーのテーブルbの列aはnvarchar(7500)である可能性がありますが、別のサーバーの同じテーブルの同じ列はnvarchar(max)である可能性があります)。

さらに、一部のsprocはもともとビューに依存して作成されていましたが(たとえば)、ビューは削除されています。

以下のアプローチを試みました。

  1. データベース全体のバックアップ/復元、不要なデータの削除
    • UATサーバーには一部のデータベースのための十分なスペースがありません。拡大はオプションではありません
  2. 小さなデータベースのバックアップ/復元、すべてのテーブルの切り捨て、他のサーバーからの挿入
    • スキーマはサーバーごとに異なるため、適切ではありません
  3. テーブルのループ、select * into <tablename> from [ip].[db].[schema].[tablename] where ...
    • データ型を含むテーブル構造を細かく作成しますが、主キー、トリガー、sprocsなどは作成されません-さまざまなsysテーブルからそれらをスクリプト化しようとしましたが、一部のビューが削除されたため、一部のsprocが失敗しました(削除されたビューを使用する場合のトリガーと同じ)

基本的には、1つのクライアントのデータ全体をUATサーバーにのみコピーし、それに対していくつかのテストを実行してから、次のクライアントに移動するだけです。データベースの外のものを忘れて、これらは私の仕事の一部ではありません。私の仕事は、sprocs、トリガー、主キーを含む、あるサーバーから別のサーバーにDBの構造を複製することです。 2つのUATサーバーのそれぞれに最大36のDBが存在する可能性があるため、スペース制限(開発者あたり6、開発者あたりのサーバーで最大6つのクライアントを許可)。私たちはmayサーバーの数を増やして、たとえばサーバーあたり12 DBにすることができますが、これらのサーバーを取得できるユーザーを奨励するには、最初に、動作の概念実証が必要ですあなたは私の意味を理解します。

上記の方法3は最も近くなりますが、sprocが存在しないことさえあるという事実は満足のいくものではありません。プログラムがエラーの原因を検出した場合、実行中にsprocが欠落しているか失敗しているかによって、動作が異なります。障害が発生する前に実行されるコードが存在する可能性があります。その場合、これはsprocがライブで実行されるたびに実行されますが、UATでは実行されません。

最後に、SSMS 2005を実行していますが、サーバーはSQL Server 2005と2008で異なります。

これを達成する方法について何かアイデアはありますか?物理的に完全なバックアップ/復元を行うことができず、ビューが存在しないためにすべてのsprocをスクリプト化できないことを念頭に置いて、それは可能ですか?

2
ClarkeyBoy

以前は使用していませんが、SSISにはTransfer SQL Server Objectsというオブジェクトがあります。データをコピーするかどうかのオプションがあり、すべてのオブジェクトをコピーするか、特定のタイプのオブジェクト、権限などをコピーするかを選択できます。

レプリケーションを行うことも検討できますが、そのデータ部分はブロックされます。実際、各サーバーのスキーマをプッシュしただけのスナップショットレプリケーションをセットアップした場合、プッシュを実行する自動化プロセスが存在する可能性があります。

私はSSISオプションがおそらくあなたの最善の策だと思います。

1
Kenneth Fisher

Powershellを使用して、データベースオブジェクトを.sqlスクリプトとしてスクリプト化し、スキーマバックアップとしても、転送についても使用できます。これは、 SQL Server SMO.Script()メソッドを使用して行われます。 Edwin Sarmiento による完全なブログ投稿があります。たとえば、オプションを使用してCREATE DATABASEをスクリプト化する方法は次のとおりです(リンクされたブログ投稿から抽出)。

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "LOCALHOST\SQL2005_1"  

$dbs=$s.Databases 

$dbs["Northwind"].Script() 

ブログの投稿では、スキーマのコピーをサポートするために使用できる完全な詳細とコードが提供されているはずです。

1
Mike Fal