SQL Server 2012データベースのバックアップをSQL Server 2008に復元する方法はありますか?
ファイルを添付しようとしましたが、動作しません。
SQL Server 2012データベースのバックアップをSQL Server 2008に復元する方法はありますか?
ファイルを添付しようとしましたが、動作しません。
回答:
いくつかのオプションがあります:
オプションA:[スクリプトの生成]オプションを使用して、互換モードでデータベースをスクリプト出力します。
注:データサイズに応じてスキーマとデータを使用してデータベースをスクリプトアウトすると、スクリプトは大規模になり、SSMS、sqlcmd、またはosqlで処理されなくなります(GB単位の場合もあります)。
オプションB:
最初にすべてのインデックス、FKなどを使用してテーブルを最初にスクリプト化し、宛先データベースに空白のテーブルを作成します-スキーマのみのオプション(データなし)。
BCPを使用してデータを挿入する
以下のスクリプトを使用してデータを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)
指定したフォルダーに.datファイルを生成するbatファイルを実行します。
テキストモードの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)
SSMSを使用して出力を実行し、テーブルにデータを挿入します。
これはネイティブモードを使用するため、非常に高速なbcpメソッドです。
Some SSIDs and linked servers didn't go across properly
。リンクサーバーは、手動でスクリプト化する必要があります。SSIDは、sp_helprevloginを使用して変換できます。SQLAgentジョブ、ssisパッケージなどは、必要に応じて移動する必要があります。この方法のポイントは、2つのデータベースをダウングレードまたはマージするときに、データをできるだけ速く取得することです。
いいえ、前に戻ることはできません。2008年に空のデータベースを作成してから、Management Studioのスクリプトの生成ウィザードを使用して、スキーマとデータ(またはRed Gateなどのサードパーティ比較ツール)をスクリプト化できます。正しいターゲットバージョンを2008として設定し、2012年に使用した可能性のある互換性のないもの(OFFSETやFORMATなど)を具体化する必要があります。
SQL Serverはこの種の互換性を許可しないため、これをサポートする方法はありません。
できることは
SQL 2012でデータベースを復元する
オブジェクトとデータのスクリプトを生成する
SQL Server 2012がない場合は、サードパーティのツールを使用してバックアップを読み取り、データと構造を抽出できます。
この場合、SQL 2008で空のデータベースを作成し、ApexSQL DiffやApexSQL Data Diffなどのツールを使用してオブジェクトとデータを同期します。これらは、Red-GateやIderaなどの他の主要ベンダーからも入手できます。