30

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

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

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

ありがとう。

4

10 に答える 10

42

上記の回答の一部は大幅に古くなっていることに注意してください。これはすべて 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. 「ウィザードの完了」をクリックし、[完了]をクリックしてパッケージを実行し、「ダウングレードされた」データベースを作成します。

あなたは終わった、幸せな日々。:]


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

ノート。Microsoft は、SQLAzureMW を Codeplex から削除しました。私は個人的にそれをここで利用できるようにしました

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

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

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

  4. SQL Server 2012 インスタンスに接続します。私のマシンのサーバー名は「VAIOE\SQLSERVER2012」で、Windows 認証を使用し、データベース オプションから「Master DB (list all databases)」を選択し、「Save Login Information」を選択します。[接続]をクリックします。

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

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

  7. [詳細] をクリックし、次のオプションを変更します。

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

b. 「テーブル/ビュー オプション」の下で、「スクリプト テーブル/データ」を「データを含むテーブル スキーマ」に設定します。「データベース エンジン ストアド プロシージャ」を「True」に設定します。「セキュリティ関数」、「セキュリティ ストアド プロシージャ」、「システム関数」を「True」に設定します。

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

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

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

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

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

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

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

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

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

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


上記の 2 つのプロセスはほとんど同じであり、同じ機能を提供します。特に Azure に移行する必要があるか、方法 1 が失敗しない限り、後者は実行しません。

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

于 2015-04-24T17:36:35.063 に答える
12

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

復元したいものを選択するか、デフォルトで完全なデータベースが選択されるようにします。

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

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

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

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

于 2014-11-06T18:49:04.920 に答える
9

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

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

2012 SQL Management Studio で

  1. タスク -> スクリプトの生成 (最初のウィザード画面で、[次へ] をクリックします - 表示されない場合があります)
  2. [データベース全体とすべてのデータベース オブジェクトをスクリプト化] を選択 -> [次へ]
  3. [Advanced]ボタンをクリック 3.1 [Types of data to script]を「Schema only」から「Schema and data」に変更 3.2 [Script for Server Version]を「2012」から「2008」に変更
  4. スクリプト ファイルを作成するための次のウィザード手順を完了します
  5. sqlcmd を使用して、エクスポートしたスクリプト ファイルを SQL Server 2008 R2 にインポートします。 5.1 Windows コマンド ラインを開きます。

わたしにはできる。

于 2016-08-17T03:56:06.373 に答える
9

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

于 2013-11-07T14:04:34.613 に答える
2

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

于 2013-11-07T14:06:28.593 に答える
2

これが私のためにトリックを行った別のオプションです: https://dba.stackexchange.com/a/44340

そこで私はオプション Bを使用しました。これは私の考えではありませんので、すべてのクレジットは元の作者に帰属します。リンクが機能しない場合があり、完全なストーリーを手元に置くことをお勧めします。

私からの 1 つのヒント: まず、スキーマの非互換性がある場合はそれを解決します。その後、データを注ぐのは簡単です。


オプション A : [Generate script] オプションを使用して、互換モードでデータベースをスクリプト化します。

注: スキーマとデータを使用してデータベースをスクリプト化する場合、データ サイズによっては、スクリプトが巨大になり、SSMS、sqlcmd、または osql によって処理されなくなります (GB 単位の場合もあります)。

ここに画像の説明を入力

オプション B :

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

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

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

-- 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)

Ⅱ.指定したフォルダーに .dat ファイルを生成するバッチ ファイルを実行します。

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 方式です。

于 2017-11-17T12:56:30.643 に答える
1

データベースを 1 つの SQL Server バージョンからそれより低いバージョンに "ダウングレード" する唯一の組み込みの方法は、難しい方法です。データベース全体、スキーマ、およびデータをスクリプト化してから、ターゲット サーバーでスクリプトを実行します。

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

于 2013-11-07T14:08:41.367 に答える
0

マージ レプリケーション。ディストリビューター (2008) からサブスクライバー (2008) を作成できます。データベースが完全に同期されたら、サブスクリプションとパブリケーションを削除します。

于 2015-11-06T21:56:32.187 に答える
0

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

于 2014-11-27T15:10:46.923 に答える
-1

同じネットワーク内にいる場合は、接続オプションを使用して宛先サーバーをMS Server 管理スタジオに追加し、ソースから宛先へのエクスポートを試みます。最も簡単な方法:)

于 2016-07-12T08:12:39.123 に答える