2009-04-16 85 views
6

我有我需要在命令复制一个小的SQL Server数据库 - 我需要能够采取MFD和LDF文件在任何时候,将它们复制,压缩它们,并将它们提供给最终用户。编程分离SQL Server数据库复制mdf文件

眼下这可以通过手动:

1)通过拆卸通过SQL Management Studio中的数据库远程桌面

2)登录到SQL服务器。我必须将数据库设置为single_user和/或重新启动服务的组合,以便让应用程序服务器正常登录到服务器,从而使其脱离。

3)虽然脱离我去通过文件系统并复制MDF和LDF文件。

4)通过SQL Management Studio中

5)我重新附加数据库我压缩复制的文件,我将它们移动到一个FTP服务器,这样谁需要它们的人可以得到他们。

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

那么理想,我想创造的是有一个按钮,用户可以按下启动当前数据库打包成一个zip文件中的ASP .NET Web应用程序页面,然后我只是提供链接到文件下载。

回答

9

何不做一个普通的备份(易于使用的SqlCommand做的),并添加了一个功能,用户能够轻松恢复该备份文件与点击一个按钮?

  • 可以备份与SQL的命令数据库
  • 你可以掏出拉链和用SQL指令生成backupfile
  • 您还可以掏出,如果你想自动的ftp发送backupfile到网络服务器。

什么是使用消耗你的数据库最终用户?一个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 [email protected] 

--Zip the file, I got a commanddriven zip.exe from the net somewhere. 
set @ZipComand= 'zip.exe -r '[email protected]+' '[email protected] 
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! 

你必须有一个包含这(改变FTP服务器到你)一个movetoftp.bat:
的ftp -s:ftpcommands.txt FTP。 myftp。净

而且你必须有一个包含这个ftpcommands.txt(您可以通过sqlcommands恰到好处的zip文件也dnamically创建了这个文件,但我让你自己做):

ftpusername
ftppassword
二进制
提示ň
mput的C:\备份\ *拉链
退出

8

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

例如脱离数据库DB1:

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

指出了脚本按钮的存在是非常有用的。 +1 – 2010-06-18 18:17:24

0

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

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

0

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

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

0

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

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

注意:XXX =。 OR。\ 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();