代码之家  ›  专栏  ›  技术社区  ›  Pete Michaud

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

  •  6
  • Pete Michaud  · 技术社区  · 17 年前

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

    现在,这可以通过手动方式实现:

    1) 通过远程桌面登录到SQL server

    2) 通过SQL Management Studio分离数据库。我必须将数据库设置为单用户和/或重新启动服务,这样我才能让它分离,因为应用服务器通常都会登录到它。

    4) 我通过SQL Management Studio重新连接数据库

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

    因此,理想情况下,我希望在ASP.NETWeb应用程序中创建一个页面,该页面具有一个按钮,用户可以按下该按钮启动将当前数据库打包到zip文件中,然后我只提供文件下载的链接。

    6 回复  |  直到 17 年前
        1
  •  9
  •   Stefan    17 年前

    为什么不做一个普通的备份(使用sqlcommand很容易做到)并添加一个功能,让用户只需点击一个按钮就可以轻松恢复备份文件?

    • 您可以使用sql命令剥离和压缩备份文件

    最终用户使用什么来使用您的数据库?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服务器更改为您的):
    ftp-s:ftpcommands.txt ftp.myftp.net

    您必须有一个ftpcommands.txt,其中包含此文件(您也可以通过sqlcommands使用正确的zip文件友好地创建此文件,但我允许您自己这样做):

    ftpusername

    二进制的
    提示n
    mput c:\backups\*.zip

        2
  •  8
  •   Richard    17 年前

    例如,要分离数据库db1:

    EXEC master.dbo.sp_detach_db @dbname = N'db1'
    
        3
  •  2
  •   marc_s MisterSmith    17 年前

    简单-查看SQL Server附带的“SQL管理对象”SMO-尼斯C#/VB.NET类和方法来完成所有这些。

    见: SMO - manage your SQL Server!

    SQL Server 2005 Database Backup and Restore using C# and .NET 2.0

    马克

        4
  •  0
  •   Rad    17 年前

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

        5
  •  0
  •   Davorin    17 年前

    我会用 SQL Dumper

        6
  •  0
  •   ali    11 年前

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

    然后通过查询分离数据库文件。

    "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();