gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:06 26 4
gpt4 key购买 nike

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

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

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

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

System.Data.SqlClient.SqlError: The backup set holds a backup of a database other than the existing 'database-B' database.
(Microsoft.SqlServer.Smo)

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

那么有没有人知道一种简单、万无一失的方法可以让我的数据 100% 准确且完整地从数据库 A 传输到数据库 B?

我想我在大约 5 年前使用 SQL Server 数据库发布向导来做类似的事情,但该产品现在似乎已经不存在了 - 我尝试安装它并且它要我将我的 SQL Server 版本降级到 2005,所以我不去那里!

最佳答案

不要为此使用用户界面。如果您不熟悉 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 命令中指向了正确的文件。请尝试上面的方法,让我知道它是否有效,并尝试找出您正在做的不同流程的任何部分。

关于database - 将现有数据库克隆到新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com