web-dev-qa-db-ja.com

SQL Server 2012データベースをlocaldbインスタンスにコピーするにはどうすればよいですか?

SQL Server 2012 Standardデータベースをlocaldbインスタンスにコピーしようとしています。 localdbがSQL Server 2005以降の高速インスタンスでないことを警告するウィザードを試しました。バックアップ/復元も行いましたが、localdbで復元すると、次のエラーが発生します...

これを実行しています...

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',
REPLACE

表示されるエラーメッセージ...

ファイル1のデータベース「CSODev」、ファイル「CSOdev_Data」の8752ページを処理しました.
ファイル1のデータベース「CSODev」、ファイル「CSOdev_Log」の5ページを処理しました.

メッセージ1853、レベル16、状態1、行1
論理データベースファイル「CSOdev_Log」が見つかりません。ファイルの完全パスを指定します。
メッセージ3167、レベル16、状態1、行1
RESTOREはデータベース「CSODev」を開始できませんでした。
メッセージ3013、レベル16、状態1、行1
RESTORE DATABASEが異常終了しています。

データベースは「リカバリー保留」モードになります。ログファイルに問題があるようです。 1つが破損した場合に備えて、2つの異なるバックアップを試しました。

24
Corey Blair

LocalDBには 既知の制限 (実際には実際のバグ)があります。データベースファイルが別のフォルダーにある場合、MOVEを使用したRESTOREは失敗します。

元のフォルダーに復元する必要があります(MOVEは不可)。ドライブを偽造する必要がある場合は、SUBSTなどのcmdツールを使用します。

15
BernardV

私も同じ問題を抱えていました。最終的に機能したのは次のとおりです。

  1. データベースを復元しようとしています(OPでエラーが発生しています)
  2. データベースの切り離し
  3. データベースの再接続

最後のステップで起こったことは、SSDTがデータファイルのアップグレードを実行したことです。これは明らかに古い形式でした。それが完了すると、データベースは問題なく動作し始めました!

5
MEMark

私も同じ問題を抱えていて、少しオンライン調査を行った後、それを機能させるための独創的な方法を見つけました(かなりハックではありますが)。基本的に、あなたは:

  1. SqlLocalDbインスタンス(_SqlLocalDb c tmp -s_)を作成します。
  2. 上記と同様にデータベースを復元します(例:_SqlCmd -E -S <localdb connection string> -Q "RESTORE DATABASE ..."_)。
  3. SqlLocalDbインスタンス(_SqlLocalDb p tmp_)を停止します。
  4. SqlLocalDbインスタンス(_SqlLocalDb d tmp_)を削除します。
  5. 新しいSqlLocalDbインスタンス(_SqlLocalDb c persistent -s_)を作成します。
  6. 新しいインスタンスにデータベースをアタッチします(SqlCmd -E -S <persistent connection string> -Q "Create Database <dbname> On (Filename = '<Mdf file location'), (Filename = '<Ldf Filename'>) For Attach"

そしてうまくいけばそれはうまくいくはずです。オリジナルのアイデアについては こちら を参照してください。

編集:追加 Jason Brady によるcreateコマンドの修正。

4
ktr

データベースをスキーマおよびデータとしてスクリプト化し、ローカルでスクリプトを実行してみてください。

3
Srb1313711
RESTORE FILELISTONLY
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'


ALTER DATABASE yourdatabasename
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

RESTORE DATABASE yourdatabasename
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'
with replace,
move 'logical name from file stream' to
'C:\yourdatabase.mdf',
move 'logical name from file stream' to 'C:\Yourdatabase.ldf'
ALTER DATABASE Qatar_DB SET MULTI_USER
2
Kiran M R

私も同じ問題を抱えていました。管理者としてVisual Studioを実行して、次のコマンドを試してください

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH NORECOVERY, MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',

PDATE:これは正確に機能しませんでした!

上記のステートメントはエラーを生成せず、正常に完了しますが、データベースは「保留中の回復」状態のままであり、いかなる方法でもアクセスできません。 「RESTORE WITH RECOVER」を実行してデータベースをオンラインにしようとすると、上記の質問と同じエラーが発生しました。

したがって、私の場合、MSSQL 2008 R2で実行しているDEVサーバーにバックアップを復元して、タスク->スクリプトの生成->スクリプトを実行するオブジェクトを選択して次へ-> [詳細設定]ボタンをクリックして、[選択]をクリックします。スクリプト化するデータのタイプ」:スキーマとデータ。次に、生成されたスクリプトをローカルデータベースに対して実行します。

1
cleftheris

同じ問題、助けてくれてありがとう。私のローカルデータベースはMS SQL 2014です。「SQL Server 2014 Management Studio」を開きます

  1. データベースを右クリックして[タスク]に移動し、[オフラインにする]をクリックします
  2. データベースを切り離す
  3. データベースを接続します

それは私のために働きます。データベースをバックアップした後、エラーなしでデータベースを復元できます。ありがとう。

1
Stephen

次のスクリプトを試してみてください(私が個人的にテストしたadventureworks2012の例):

RESTORE FILELISTONLY
FROM DISK = 'c:\temp\adv2012.bak'

これにより、ファイル名が次のように表示されます。

AdventureWorks2012      C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012.mdf
AdventureWorks2012_log  C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012_log.ldf

これらのファイル名を使用して、次のように最終的なスクリプトを作成します。

RESTORE DATABASE AdventureWorks2012
FROM DISK = 'C:\temp\adv2012.bak'

WITH MOVE 'AdventureWorks2012' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012.mdf',
MOVE 'AdventureWorks2012_log' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012_log.ldf',
REPLACE;

ところで、私はこれらをVisual Studio(SQL Server Object Explorer)で実行していますが、これはSSMSで簡単に実行できると思います;-)

0
cnom