web-dev-qa-db-ja.com

SQL Server 2012バックアップをSQL Server 2008データベースに復元しますか?

SQL Server 2012データベースのバックアップをSQL Server 2008に復元する方法はありますか?

ファイルを添付しようとしましたが、うまくいきません。

41
urlreader

いくつかのオプションがあります:

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

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

enter image description here

オプションB:

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

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

  1. 以下のスクリプトを使用してデータを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)
    
  2. 指定したフォルダーに.datファイルを生成するbatファイルを実行します。

  3. テキストモードの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) 
    
  4. SSMSを使用して出力を実行し、データをテーブルに挿入します。

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

31
Kin Shah

いいえ、後退することはできません。前進するだけです。 2008年に空のデータベースを作成してから、Management Studioの[スクリプトの生成]ウィザードを使用して、スキーマとデータ(またはRed Gateなどのサードパーティの比較ツール)をスクリプト化できます。正しいターゲットバージョンを2008に設定していることを確認してください。2012で使用した可能性のある互換性のないもの(OFFSETやFORMATなど)を具体化する必要があります。

23
Aaron Bertrand

SQL Serverではこの種の互換性が許可されていないため、これをサポートする方法はありません。

あなたができることは

  1. sQL 2012でデータベースを復元する

  2. オブジェクトとデータのスクリプトを生成する

  3. sQL 2012に固有のすべての詳細からスクリプトをクリーンアップする
  4. 2008年にスクリプトを実行する

SQL Server 2012がない場合は、サードパーティのツールを使用してバックアップを読み取り、データと構造を抽出できます。

この場合、SQL 2008で空のデータベースを作成し、 ApexSQL DiffApexSQL Data Diff などのツールを使用してオブジェクトとデータを同期します。 Red-GateやIderaなど、他の主要ベンダーからも入手できます。

8
David Smithers