[英]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很容易)並為用戶添加一項功能,只需單擊按鈕即可輕松恢復該備份文件?
最終用戶使用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類和方法來完成所有這些。
要么:
使用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.