2

私はこれに対する適切な解決策を見つけるのに苦労しています。60以上のテーブル(多くはキーの制約があります)と大量のデータを含むかなり大きなSQL Server2008Expressデータベースがあります。

基本的に、これらすべてのテーブルとデータ、および制約を1つのデータベースから別のデータベースに正確にコピーする必要があります。私は基本的にウェブサイトAを複製しています-異なるドメインで正確なコピー(ウェブサイトB)を作成するため、2つの完全に同一のウェブサイトが並行して実行され、それぞれが最初に独自の同一のデータベースを持っています。

データベースAはWebサイトAで稼働しています。データベースBがセットアップされ、独自のユーザーがいます。テーブルとデータをAからBまでそのまま取得する必要があります。データベースBのログイン資格情報を使用するようにweb.config接続を変更でき、機能するはずです。

Management Studio Expressを介してデータベースAをバックアップし、データベースBに復元しようとしましたが、次のように表示されます。

System.Data.SqlClient.SqlError:バックアップセットは、既存の「database-B」データベース以外のデータベースのバックアップを保持します。
(Microsoft.SqlServer.Smo)

また、Management Studio ExpressでデータベースAを右クリックして、に移動してみましたTasks > Generate scripts。しかし、これを実行してデータベースBIでSQLスクリプトを実行すると、コンテンツをインポートするときに外部キーなどに関連するエラーが大量に発生します。それは正しいことをしているように見えますが、異なるキー/関係を処理することはできません。

では、データベースAからデータベースBにデータを100%正確かつ無傷で取得するための、簡単で確実な方法を知っている人はいますか?

約5年前にSQLServerデータベース公開ウィザードを使用してこのようなことを行ったと思いますが、その製品は現在は機能していないようです。インストールしようとしたところ、SQL Serverのバージョンを2005に戻す必要があったので、 mそこに行かない!

4

2 に答える 2

8

このためにUIを使用しないでください。BACKUP / RESTOREのさまざまな側面に精通していない場合、UIは多くのオプションに対して間違った道をたどるだけです。最も単純なバックアップコマンドは次のとおりです。

BACKUP DATABASE dbname TO DISK = 'C:\some folder\dbname.bak' WITH INIT;

これを別のデータベースとして復元するには、同じファイルを同じ場所に配置しようとするため、ファイル名を知っておく必要があります。したがって、以下を実行すると、次のようになります。

EXEC dbname.dbo.sp_helpfile;

データとログファイルの名前とパスを含む出力が表示されます。リストアを構築するときは、これらを使用する必要がありますが、パスを新しいデータベースの名前に置き換えます。例:

RESTORE DATABASE newname FROM DISK = 'C\some folder\dbname.bak'
  WITH MOVE 'dbname' TO 'C:\path_from_sp_helpfile_output\newname_data.mdf',
  MOVE 'dbname_log' TO 'C:\path_from_sp_helpfile_output\newname_log.ldf';

実際のデータベース名、およびdbname実際のパスに置き換える必要があります。それらが何であるかを知らない限り、私は私の答えをより具体的にすることはできません。newnamesome folderC:\path_from_sp_helpfile_output\


** 編集 **

これが完全な再現で、私にとっては完全にうまく機能します。

CREATE DATABASE [DB-A];
GO

EXEC [DB-A].dbo.sp_helpfile;

部分的な結果:

name     fileid filename
-------- ------ ---------------------------------
DB-A     1      C:\Program Files\...\DB-A.mdf
DB-A_log 2      C:\Program Files\...\DB-A_log.ldf

次に、バックアップを実行します。

BACKUP DATABASE [DB-A] TO DISK = 'C:\dev\DB-A.bak' WITH INIT;

もちろん、クローンターゲット(この場合DB-B)がすでに存在する場合は、それを削除することをお勧めします。

USE [master];
GO
IF DB_ID('DB-B') IS NOT NULL
BEGIN
  ALTER DATABASE [DB-B] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
  DROP DATABASE [DB-B];
END
GO

これで、この復元は正常に実行されます。

RESTORE DATABASE [DB-B] FROM DISK = 'C:\dev\DB-A.bak'
  WITH MOVE 'DB-A'     TO 'C:\Program Files\...\DB-B.mdf',
       MOVE 'DB-A_log' TO 'C:\Program Files\...\DB-B_log.ldf';

BAKファイルの内容についてエラーが発生した場合は、実際に新しいファイルを生成していること、およびRESTOREコマンドで正しいファイルを指していることを確認することをお勧めします。上記を試して、それが機能するかどうかを知らせてください。また、プロセスの別の部分を特定してみてください。

于 2012-04-25T16:35:41.190 に答える
2

これは古い質問だと思いますが、同じ問題に直面していて、UIは、これを行うためのスクリプトを作成するよりも簡単で高速であることがわかりました。

ダンの問題は、最初に新しいデータベースを作成してから、別のデータベースをそのデータベースに復元しようとしたことだと思います。これも試してみましたが、同じエラーが発生しました。秘訣は、最初にデータベースを作成せず、「データベースの復元」プロセス中にデータベースに名前を付けることです。

次の記事は、プロセスをガイドするのにいくらか役立ちます:http: //msdn.microsoft.com/en-us/library/ms186390 (v=sql.105).aspx

于 2013-07-30T06:11:03.370 に答える