在sql server數據庫中,備份和還原都只能在服務器上進行,備份的數據文件在服務器上,還原的數據文件也只能在服務器上,當在非服務器的機器上啟動sql server客戶端的時候,也可以通過該客戶端來備份和還原數據庫,但是這種操作實質是在服務器上進行的,備份的數據文件在服務器上,還原的數據文件也只能在服務器上,這個原則不會變,只是使用了客戶端的一個工具來操作這個過程而已。
1.1、備份數據庫
備份數據庫有兩種方式:
第一種是在企業管理器中,利用工具對數據庫進行備份,這種備份的文件只會有一個,即以.bak結尾的文件。這種方式下對一個數據庫進行備份的時候,可以任意的命名備份文件和后綴,還可以對已備份完成的備份文件進行名字和后綴名的修改,都不會影響文件的恢復,但是備份文件內部已經記錄了原來的數據庫的.mdf和.ldf文件的名字和存儲的路徑。備份的時候,如果目標文件夾中已經存在了與備份文件名同名的文件,則有兩個選項,附加和覆蓋,一般選擇覆蓋.建議:以原數據庫名字為備份文件的文件名字,並且以 .bak作為后綴名.
第二種方式是直接找數據庫的data文件夾,直接將.mdf和.ldf文件拷貝保存。
1.2、還原數據庫
還原數據庫有兩種方式:
第一種是還原.bak文件,當確定了備份的數據庫之后,就可以利用企業管理器來還原了。還原的新數據庫名可以是任意的,在option選項里面可以根據當前機器中安裝Sql Server 2005 的路徑來修改路徑,甚至可以修改.mdf和.ldf文件的名字,名字只是標識符,任意修改都可以,編譯器會把.mdf和.ldf文件與新數據庫名聯系起來的。這樣還原后,就生成了.mdf和.ldf文件,原來的備份數據文件就可以刪除了。還原的時候,如果目標文件夾中已經存在了與還原文件名同名的文件,可以選擇覆蓋原來的數據文件。建議:還原后還是以原數據庫名為還原數據庫名,option選項里面不要改名字,只有在有必要的時候修改路徑即可.
第二種是還原.mdf和.ldf文件,還原的時候可以用Attach來把.mdf和.ldf文件附加上,然后命名新的數據庫名,但是這兩個文件是不能被刪除的,否則就失去了數據源了。建議:把.mdf和.ldf文件放到Data文件夾中.還原的數據庫名字與原來的數據庫名字相同.
1.3、與數據庫備份和還原相關的兩個重要的文件夾:
……\Microsoft SQL Server\MSSQL.1\MSSQL\Backup
-------存放備份的數據文件
……\Microsoft SQL Server\MSSQL.1\MSSQL\Data
--------存放.mdf和.ldf文件
1.4、通過sql server的命令來備份還原數據庫
我們通常備份數據庫時,需要通過sql server客戶端登錄數據庫服務器去備份和恢復,這樣很不方便,其實SQL SERVER自帶的命令就可以備份和還原數據庫。這些命令可以在sql server客戶端的sql腳本窗口直接執行,也可以很通過ADO.Net調用這些命令實現遠程備份和恢復數據庫。
(1)、備份還原數據庫的命令
備份:
BACKUP DATABASE'被備份的數據庫名'TO DISK = '備份文件路徑';
--注意:被備份的數據庫名必須是存在的,否則會出錯
還原:
--將數據庫置於離線狀態
ALTER DATABASE'被恢復的數據庫名'SET OFFLINE WITH ROlLBACK IMMEDIATE;
--恢復數據庫
RESTORE DATABASE '被恢復的數據庫名'FROM DISK = '還原文件路徑(源文件)';
--將數據庫置於在線狀態
ALTER DATABASE'被恢復的數據庫名'SET ONLINE WITH ROlLBACK IMMEDIATE;
--注意:被恢復的數據庫名必須是存在的,並且該數據庫將會被覆蓋掉,還原文件路徑(源文件)必須是存在的,另外,在執行前后的兩個ALTER語句的時候,所選擇的數據庫必須是master,
有時候為了保險起見,ALTER語句可以不要。
(2)、命令應用
A、可以直接在sql server客戶端的sql窗體中執行命令。
B、可以在數據庫上寫存儲過程,然后配置JOB,定期調用這個存儲過程。
C、通過應用程序的ADO.NET來執行這些命令或者命令組成的存儲過程,實現應用程序控制備份還原數據庫,這些應用程序可以寫成服務,定期調用。
(3)、C#案例
//備份數據庫
string sql = "backup database qis2006 to disk = '" + Server.MapPath("").ToString() +"\\"
+ bakname+ System.DateTime.Now.DayOfYear.ToString() + System.DateTime.Now.Millisecond.ToString() +".bak'";//備份文件名
Access acc = new Access();
acc.ExecuteNoneQuery(sql);
//還原數據庫
string sql = "Alter Database qis2006 Set Offline with Rollback immediate;";
sql += "restore database qis2006 from disk = '" ;
sql += Server.MapPath("").ToString() +"\\";
sql += bakname + "'"; //bakname 是備份文件名
sql += "Alter Database qis2006 Set OnLine With rollback Immediate;";
try
{
//連接 master數據庫 ;
//執行 sql 語句;
Response.Write("<script language=javascript>alert('數據恢復成功!');</script>");
}
catch(Exception ex)
{
Response.Write("<script language=javascript>alert('數據恢復失敗!');</script>");
this.Label2.Text = ex.ToString();
}
(4)、存儲過程案例
//備份數據庫
create proc backup_database
(
@device_name varchar(80),--備份設備名
@file_name varchar(125), --備份文件名
@devicelog_name varchar(85),--日志備份設備名
@filelog_name varchar(130) --日志備份文件名
)
as
begin
--創建數據庫的備份邏輯設備
exec sp_addumpdevice 'disk', @device_name ,@file_name
--創建設備邏輯名
exec sp_addumpdevice 'disk', @devicelog_name, @filelog_name
backup database testdb to @device_name --備份數據庫
backup log testdb to @devicelog_name --備份日志
end
//還原數據庫
create proc restore_database
(
@device_name varchar(80),
@devicelog_name varchar(85)
)
as
begin
Restore database testdb from @device_name
Restore log testdb @devicelog_name
end
sp_addumpdevice
sp_addumpdevice 語法:
sp_addumpdevice [ @devtype = ] 'device_type' , [ @logicalname = ] 'logical_name' , [ @physicalname = ] 'physical_name' [ , { [ @cntrltype = ] controller_type | [ @devstatus = ] 'device_status' } ]
eg.
添加了一個名為 mydiskdump
的磁盤備份設備,其物理名稱為 c:\dump\dump1.bak
。
USE master; GO EXEC sp_addumpdevice 'disk', 'mydiskdump', 'c:\dump\dump1.bak';