次の方法で共有


データベースの復元について

質問

2008年4月20日日曜日 4:39

 

お世話になります。V5です。

 

DB_1という名前のデータベースをバックアップしますと、DB_1.BAKといファイルができます。

それをデータベース名DBTESTというデータベース名の異なるデータベースに復元したいのですが

(データベース名だけが異なるだけで、テーブルやインデックスなどすべて構成は同じ)

どのようにすればよいでしょうか?方法を教えてください。

よろしくお願いいたします。

すべての返信 (6)

2008年4月22日火曜日 1:38 ✅回答済み

SQL Server Management Studioで、タスクから復元を選び、データベースの復元で、復元先データベースを手打ちして復元します。

ただ、これだけでは動かないと思います。ユーザーの設定、スキーマの設定、テーブルのオーナーの設定、ストアドプロシージャ内に書かれたスキーマ名の変更などの調整が必要でしょう。


2008年4月22日火曜日 1:42 ✅回答済み

SQL Server Management Studioから[データベース]を右クリックして、[データベースの復元]で戻りませんか?

 

 その後データベースの復元ウィンドウから、復元先データベースとして"DBTEST"と入力し、バックアップファイルを

選択するために[デバイスから]をチェックして、[バックアップの指定]ウィンドウで"DB_1.BAK"を指定することでリストア

できると思います。

 


2008年4月23日水曜日 4:46 ✅回答済み

回答をありがとう、ございました。

おっしゃるとおりできました。

 

ところが、もう一つのほうがうまくいきません。

それはSQL文から以下のような構文で実行しますとエラーになります。

WITH MOVE を有効な場所の指定とありますが、おそらく、SQL Serverをインストールした

場所のことだと思いますが、パソコンの環境によってSQLのフォルダの場所が変わります。

どのようにSQLのデータベースのある場所取得すればよいでしょうか?

(VB.NETでどのようにSQLのデータベースのある場所取得すればよいでしょうか?)

同時に、SQL文からのデータベース名が異なるデータベースの復元方法を教えてください。

よろしくお願いいたします。

 

 

RESTORE DATABASE DBTEST FROM DISK = 'D:\A.bak' WITH  REPLACE;

 

メッセージ 5133、レベル 16、状態 1、行 1
オペレーティング システム エラー 3(指定されたパスが見つかりません。) により、ファイル "D:\A.mdf" のディレクトリ参照に失敗しました。
メッセージ 3156、レベル 16、状態 3、行 1
ファイル 'A' を 'D:\A.mdf' に復元できません。WITH MOVE を使用して、そのファイルにとって有効な場所を特定してください。
メッセージ 5133、レベル 16、状態 1、行 1
オペレーティング システム エラー 3(指定されたパスが見つかりません。) により、ファイル "D:\A_log.ldf" のディレクトリ参照に失敗しました。
メッセージ 3156、レベル 16、状態 3、行 1
ファイル 'A_log' を 'D:\A_log.ldf' に復元できません。WITH MOVE を使用して、そのファイルにとって有効な場所を特定してください。
メッセージ 3119、レベル 16、状態 1、行 1
RESTORE ステートメントのプランを作成中に問題が検出されました。詳細については、以前のメッセージを参照してください。
メッセージ 3013、レベル 16、状態 1、行 1
RESTORE DATABASE が異常終了しています。


2008年4月23日水曜日 5:41 ✅回答済み

 V5 さんからの引用

どのようにSQLのデータベースのある場所取得すればよいでしょうか?

(VB.NETでどのようにSQLのデータベースのある場所取得すればよいでしょうか?)

SQL Serverのインスタンスが複数ある場合もありますし、プログラムから自動的に見つけるのは無理でしょう。どのインスタンスへ復元してよいのかわかりません。人間が指示するしかないと思います。

 

 V5 さんからの引用

同時に、SQL文からのデータベース名が異なるデータベースの復元方法を教えてください。

書かれているようにRESTOREでデータベース名を指定して復元すれば良いだけでは???
また、SMOを使われても良いかもしれません。


2008年4月23日水曜日 6:04 ✅回答済み

SQL文での別データベースへのリストア手順ですが、以下の出順でリストアできます。

 

※ここでは、データベースfooをバックアップしたファイルC:\TEMP\foo.bakを
 別のデータベースbarに戻すシナリオで説明します。

 

 注意点としては、ここで指定されるファイルやフォルダは全てSQL Serverが稼動している
 コンピュータのファイル/フォルダであることに注意してください。

 

 例えば、"C:\TEMP\foo.bak"はローカルコンピュータのC:\TEMP\foo.bakを示すのではなく、
 SQL Serverが稼動しているコンピュータ上のファイルになります。
 ローカルコンピュータ上にあるバックアップファイルをリストアする場合は、
 一旦、SQL Serverが稼動しているコンピュータにコピーするか、ローカルコンピュータで
 フォルダを共有し"\ローカルコンピュータ\共有名\foo.bak"のように指定してください。

 

最初にバックアップファイルに格納されている論理ファイル名と物理ファイル名を表示します。
以下のコマンドを実行してください。
(LogicalName、PhysicalName以外の項目も表示されますが、今回は使用しませんので無視します)

 

RESTORE FILELISTONLY FROM DISK = 'C:\TEMP\foo.bak'
GO

 

実行結果

LogicalName  PhysicalName

foo          C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\foo.mdf
foo_log      C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\foo_log.LDF

 

※結果は例です。SQL Serverのインストールフォルダ等により結果は異なります。

 

この情報を元にデータベースbarにリストアを行います。
(REPLACE は必要に応じて指定してください)

 

RESTORE DATABASE bar FROM DISK = 'C:\TEMP\foo.bak'
  WITH MOVE 'foo' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\bar.mdf',
       MOVE 'foo_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\bar_log.LDF'
GO

 

※物理ファイル名をそれぞれ、"foo.mdf"、"foo_log_LDF"から"bar.mdf"、"bar_log.LDF"に変更します。

 

以上の操作で、別のデータベースであるbarにリストアできます。

リストアに失敗した原因ですが、SQL Serverが参照できないファイル/フォルダが指定された、もしくは
リストアしようとしたデータファイルが、すでに他のデータベースで使用されているファイルだったと思われます。

 


2008年4月24日木曜日 18:03 ✅回答済み

V5です。

 

私のやりたいことが、できました。

本当にありがとう、ございました。