SQL Server數據庫的備份和還原

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章