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

Dan*_*Dan 2 database schema transfer sql-server-2008 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.但是,当我这样做并在数据库BI上运行SQL脚本时,在导入内容时会获得与外键等相关的大量错误.看起来它正在做正确的事情,但无法处理不同的键/关系.

那么有没有人知道一种简单,可靠的方法,使我的数据从数据库A到数据库B 100%准确和完整?

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

Aar*_*and 6

不要使用UI.如果您不熟悉BACKUP/RESTORE的各个方面,那么UI只会引导您走错路径以获得很多选项.最简单的备份命令是:

BACKUP DATABASE dbname TO DISK = 'C:\some folder\dbname.bak' WITH INIT;
Run Code Online (Sandbox Code Playgroud)

现在要将其恢复为另一个数据库,您需要知道文件名,因为它会尝试将相同的文件放在同一个地方.因此,如果您运行以下内容:

EXEC dbname.dbo.sp_helpfile;
Run Code Online (Sandbox Code Playgroud)

您应该看到包含数据和日志文件的名称和路径的输出.构建还原时,您需要使用这些,但是将路径替换为新数据库的名称,例如:

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';
Run Code Online (Sandbox Code Playgroud)

你必须更换dbname,并newname与实际的数据库名称,也some folderC:\path_from_sp_helpfile_output\你的实际路径.除非我知道那些是什么,否则我无法在答案中得到更具体的解释.


**编辑**

这是一个完整的repro,对我来说完全没问题:

CREATE DATABASE [DB-A];
GO

EXEC [DB-A].dbo.sp_helpfile;
Run Code Online (Sandbox Code Playgroud)

部分结果:

name     fileid filename
-------- ------ ---------------------------------
DB-A     1      C:\Program Files\...\DB-A.mdf
DB-A_log 2      C:\Program Files\...\DB-A_log.ldf
Run Code Online (Sandbox Code Playgroud)

现在我运行备份:

BACKUP DATABASE [DB-A] TO DISK = 'C:\dev\DB-A.bak' WITH INIT;
Run Code Online (Sandbox Code Playgroud)

当然,如果克隆目标(在这种情况下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
Run Code Online (Sandbox Code Playgroud)

现在,此还原将成功运行:

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';
Run Code Online (Sandbox Code Playgroud)

如果您收到有关BAK文件内容的错误,那么我建议您验证您确实生成了一个新文件,并且您指向RESTORE命令中的正确文件.请尝试以上操作,让我知道它是否有效,并尝试查明您正在以不同方式执行的过程的任何部分.