以编程方式分离SQL Server数据库以复制mdf文件

我有一个小的SQL Server数据库,我需要在命令上复制 – 我需要能够在任何给定的时刻获取mfd和ldf文件,复制它们,压缩它们,并使它们可供最终用户使用。

现在可以通过手动实现:

1)通过远程桌面登录SQL服务器

2)通过SQL Management Studio分离数据库。 我必须通过将数据库设置为single_user和/或重新启动服务来解决这个问题,因此我可以将其分离,因为应用服务器通常会登录到它。

3)在分离时,我通过文件系统并复制mdf和ldf文件。

4)我通过SQL Management Studio重新附加数据库

5)我压缩复制的文件,然后将它们移动到FTP服务器,以便需要它们的人可以获取它们。

这是一个可怕,低效的过程。 这不仅仅是需要架构的问题,而是需要人们在他们自己的本地机器上处理真实的生产数据的快照,以进行破坏性的实验。 幸运的是,压缩数据库非常小 – 可能有30兆的日志。

理想情况下,我想在ASP .NET Web应用程序中创建一个页面,该页面有一个按钮,用户可以按下该按钮以启动将当前数据库打包成zip文件,然后我只提供指向文件下载。

为什么不进行普通备份(使用sqlcommand很容易)并为用户添加一项function,只需单击按钮即可轻松恢复该备份文件?

  • 您可以使用sql-commands备份数据库
  • 您可以使用sql-commands对备份文件进行shell和zip压缩
  • 如果需要,您还可以将备份文件自动shell并ftp到Web服务器。

最终用户使用db的最终用户是什么? 一个winform程序? 然后通过按钮单击为用户轻松完成所有操作。

以下是一些示例代码:

Declare @CustomerID int declare @FileName nvarchar(40) declare @ZipFileName nvarchar(40) declare @ZipComand nvarchar(255) set @CustomerID=20 --Get from database instead in real life application SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak' SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip' --Backup database northwind backup database northwind to DISK=@FileName --Zip the file, I got a commanddriven zip.exe from the net somewhere. set @ZipComand= 'zip.exe -r '+@ZipFileName+' '+@FileName EXEC xp_cmdshell @zipcomand,NO_output --Execute the batfile that ftp:s the file to the server exec xp_cmdshell 'c:\movetoftp.bat',no_output --Done! 

你必须有一个包含这个的movetoftp.bat(将ftp-server更改为你的):
ftp -s:ftpcommands.txt http://ftp.myftp.net

并且你必须有一个包含这个的ftpcommands.txt(你也可以通过sqlcommands使用正确的zip文件来创建这个文件,但我允许你自己这样做):

ftpusername
ftppassword
二进制
提示
mput c:\ backups \ * .zip
放弃

查看您在SQL Management Studio中使用的对话框,每个对话框顶部附近都会生成一个用于执行操作的脚本的按钮。 这是一种快速的方法,可以在SQL中发现如何在数据库连接中执行此操作。

例如,分离数据库db1:

 EXEC master.dbo.sp_detach_db @dbname = N'db1' 

轻松 – 检查SQL Server附带的“SQL管理对象”SMO – 很好的C#/ VB.NET类和方法来完成所有这些。

请参阅: SMO – 管理您的SQL Server!

要么:

使用C#和.NET 2.0进行SQL Server 2005数据库备份和还原

就个人而言,我会生成数据库的备份并压缩它们并将它们发送给用户。 也许你可以写一个小脚本来恢复。

分离数据库的原因使其他人无法使用。

我使用SQL Dumper控制台版本并压缩sql转储。

恕我直言,拥有纯文本副本而不是二进制文件总是更好。 如果出现问题,至少可以手动重写数据,因为你可以阅读它。

首先连接到SQL Server没有附加任何数据库文件,没有使用数据库名称。

 ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30"; 

注意:XXX =。 或。\ SQLEXPRESS或。\ MSSQLSERVER或(本地)\ SQLEXPRESS或(localdb)\ v11.0&…

然后通过查询分离你的DB文件。

 "ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]"; 

好。

我的示例代码:

 sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30"; sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]"; sql_command.Connection = sql_connect1; sql_connect1.Open(); sql_command.ExecuteNonQuery(); sql_connect1.Close();