top
Loading...
用VB備份和恢復SQLServer數據庫的方法
摘要 備份與恢復是數據庫管理員維護數據庫安全性和完整性的重要操作。本文分析并介紹用Access備份SQL數據庫的方法,很好地達到了數據備份的目的。同時,就Access 數據庫的安全接口作了簡略討論,使備份后不致喪失數據安全性。并提出了改進備份與恢復策略的一些建議。

關鍵詞 SQL Server數據庫; Visual Basic 6.0; 數據備份;數據恢復; Access

引言

對于關鍵應用的數據庫系統應根據具體環境和條件制訂一個完善可行確保系統安全的備份計劃,沒有備份的系統是不可靠、危險的,后果將是嚴重的,破壞性病毒、誤操作、自然災害等等都可能會對數據庫系統造成難以估量的破壞。尤其對一個信息化程度較高的企業來說,最有價值的財產或許就是企業數據庫中的數據。一個系統中最重要的是大量的實時數據,沒有備份功能顯然是不安全和不完善的。經過實踐摸索出Visual Basic 6.0開發的備份程序,能將數據庫備份到Access數據庫(Access 為目前流行的桌面型數據庫產品, 具有存儲操作靈活、便利等優點, 并且因它與SQL Server 同屬微軟數據庫產品, 二者能很好地兼容)中,并對Access數據庫進行加密以防數據被非法訪問。該程序還能用Access備份庫的數據恢復SQL Server數據庫,從而減少因誤操作損壞數據內容而造成的損失。使用該方法,用戶不須添加額外設備,只須在原有服務器上運行該備份程序,其界面簡單方便,適合普通用戶使用。

備份與恢復概述

備份是數據庫管理員定期地將整個數據庫復制到磁帶或另一個磁盤上保存起來的過程。常用的數據備份類型有:完全備份、差異備份、事務日志備份、文件或文件組備份。一個通用的備份策略是:以較長的時間間隔執行完全備份,以適中的時間間隔進行差異備份,并以較短的時間間隔進行事務日志備份。當數據遭到破壞后就可以利用備份來恢復數據庫。恢復數據庫是一個裝載數據庫的備份,然后應用事務日志重建的過程。一個通用的恢復策略是:首先恢復完全備份的數據,然后恢復差異備份數據,最后根據事務日志備份進行恢復。

1、備份方案

開發所需軟件:Visual Basic 6.0 Access備份程序的設計方法:

(1) 用控制面版的ODBC設置,給SQL Server中的數據庫添加一個數據源名稱。

(2) 在Access中新建一個數據庫,命名為backup.mdb。

(3) 用VB定義兩個主要過程:Attach_Table()和Create_Table()。Attach_Table的作用是將SQL Server數據庫中的所有需要備份的表鏈接到Access數據庫中,在此過程中要排除系統表,因為那是SQL Server自創建的,表中無用戶數據。Create_Table的作用是在backup.mdb中創建目的表,即在這個備份Access庫中創建表用來保存所有存在SQL數據庫中的用戶數據。另外,在鏈接過程中,要去掉SQL Server自帶的擁有者名稱。

2、程序的邏輯結構

① 通過第一步創建的ODBC數據源打開要備份的SQL數據庫;

② 使用Attach_Table()將該數據庫中的所有用戶表鏈接到backup.mdb中,排除系統表的方法是:

For Each tdf in backup_db.TableDefs
If (tdf.attributes And dbSystemObject)=0 Then
//條件成立,說明該表是用戶定義的表,可以鏈接,否則跳過
End if
Next

③ 使用Create_Table()對每個表創建與之對應的備份表,取名可遵循如下原則, 若原表叫table_name, 則備份表叫b_table_name。

④ 將table_name表中的所有記錄復制到b_table_name中。

⑤從備份庫刪除對SQL數據表的鏈接。

3、程序原碼

采用微軟DAO (Data Access Object) 數據模型, 打開Access 本地數據庫, 并連接一個外部ODBC數據表, 拷貝該表結構完成, 有以下過程塊CopyStru :

Private Sub copyStru ()
Set dbsTemp = wrkjet. OpenDatabase (tagFilName)// 鏈接表的過程
For i = 0 To tabN - 1
Set tdfLinked = dbsTemp. CreateTableDef (“linkTab”)
tdfLinked. Connect = “OdbC; DATABASE = xgsbgsys ; UID =

sa ; PWD = ; DSN = xgsdb ;”
tdfLinked. SourceTableName = tabName (i)
dbsTemp. TableDefs. Append tdfLinked
Set temp Tab = dbsTemp. CreateTableDef ()
temp Tab. Name = tabName (i)
//創建新表的過程
For Each fld In tdfLinked. Fields
Set newFil = temp Tab. CreateField (fld. Name , fld. Type ,fld. Size)
newFil. OrdinalPosition = fld. OrdinalPosition
newFil. Required = fld. Required
temp Tab. Fields. Append newFil
Next
//創建索引
For Each idx In tdfLinked. Indexes
Set newIdx = temp Tab. CreateIndex ()
With newIdx
Name = tabName (i) & ” x”
Fields = idx. Fields
Unique = idx. Unique
Primary = idx. Primary
End With
temp Tab. Indexes. Append newIdx
Next
dbsTemp. TableDefs. Append temp Tab
Set temp Tab = Nothing
dbsTemp. TableDefs. Delete ”linkTab”
Next i
dbsTemp. Close
Set dbsTemp = Nothing
wrkjet. Close
Set wrkjet = Nothing
End Sub
End Sub

追加數據, 采用微軟ADO (ActiveX data object) 數據模型, 分別操縱SQL Server 和Access 數據對象, 追加記錄數據來完成, 有以下過程塊CopyDa2ta :

Private Sub copyData ()
Set sourceCn = New adodb. Connection
sourceCn. CursorLocation = adUseServer
strSql =“PROVIDER = MSDASQL ; dsn = xgsdb ; uid = sa ;
pwd = ;”
sourceCn. Open strSql
Set targetCn = New adodb. Connection
targetCn. CursorLocation = adUseClient
targetCn. Open ” PROVIDER = Microsoft. Jet. OL Edb. 3.51 ;
Data Source = ”& tagFilName &“;”
End If //追加新表
For i = 0 To tabN - 1
Set targetRst = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i)
targetRst. Open strSql , targetCn , adOpenStatic , adLockPes2simistic , adCmdText
Set sourceSet = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i) & strSQLApp
sourceSet. Open strSql , sourceCn
zdN = sourceSet. Fields. Count
If sourceSet. EOF Then Go To hh
sourceSet. MoveFirst
Do While Not sourceSet. EOF
targetRst. AddNew
For j = 0 To zdN - 1
If Trim (sourceSet. Fields (j) . Value) = ””Then
targetRst. Fields (j) . Value = Null
Else
targetRst. Fields (j) . Value = Trim (sourceSet. Fields(j) . Value)
End If //復制記錄
Next
targetRst. Update
sourceSet. MoveNext
Loop
recN = targetRst. RecordCount
hh :sourceSet. Close
Set sourceSet = Nothing
targetRst. Close
Set targetRst = Nothing
Next
targetCn. Close
Set targetCn = Nothing
sourceCn. Close
Set sourceCn = Nothing
End Sub //刪除鏈接

其中字符數組tabName (i) 中存放需備份的各數據表名, strSQLAPP 字符串中存放對數據表的限制條件where 子句內容。

4、數據恢復

如果要從Access中將數據恢復到SQL Server中,方法類似,僅僅是拷貝記錄的方向和以上相反,即從Access表往鏈接過來的SQL表中拷貝。

安全方案

因為Access屬小型數據庫,所以要保證其不被非法訪問。可以在VB程序中實現對備份數據庫的安全性接口,有以下兩種方法限制對Access的任意訪問:

(1)給Access數據庫加口令,在VB程序中用口令打開數據庫。打開Access軟件,選中“工具”菜單,選擇“安全”項,選擇“加密/解密數據庫”,然后選擇備份數據庫的名字,就可以給這個數據庫加上密碼。這樣的話,任何人如果想打開備份數據庫,手動修改數據表內容,必須先輸入正確的訪問密碼,否則不能繼續操作。用VB程序打開數據庫時,必須提供訪問密碼,否則無法訪問數據庫。

(2)給Access數據庫定義不同的用戶組和用戶權限,從而使不同級別的用戶可以分別讀或寫某表或視圖。打開Access軟件,選中“工具”菜單,選擇“安全”項,選擇“用戶/組權限”,在此可定義不同的組和用戶,并按組劃分用戶的權限級別,從而限制低或無權限的用戶執行某些操作。用VB 程序打開數據庫進行操作時,對不同的操作采用不同的用戶名和用戶密碼,從而區分有不同使用權限的人的訪問操作。

備份方案的幾點建議

1、在業余時間執行完全備份

如果你的公司沒有工作在24時的環境之下,那么業余時間是執行備份的最佳時間。這既可以提高備份的性能,又可以減少備份對用戶的影響。

2、安排一個完全備份在幾天內完成

如果數據庫非常大,并且你不能在期限內完成一個完全備份,那么就把該備份進行分解。你可以在一部分數據庫中執行文件或文件組備份。照這樣,經過幾天,就可以備份所有的數據。

3、使用差異備份

如果你沒有時間每天晚上執行一個完全備份,那么就可以在一周之中執行差異備份,而在周末執行一個完全備份。

4、建立一張合理的備份時間表

一個提高正被備份的系統性能的最好辦法是不要做不必要的備份。必須根據要求確定最有效的備份時間表。不要做超過你所需要的備份,但是也不要因為性能而犧牲數據的安全。根據你的要求,建立對自己最有利的備份計劃。

結束語

該備份方案使用VB設計出友好方便的用戶界面,用戶只需點擊按鈕便可執行備份或恢復操作;而且用Access作備份數據庫,備份同樣的數據,其所占用的硬盤空間遠遠小于SQL數據庫所占空間,大大地提高了效率和節約了用戶資源。通過實踐檢驗,其運行效率比雙機備份要高得多。

編輯推薦:VB數據庫編程專區
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗