2

我正在努力寻找合适的解决方案。我有一个相当大的 SQL Server 2008 Express 数据库,其中包含 60 多个表(许多具有关键约束)和一大堆数据。

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

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

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

System.Data.SqlClient.SqlError:备份集包含数据库的备份,而不是现有的“数据库-B”数据库。
(Microsoft.SqlServer.Smo)

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

那么,有没有人知道一种简单、可靠的方法,可以让我的数据 100% 准确无误地从数据库 A 到数据库 B?

我想我大约在 5 年前使用 SQL Server 数据库发布向导来执行类似的操作,但该产品现在似乎已经失效 - 我尝试安装它,它希望我将我的 SQL Server 版本回归到 2005,所以我我不去那里!

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';

您必须将dbnameand替换newname为您的实际数据库名称,以及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 命令中指向正确的文件。请尝试上述方法并让我知道它是否有效,并尝试找出您正在以不同方式执行的过程的任何部分。

于 2012-04-25T16:35:41.190 回答
2

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

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

以下文章在指导您完成该过程方面有些有用:http: //msdn.microsoft.com/en-us/library/ms186390 (v=sql.105).aspx

于 2013-07-30T06:11:03.370 回答