将现有数据库克隆到新数据库

时间:2012-04-25 16:28:45

标签: database sql-server-2008 schema transfer management-studio-express

我很难找到合适的解决方案。我有一个相当大的SQL Server 2008 Express数据库,包含60多个表(许多表具有键约束)和一大堆数据。

我需要基本上将所有这些表以及数据和约束从一个数据库复制到另一个数据库。我基本上复制网站A - 在不同的域上生成一个精确的副本(网站B),所以我们最终得到两个完全相同的并行运行的网站,每个网站都有自己的相同数据库。

数据库A已在网站A上启动并运行。数据库B已设置并拥有自己的用户。我只需要将表和数据从A到B保持不变。我可以修改我的web.config连接以使用数据库B的登录凭据,它应该可以工作。

我已经尝试通过Management Studio Express备份数据库A并恢复到数据库B,但它告诉我:

  

System.Data.SqlClient.SqlError:备份集包含除现有“database-B”数据库之外的数据库的备份。
  (Microsoft.SqlServer.Smo)

我还尝试右键单击Management Studio Express中的数据库A并转到Tasks > Generate scripts。但是,当我这样做并在数据库B上运行SQL脚本时,我会在导入内容时获得与外键等相关的大量错误。看起来它正在做正确的事情,但无法处理不同的键/关系。

有没有人知道一种简单,可靠的方法,可以将我的数据从数据库A 100%准确完整地保存到数据库B中?

我认为大约5年前我使用SQL Server数据库发布向导做了类似的事情,但是现在这个产品似乎已经不存在了 - 我试图安装它并且它希望我将我的SQL Server版本退回到2005年,所以我不去那里!

2 个答案:

答案 0 :(得分:6)

请勿使用此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';

您必须使用实际数据库名称替换dbnamenewname,并使用实际路径替换some 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命令中的正确文件。请尝试以上操作,让我知道它是否有效,并尝试查明您正在以不同方式执行的流程的任何部分。

答案 1 :(得分:2)

我意识到这是一个老问题,但我遇到了同样的问题,我发现UI比创建脚本更容易,更快。

我认为Dan的问题在于他首先创建了新数据库,然后尝试将另一个数据库恢复到其中。我也尝试了这个并得到了同样的错误。诀窍是不首先创建数据库,并在“恢复数据库”过程中命名数据库。

以下文章对指导您完成整个过程有一定帮助: http://msdn.microsoft.com/en-us/library/ms186390(v=sql.105).aspx