web-dev-qa-db-ja.com

SQL Server 2012データベースをSQL Server 2008 R2に復元する方法

SQL Server 2012からSQL Server 2008 R2に取得したバックアップを復元しようとしていますが、エラーが発生します

指定されたキャストは無効です。 (SqlManagerUI)

これに対する解決策がある場合はコメントしてください

ありがとう。

30
user2742047

注、上記の回答のいくつかはかなり古くなっています!これは実行でき、すべてSQL Server Management Studio(SQL MS)内で実行できます


データベースを「ダウングレード」するために採用できる方法は多数ありますが、最近発見したものであり、SQL MS 2012の初期リリースでは見つからなかったと思われるものは、データベースのコピーウィザードです。 2012サーバーインスタンスから2008 R2インスタンスにデータベースをコピーする方法は次のとおりです。

  1. 2012インスタンスでは、コピー/「ダウングレード」するデータベースを右クリックし、「タスク」>「データベースのコピー...」を選択します。

  2. 「データベースのコピーウィザードへようこそ」をクリックして、[次へ]をクリックします。

  3. 「ソースサーバーの選択」:「ソースサーバー」を2012インスタンス(または上位バージョンのサーバーインスタンス)として設定し、適切な認証を設定します。 [次へ]をクリックします。 [注意。サーバーエージェントサービスが実行されている必要があります]

  4. 「宛先サーバーの選択」:「宛先サーバー」を2008 R2(または以前のバージョンのインスタンス)として設定し、適切な認証を設定します。 [次へ]をクリックします。 [注意。サーバーエージェントサービスが実行されている必要があります]

  5. 「転送方法の選択」この例では、「SQL管理オブジェクトの方法を使用する」を選択して、[次へ]をクリックします。

  6. 必要なデータベースの移動またはコピーを選択して、[次へ]をクリックします。

  7. 宛先データベースのパスや論理名などを設定します。データベースが存在する場合に必要なオプションを選択します。 [次へ]をクリックします。

  8. 統合サービスパッケージを構成し、[次へ]をクリックします。

  9. この例では、[パッケージのスケジュール]オプションで[すぐに実行]オプションを選択し、[次へ]をクリックします。

  10. 「ウィザードを完了」、[完了]をクリックしてパッケージを実行し、「ダウングレードされた」データベースを作成します。

ハッピーデイ、これで完了です。 :]


私が見つけた別の方法は、SQLデータベースの移行Wizardでした。これは、Microsoftによって作成され、上記のウィザードの作成元と思われます(わかりません)。ここで入手してください http://sqlazuremw.codeplex.com/ 。このパッケージを使用してデータベースをSQL Server 20012から2008 R2に移行するには、次の操作を実行できます。

注。 Microsoftは、CodeplexからSQLAzureMWを削除しました。個人的に利用可能にしました here

  1. SQLAzureMW.exeを実行します。

  2. メインウィンドウの右側から[分析/移行]ラジオボタンを選択します。

  3. 「SQLデータベースの最新サービスバージョン(V12)」としてターゲットサーバーを選択します。 [次へ]をクリックします。

  4. SQL Server 2012インスタンスに接続します。マシンのサーバー名は「VAIOE\SQLSERVER2012」で、Windows認証を使用し、データベースオプションから「Master DB(すべてのデータベースをリスト)」を選択し、「ログイン情報を保存」を選択します。 [接続]をクリックします。

  5. 移行するために必要なデータベースを選択します[今のところGVHレポートデータベースを使用]。 [次へ]をクリックします。

  6. 「すべてのデータベースオブジェクトのスクリプト」を選択します。

  7. [アドバンス]をクリックして、次のオプションを変更します。

a。 [全般]で[ターゲットサーバー]を[SQLサーバー]に設定します。

b。 [テーブル/ビューオプション]で、[スクリプトテーブル/データ]を[データ付きテーブルスキーマ]に設定します。 「データベースエンジンストアドプロシージャ」を「True」に設定します。 「セキュリティ関数」、「セキュリティストアドプロシージャ」、および「システム関数」を「True」に設定します。

[OK]をクリックします。 [次へ]をクリックします。

  1. 選択内容を確認します。 [次へ]をクリックします。

  2. 「スクリプトを生成する準備ができましたか?」というメッセージが表示されたら、[はい]をクリックします。これにより、スクリプト生成が開始されます。これが完了したら、[次へ]をクリックします。

  3. これで、別の接続ダイアログが表示されます。今回は、ターゲットサーバー(SQL Server 2008 R2インスタンス)上のデータベースを選択します。マスターデータベースを選択して、ターゲットDBを選択できるようにします。 [接続]をクリックします。

  4. ここで、新しいデータベースに移行する可能性があるため、[データベースの作成]をクリックします。

  5. データベースのターゲット名を入力し、「照合」を「」のままにしてください。これは関係ありません。 [データベースの作成]をクリックします。 [次へ]をクリックします。

  6. 「宛先サーバーに対してスクリプトを実行しますか?」というメッセージが表示されたら、[はい]をクリックします。

  7. これにより、生成されたスクリプトを使用してスキーマが設定され、ロードが行われますが、前の方法とは異なり、データは非常に高速なBCPを使用してバルクロードされます。これもすべて内部で行われるため、大量の.sqlスクリプトファイルなどは生成されません。

  8. [終了]をクリックします。

できました。 Management Studioを開いて、SQL Server 2012と2008 R2の両方のインスタンスに接続すると、2012年のソースデータベースのスキーマが、作成されたばかりのターゲットデータベースと一致することがわかります。


上記の2つのプロセスはほぼ同じで、同じ機能を提供します。特にAzureに移行する必要がある場合、または方法1が失敗する場合を除き、後者は実行しません。

これが誰かの助けになることを願っています。

40
MoonKnight

データベースを右クリックして、[タスク]-> [スクリプトの生成]を選択します

復元するものを選択するか、デフォルトでデータベース全体を選択します。

次に、[次へ]をクリックし、[詳細設定]をクリックして、2008または2008 R2などの復元する 'ssmsバージョン'の 'サーバーバージョンのスクリプト'を選択します。

また、「スクリプト化するデータのタイプ」から「スキーマとデータ」を選択します

最後に、目的のssmsでこの.sqlファイルを実行し、最初の行使用データベースのデータベース名を変更します

データベースが存在しない場合は作成し、スクリプトの実行でエラーが発生した場合は、alterキーワードからスクリプトを実行して最後まで完了します。

12
Dheeraj Sharma

SQL Serverの上位バージョンから下位バージョンに決して復元することはできません。唯一のオプションは、データベースをスクリプト化してから、SSIS、BCP、リンクサーバー経由でデータを転送するか、データをスクリプト化することです。

9
SQLMenace

To:Killercamソリューションをありがとう。最初の解決策を1時間試しましたが、うまくいきませんでした。

スクリプト生成メソッドを使用して、以下の手順としてSQL Server 2012からSQL Server 2008 R2にデータを移動しました。

2012 SQL Management Studioで

  1. タスク->スクリプトの生成(最初のウィザード画面で、[次へ]をクリックします-表示されない場合があります)
  2. データベース全体とすべてのデータベースオブジェクトのスクリプトを選択->次へ
  3. [詳細]ボタンをクリックします3.1 [スクリプトへのデータの種類]を[スキーマのみ]から[スキーマとデータ]に変更します3.2 [サーバーバージョンのスクリプト]を[2012]から[2008]に変更します
  4. スクリプトファイルを作成するための次のウィザード手順を完了します
  5. Sqlcmdを使用して、エクスポートされたスクリプトファイルをSQL Server 2008 R2にインポートします5.1 Windowsコマンドラインを開きます5.2 [sqlcmd -S -iファイルへのパス]と入力します(例:[sqlcmd -S localhost -i C:\ mydatabase.sql])

わたしにはできる。

7
Hieu

2012から2008に復元することはできません。 red-gate SQL compare などのツールを使用して、スキーマなどをコピーできます(2012固有のものが使用されていない場合)。コピーするデータもある場合は、 Data Compare ツールを使用できます。14日間の無料試用版を入手できると思います。

2
christiandev

データベースを「downgrade "SQL Serverのあるバージョンから下位のバージョンに変更する唯一の組み込み方法は、難しい方法です。データベース全体、スキーマand data、次に、ターゲットサーバーでスクリプトを実行します。

これは実行可能ですが、残忍な傾向があります。

1
RBarryYoung

ここに私のためのトリックをした別のオプションがあります: https://dba.stackexchange.com/a/4434

そこで使用しましたOption B。これは私の考えではないため、すべてのクレジットは元の著者に帰属します。リンクが機能しないこともあることを知っているので、ここに置いています。ストーリー全体を手元に置いておくことをお勧めします。

私からの1つのヒント:最初にスキーマの非互換性がある場合は解決します。その後、データを簡単に入力する必要があります。


オプションA:スクリプトの生成オプションを使用して、互換モードでデータベースをスクリプトアウトします。

注:データサイズに応じて、スキーマとデータを使用してデータベースのスクリプトを作成する場合、スクリプトは大規模であり、SSMS、sqlcmd、またはosqlで処理されません(GB単位の場合もあります)。

enter image description here

オプションB

最初にすべてのインデックス、FKなどを含むテーブルを最初にスクリプト化し、宛先データベースに空のテーブルを作成します-スキーマのみのオプション(データなし)。

BCPを使用してデータを挿入する

I.以下のスクリプトを使用してデータをBCPします。 SSMSをテキストモードに設定し、以下のスクリプトで生成された出力をbatファイルにコピーします。

-- save below output in a bat file by executing below in SSMS in TEXT mode

-- clean up: create a bat file with this command --> del D:\BCP\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
    +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
    +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
    +  QUOTENAME(name)  
    +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
    +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
    +  REPLACE(name,' ','') 
    + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
/*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
order by schema_name(schema_id)

II。指定したフォルダーに.datファイルを生成するbatファイルを実行します。

III。テキストモードでSSMSを使用して、移行先サーバーで次のスクリプトを再度実行します。

--- Execute this on the destination server.database from SSMS.

--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
select 'BULK INSERT '
/*Remember Tables must be present on destination database */ 
+ QUOTENAME(@Destdbname) + '.' 
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
+ '.' + QUOTENAME(name) 
+ ' from ''D:\BCP\' /* Change here for bcp out path */ 
+ REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
+ '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
+ char(10) 
+ 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
+ char(10) + 'go'
from sys.tables
where is_ms_shipped = 0
and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
--and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
    order by schema_name(schema_id)

IV。 SSMSを使用して出力を実行し、データをテーブルに挿入します。

これはネイティブモードを使用するため、非常に高速なBCPメソッドです。

1
Angel Naydenov

既に述べたように、「バックアップ」および「復元」機能を使用して、SQL Server 2012 DBからSQL Server 2008 DBに移行することはできません。しかし、私が書いたプログラム SQL Server Scripter は、SQL Serverデータベースに接続し、データベース、そのスキーマ、およびデータをスクリプト化します。 BitBucketからgitクローンを作成し、Visual Studio 2010以降でコンパイルできます(それ以降のバージョンの場合は、.csproj)。

0
Jez