【问题标题】:Is possible to clone SQL database from ASP.Net application efficiently?是否可以有效地从 ASP.Net 应用程序克隆 SQL 数据库?
【发布时间】:2012-05-03 15:12:21
【问题描述】:

市面上有很多数据库克隆工具,例如 SQL Data Compare。

但是,最终用户(使用 ASP.Net 应用程序)希望在内容准备好后自己将暂存 SQL Server 2008 数据库克隆到生产 SQL Azure 数据库。

我确信我可以使用 Entity Framework 比较每个表,并插入/更新/删除每一行。有没有更好的方法?

感谢您的帮助!

【问题讨论】:

  • 多么奇怪的要求。 Web 应用程序中的用户想要克隆整个数据库?
  • 如果您必须在数据库之间插入/更新/删除行,那么您肯定不是克隆数据库。如果是这种情况,您可以简单地备份临时数据库并将其恢复到生产环境。你的目标是什么? SQL Server 维护计划、SSIS 包或存储过程可能是此类逻辑的更合适位置。您的 Web 前端可以启动其中一件事情。
  • @TimSchmelter 我也这么认为,但我假设它的英语很差,最终用户是指客户。但我相信你知道关于假设的说法......
  • 是的,最终用户(使用 asp.net 应用程序的客户端)想在没有数据库管理员的情况下自己将整个数据推送到生产环境。
  • 实际上,我想要数据库的精确副本。但我不知道如何有效地从 .net 代码中做到这一点。这就是为什么我说插入/更新/删除。 :)

标签: asp.net sql sql-server-2008 azure-sql-database database-cloning


【解决方案1】:

您可以使用 Microsoft.SqlServer.Management 命名空间中的不同类来管理 SQL Server 的各个方面。

这包括从一台服务器进行备份并恢复到另一台服务器(包括更改日志文件名和其他任何需要的内容)。

本质上,如果你可以在SSMS 中做到这一点,那么你可以使用这些类来做到这一点。

我过去用过这个,做的事情和你描述的差不多。

【讨论】:

  • 谢谢!我会做一些关于 Microsoft.SqlServer.Management 的研究。您是否遇到过任何博客或网站?
【解决方案2】:

为什么不备份数据库并恢复它?

您可以毫不费力地从您的 Web 应用程序运行备份和恢复。您可能应该编写代码来处理存储过程中的备份,而不是尝试在应用程序代码中编写逻辑。比如:

CREATE PROCEDURE dbo.InitiateClone
  @DBName     SYSNAME
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'BACKUP DATABASE ' + QUOTENAME(@DBName)
     + ' TO DISK = ''\\Common_network_path\wherever\' + @DBName + '.BAK''
     + WITH INIT;';

  EXEC sp_executesql @sql;

  SET @sql = N'SELECT name, type_desc FROM sys.
END
GO

现在请求备份的应用程序可以使用数据和日志文件名传递给其他服务器上的过程:

CREATE PROCEDURE dbo.FinishClone
  @NewDBName    SYSNAME,
  @OldDBName    SYSNAME,
  @DataFileName VARCHAR(255),
  @LogFileName  VARCHAR(255)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'RESTORE DATABASE ' + QUOTENAME(@NewDBName)
     + ' FROM DISK = ''\\Common_network_path\wherever\' + @OldDBName + '.BAK''
     + ' WITH MOVE ''' + @DataFileName + ''' TO ''D:\datapath\' 
     + @NewDBName + '_data.mdf'','
     + ' MOVE ''' + @LogFileName + ''' TO ''D:\logpath\'
     + @NewDBName + '_log.ldf'';';

  EXEC sp_executesql @sql;
END
GO

您唯一需要担心的是,如果两个用户同时尝试克隆同一个源数据库,那么您可能需要在其中放置某种排队或信号量控制。为简洁起见,我还省略了错误处理(例如,确保新名称不存在)。它还假设您有简单的数据库(一个数据文件和一个日志文件)。但这是一个开始。

编辑,因为我们知道目的地是 Azure:

对于 Azure,我认为您的选择是有限的。我认为您不能以这种方式执行还原。您将如何开始在 Azure 上创建新数据库?完成后,您仍然可以考虑使用一些第三方工具进行比较和同步。例如,Red Gate 的工具具有命令行界面,这意味着您当然可以调用它们来响应来自您的 Web 应用程序的请求。

【讨论】:

  • 这不是回答问题...可能是另一个问题
  • 我可以在几分钟内克隆数据库。但是,我们的最终用户希望自己从 Web 应用程序中完成。 :|
  • 我没有投反对票,而是投了反对票。暂存 SQL 2008 在本地,但生产是 SQL Azure。开头没提是我的错。
  • @AaronBertrand:因为您以问题的格式措辞,所以这似乎只是试图从 OP 中获取更多信息,这当然应该在 cmets 中完成。请不要表现得像这些是我的规则:你在Stack Overflow上的时间已经足够长,知道它自己的guidelines
  • @AaronBertrand:我没有投票给你。郑重声明,你的回答是很好的参考,我不争辩。
【解决方案3】:

备份数据库比读取表和记录要困难得多。还原的顺序至关重要,还原操作的性能方面也很重要,以尽可能避免限制。

您也许可以编写 DACPAC 操作脚本;我不知道该怎么做,但它可能是可能的。 DACPAC 是用于备份和恢复数据库的官方 Microsoft 解决方案。这是 DACPAC 概述的链接;您可能会找到一种以编程方式使用它的方法:http://msdn.microsoft.com/en-us/library/dd193245.aspx

使用第三方工具,Enzo 备份工具将很快提供 API 以编程方式备份​​/恢复数据库。该 API 将允许开发人员在针对 SQL Azure 数据库完成数据库备份和恢复操作后启动/停止/发送警报(对 SQL Server 的有限支持)。该 API 目前可根据私人请求提供;如果您决定尝试一下,请联系 info@bluesyntax.net 以获取有关 API 的信息。

[免责声明:我是备份工具的作者]

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多