`
caozuiba
  • 浏览: 905855 次
文章分类
社区版块
存档分类
最新评论

可定制的数据库备份和恢复程序

 
阅读更多
<iframe marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/images/b.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
在我们做数据库系统的程序时,经常需要为客户做一个数据库的备份和恢复程序,特别是对于一些非专业的数据库用户,这个程序更是必不可少,而且操作必需足够简单。因为在很多系统中,数据库的备份恢复功能都是相近的,因此,我们最好做一个通用的数据库备份恢复程序,这样就不必每个系统都开发一套了。

要开发这样一套系统,我个人认为应该满足以下要求:
1. 备份恢复操作应该有历史记录(必需有一个备份列表,列出备份文件的相关信息),便于用户查找以往的备份。
2. 对于每一次备份和恢复应允许用户记录备份和恢复的原因。
3. 系统应允许用户进行简单的配置,并且配置可以保存。
4. 备份和恢复应该足够简单,最好类似与文件的复制,对于已经进行的备份,应允许用户从备份列表恢复。
5. 即使因为某种原因使要恢复的数据库正在占用,也应该允许用户恢复(这一点很重要,因为你不能指望用户自己保证数据库的独占性)。
6. 实时显示备份或恢复的当前进度。
要达到以上的要求,我想我们应该这样设计系统:
1. 对于每一次的数据库备份和恢复,我们都记下当时的数据库服务器名,数据库名,备份文件全路径名,备份时间,进行备份或恢复的原因等信息,并把这些信息以XML的形式保存,下面是我得一个备份文件实例:
<?xmlversion="1.0"encoding="GB2312"?>
<history>
<bak>
<time>2004020510:41:21</time>
<dbname>hrmjx4</dbname>
<des>测试备份</des>
<path>E:/ricatex2003.bak</path>
</bak>
<bak>
<time>2004020510:43:58</time>
<dbname>hrmjx4</dbname>
<des>每周例行备份</des>
<path>E:/hrmjx4040205.bak</path>
</bak>
</history>


2. 对于用户的配置可以这样进行:
<?xmlversion="1.0"encoding="GB2312"?>
<set>
<appname>数据库备份</appname>
<bakcount>20</bakcount>
<servername>.</servername>
<dbname>book</dbname>
<username>sa</username>
<password>2iUc94tkpsg=</password>
</set>


上面依次记录了备份程序的名称(显示在备份窗体的标题栏,无实际用处),备份历史最大记录数,备份的数据库服务器名称,备份的数据库名称,用户名,密码(已经过加密)等信息。我们在程序刚开始启动时,就自动把这些信息应用到用户界面上去,这样就不用用户重新设置了。
3. 备份时我们采取直接备份到文件的方法,用户只需使用保存文件对话框指定要备份的位置和文件名即可,其余的工作通过程序完成,恢复也一样,只需通过打开文件对话框指定从其中恢复的文件即可。
4. 我们在恢复时,先杀死要恢复的数据库所关联的所有用户线程,然后再进行恢复,这样就不会存在因为数据库独占性引起的恢复错误。
5. 对于实时显示备份和恢复的进度问题,我们采取SQL-DMO的回调函数的方式实现。

下面是相关技术难点的代码实现(因为个人的喜好,在此已C#的代码形式实现):
1. 在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所有数据库,实现代码如下:
取得数据库服务器列表:

publicArrayListGetServerList()
{
ArrayListalServers
=newArrayList();
SQLDMO.ApplicationsqlApp
=newSQLDMO.ApplicationClass();
try
{
SQLDMO.NameListserverList
=sqlApp.ListAvailableSQLServers();
for(inti=1;i<=serverList.Count;i++)
{
alServers.Add(serverList.Item(i));
}

}

catch(Exceptione)
{
throw(newException("取数据库服务器列表出错:"+e.Message));
}

finally
{
sqlApp.Quit();
}

returnalServers;
}


取得指定数据库服务器的数据库列表

publicArrayListGetDbList(stringstrServerName,stringstrUserName,stringstrPwd)
{
ServerName
=strServerName;
UserName
=strUserName;
Password
=strPwd;

ArrayListalDbs
=newArrayList();
SQLDMO.ApplicationsqlApp
=newSQLDMO.ApplicationClass();
SQLDMO.SQLServersvr
=newSQLDMO.SQLServerClass();
try
{
svr.Connect(ServerName,UserName,Password);
foreach(SQLDMO.Databasedbinsvr.Databases)
{
if(db.Name!=null)
alDbs.Add(db.Name);
}

}

catch(Exceptione)
{
throw(newException("连接数据库出错:"+e.Message));
}

finally
{
svr.DisConnect();
sqlApp.Quit();
}

returnalDbs;
}


2. 数据库的备份和实时进度显示代码:
publicboolBackUPDB(stringstrDbName,stringstrFileName,ProgressBarpgbMain)
{
PBar
=pgbMain;
SQLDMO.SQLServersvr
=newSQLDMO.SQLServerClass();
try
{
svr.Connect(ServerName,UserName,Password);
SQLDMO.Backupbak
=newSQLDMO.BackupClass();
bak.Action
=0;
bak.Initialize
=true;
SQLDMO.BackupSink_PercentCompleteEventHandlerpceh
=newSQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete
+=pceh;

bak.Files
=strFileName;
bak.Database
=strDbName;
bak.SQLBackup(svr);
returntrue;
}

catch(Exceptionerr)
{
throw(newException("备份数据库失败"+err.Message));
}

finally
{
svr.DisConnect();
}

}


privatevoidStep(stringmessage,intpercent)
{
PBar.Value
=percent;
}


其中,这两个语句实现了进度的实时显示:
SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete += pceh;
Step就是上面private void Step(string message,int percent) 的方法名称,它用来显示进度条的当前进度。

3. 数据库的恢复和杀死进程的代码:
publicboolRestoreDB(stringstrDbName,stringstrFileName,ProgressBarpgbMain)
{
PBar
=pgbMain;
SQLDMO.SQLServersvr
=newSQLDMO.SQLServerClass();
try
{
svr.Connect(ServerName,UserName,Password);
SQLDMO.QueryResultsqr
=svr.EnumProcesses(-1);
intiColPIDNum=-1;
intiColDbName=-1;
for(inti=1;i<=qr.Columns;i++)
{
stringstrName=qr.get_ColumnName(i);
if(strName.ToUpper().Trim()=="SPID")
{
iColPIDNum
=i;
}

elseif(strName.ToUpper().Trim()=="DBNAME")
{
iColDbName
=i;
}

if(iColPIDNum!=-1&&iColDbName!=-1)
break;
}


for(inti=1;i<=qr.Rows;i++)
{
intlPID=qr.GetColumnLong(i,iColPIDNum);
stringstrDBName=qr.GetColumnString(i,iColDbName);
if(strDBName.ToUpper()==strDbName.ToUpper())
svr.KillProcess(lPID);
}


SQLDMO.Restoreres
=newSQLDMO.RestoreClass();
res.Action
=0;
SQLDMO.RestoreSink_PercentCompleteEventHandlerpceh
=newSQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
res.PercentComplete
+=pceh;
res.Files
=strFileName;

res.Database
=strDbName;
res.ReplaceDatabase
=true;
res.SQLRestore(svr);
returntrue;
}

catch(Exceptionerr)
{
throw(newException("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message));
}

finally
{
svr.DisConnect();
}

}

其中这个语句取得了所有的进程列表:
SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
下面的语句找到和要恢复数据库相关的进程并杀死:
intiColPIDNum=-1;
intiColDbName=-1;
for(inti=1;i<=qr.Columns;i++)
{
stringstrName=qr.get_ColumnName(i);
if(strName.ToUpper().Trim()=="SPID")
{
iColPIDNum
=i;
}

elseif(strName.ToUpper().Trim()=="DBNAME")
{
iColDbName
=i;
}

if(iColPIDNum!=-1&&iColDbName!=-1)
break;
}


for(inti=1;i<=qr.Rows;i++)
{
intlPID=qr.GetColumnLong(i,iColPIDNum);
stringstrDBName=qr.GetColumnString(i,iColDbName);
if(strDBName.ToUpper()==strDbName.ToUpper())
svr.KillProcess(lPID);
}



以上就是数据库备份和恢复的关键代码,有了这些代码,我们实现更完善的数据库备份恢复功能也是没问题的,比如,你可以很容易的实现定时备份或按照一定的循环策略进行备份。
分享到:
评论

相关推荐

    C#可定制的数据库备份和恢复程序

    C#可定制的数据库备份和恢复程序C#可定制的数据库备份和恢复程序

    MSSQL 数据库备份精灵 v2.11

    备份计划定制灵活,可以选择每天固定时间备份,也可以在某一时间段内每隔一段时间备份一次。 3. 备份时可采用数据压缩方式。 4.备份的数据可以加密,以防止被人盗窃数据。5.开机自动启动程序备份!6.提供日志查询。7...

    神通数据库-数据库快速入门.pdf

    备份和恢复工具都提供丰富的选项,以满足不同用户的备份和恢复要 求。 • 支持数据迁移 神通数据库的数据导入和导出向导是前台管理工具中的一个实用工具,其主要功能是进行神通数据库 与其它各种异构数据源之间数据...

    Oracle数据库管理员技术指南

    1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库克隆数据库 1.6.5 怎样利用 Database Configuration Assistant 创建数据库 1.7 完成数据库配置 1.7.1 创建表空间 1.7.2 执行数据字典配置...

    oracle数据库dba管理手册

    11.1.1 定制数据库结构 317 11.1.2 安全与数据访问控制 321 11.1.3 事务管理 322 11.1.4 文件定位 322 11.1.5 监控 322 11.1.6 版本考虑 323 11.1.7 DBA的角色 324 11.2 管理Oracle Financials软件包的特殊 准则 ...

    数据库系统管理制度V1.0.doc

    第五条 数据的备份恢复,备份的主要目的就是为了恢复,所以在一段时期应当数据库进行恢复 演练,以防止意外发生时数据不能恢复而造成损失。恢复演练应尽量避开数据库生产环 境,以免影响生产的运行。恢复演练应当...

    数据库系统管理制度V1.0(1).doc

    第五条 数据的备份恢复,备份的主要目的就是为了恢复,所以在一段时期应当数据库进行恢复 演练,以防止意外发生时数据不能恢复而造成损失。恢复演练应尽量避开数据库生产环 境,以免影响生产的运行。恢复演练应当...

    要哇导航网源码 4.0.rar

    •完善的数据库管理,可进行在线数据库备份、恢复、优化及修复 •新增模版选择,提供官方模板与精简版 •后台宽屏模板编辑功能 •PHP调用文件- 天气代码|天天彩票|购物导航 •集成各大邮箱入口、航班、酒店...

    114a.com网站程序-非假冒版本,鄙视仿冒者还收费

    首先鄙视仿冒者玩收费! 内有详细安装步骤 ================= ... * 完善的数据库管理,可进行在线数据库备份、恢复、优化及修复 * 全面的日志管理:后台管理安全日志、MYSQL、PHP错误日志,便于程序监控和操作记录

    114啦网址导航源码 v1.13 UTF-8 Build 20100706.rar

    114啦网址导航建站系统主要特性:...便于了解网友需求,有助于改善用户体验 完善的数据库管理,可进行在线数据库备份、恢复、优化及修复 全面的日志管理:后台管理安全日志、MYSQL、PHP错误日志,便于程序监控和操作记录

    Access 2000数据库系统设计(PDF)---025

    724.2 理解关系型数据库 744.3 使用Access数据库文件和表 754.3.1 Access系统数据库 754.3.2 Access 库数据库 754.4 创建一个新数据库 754.5 理解表和字段的属性 774.6 选择字段数据类型、大小和格式 804.6.1 为数值...

    C++ Qt 基于数据库Mysql学生信息管理系统.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    Linux环境数据库管理员指南

    9.26.4 备份和恢复 279 9.26.5 大型数据库 280 9.27 使用 PostgreSQL 的 KVM 开关 280 9.28 故障排除—postmaster 启动故障 281 9.28.1 客户机连接问题 282 9.28.2 调试消息 282 9.28.3 pg_options 283 9.29 技术...

    Password Recovery Pro Enterprise是一个真正的一体化密码恢复工具,可以恢复您的所有类型的密码

    它提供了不同的设置和定制选项,例如用户可以选择检索类型等等。 这个奇妙的工具能够恢复密码和备份或保存他们的密码报告在HTML/CSV/SQLite格式。 它提供了一个简单和快速的行动,可以派上用场的用户需要在最短的...

    CC通用学校平台学科成绩查询系统.rar

    5) 后台数据库备份:压缩数据库,备份数据库,恢复数据库 6) 管理员密码账号管理,管理员添加,修改,删除 另外如果我们提供的版本不完全符合你的需求,也可以请联系我们为您来定制。 默认管理员帐号是:admin,...

    基于python的wxpy结合mysql数据库做的一个微信娱乐机器人.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    一个基于vue的pc端网上购物商城,包括前台商城和后台管理系统,后端采用Java,数据库采用mysql.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    一个基于 go-cqhttp 开发,以 MySQL 作为数据库的 qq 群功能型机器人.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

Global site tag (gtag.js) - Google Analytics