簡體   English   中英

以編程方式分離SQL Server數據庫以復制mdf文件

[英]Programmatically detach SQL Server database to copy mdf file

我有一個小的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很容易)並為用戶添加一項功能,只需單擊按鈕即可輕松恢復該備份文件?

  • 您可以使用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 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 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(); 

就個人而言,我會生成數據庫的備份並壓縮它們並將它們發送給用戶。 也許你可以寫一個小腳本來恢復。

分離數據庫的原因使其他人無法使用。

我使用SQL Dumper控制台版本並壓縮sql轉儲。

恕我直言,擁有純文本副本而不是二進制文件總是更好。 如果出現問題,至少可以手動重寫數據,因為你可以閱讀它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM