SQL Server 2012からSQL Server 2005にデータベースを移動する方法


30

データベースをSQL Server 2012(32ビット)からSQL Server 2005(64ビット)に移動する必要がある場合のオプションは何ですか?

私はできないことを知っています:

  • SQL Server 2005でデータベースのバックアップを復元する
  • 取り外して取り付ける

自分ができるということがわかっている:

  • データのインポートウィザードを使用し、1つのデータベースで試してみましたが、データを移動するだけでした。さらに、ID列を維持するための一時テーブルの作成、すべてのFK、インデックスなどの再作成に多くの作業を行う必要があったため、面倒でした

もっと簡単なオプションはありますか?


12
簡単なオプションは、正直に言うと、宛先を2012にアップグレードすることです。
アーロンバートランド

回答:


40

以下の方法を使用できます。

注:新しいデータ型などの新しい機能を使用している場合は、エラーがスローされるためテストする必要があります。

方法1:ネイティブツールの使用

  1. データベースSCHEMA_ONLYのスクリプトを作成し、宛先サーバーで空のデータベースを再作成します。以下はスクリーンショットです:

    ここに画像の説明を入力してください

    ここに画像の説明を入力してください

    ここに画像の説明を入力してください

  2. BCP OUTおよびBULK INSERTを使用してデータを挿入します。

以下は、パート2に役立つスクリプトです。

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

方法2:サードパーティツールを使用する

移行先サーバーに空のデータベースを作成します。Redgateのスキーマ比較とデータ比較を使用して、データを作成し、宛先サーバーにロードします。

注:Redgateのスキーマとデータ比較を使用しましたが、これらはこの種のタスクに最適なツールです。したがって、サードパーティのツールを使用している場合、Redgateが推奨されます。


7
+1ですが、目的地では機能しない特定の事柄があることに留意してください(そして、どのように優雅なサードパーティ製ツールがそれらすべてを処理するのかわかりません)。SEQUENCEなどのオブジェクト、OFFSET / FETCH、LAG / LEADなどのコード
アーロンバートランド

1
古いデータベースに対してスクリプトを作成して実行することでスキーマを作成したら、データを転送する別のオプションとして、リンクサーバーを設定して、あるインスタンスから別のインスタンスに直接コピーする方法があります。すべての作業を行うループをスクリプト化することは難しくありません。FKの制約に対処するには、適切な順序でテーブルをコピーする、コピー後にFKを一時的に削除して再度有効にする必要があります。同様に、コピー中に宛先のトリガーを無効にする必要があります。
デビッドスピレット

4

ここですでに提案されている方法に加えて、BACPACファイルを作成して宛先にインポートすることもできます。これは、データベースをオンプレミスからAzureクラウドデータベースに移行することをMicrosoftが推奨する方法に似ています。

この方法の利点は、スキーマとデータのエクスポートの組み合わせであり、データベースのバージョンに依存しないため、理論的にはどのバージョンからどのバージョンにでもデータベースをインポートできることです。

欠点は、ソースでBACPACファイルを生成する前に、データベース(ユーザーデータベースまたはシステムデータベース)以外のオブジェクトへの参照がある場合、または暗号化されたオブジェクト。しかし、あなたが幸運で失敗しなければ、それはかなり簡単な解決策になります。

必要なのは、新しいSSMSバージョン(17または18)のいずれかです:https ://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

BACPACファイルの作成を開始するには、データベースを右クリックして[データ層アプリケーションのエクスポート...]を選択します(異なるデータ層アプリケーションの抽出...と混同しないでください)。

データ層アプリケーションのエクスポート...

手順をガイドする簡単なウィザードが表示されます。完了したら、移行先サーバーで[データ層アプリケーションのインポート...]を使用できます。これは、[データベース]ノードを右クリックして表示できます(再度、[データの展開]と混同しないでください)層アプリケーション...」):

データ層アプリケーションのインポート...

これも、手順をガイドする簡単なウィザードを表示します。


-1

Sql Serverのバージョンを減らすことは非常に大変な作業です。
以下のように減らすいくつかのオプションがあります。
まず、すべてのデータベースオブジェクトスクリプトを作成し、移行先サーバーで実行します。
その後、使用できます。

  • SSIS、
  • データインポートツール、
  • RedGateなどのサードパーティツール。

ただし、RedGate Data Compareツールの場合、

主キーを持つテーブルのみを比較することを考慮する必要があります。主キーを持たないテーブルの場合、他の方法を使用する必要があります


8
私はこの答えはKINSの答えに改善しないと思う
ジェームズ・アンダーソン

-3

SQL Server上のデータベースをダウングレードすることは不可能です。ただし、回避策はすべてのDBオブジェクトのスクリプトを作成し、宛先データベースにスクリプトを適用することです。SSISは、これを実行するのに役立つ素晴らしい方法です。


4
これはKinの答えに重要な何かを追加すると思いますか?
-dezso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.