摘要 备份与恢复是数据库管理员维护数据库安全性和完整性的重要操作。本文分析并介绍用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
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 //删除链接
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!