1.前言:
存放在服务器上的数据(包括网站的页面、图片,数据库文件等),对于网络管理员来说,必须得经常定期备份。可能大部分人都会登录到服务器,对数据库进行备份操作,对图片文件等进行压缩,再将备份文件等传到本地。总是要登录备份文件觉得挺麻烦,所以就想用程序来实现备份 。当前我用的数据库是sql server2000,备份的文件是网站的图片。
欢迎大家交流,有不当之处,请及时指出,请联系ntshenwh@gmail.com
2.实现原理:
服务器端运行一个不间断的程序,负责数据库备份和图片备份操作,它会定期检查一个备份信息表,查看是否有需要备份的文件。如果有,则立即对相应要备份的文件进行备份。
3.数据库结构:
表:
CREATE TABLE [dbo].[TBackup] (
[PKID] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , --备份名称
[CreatedDate] [datetime] NULL , --创建时间
[Type] [tinyint] NULL , --备份类型,1 备份文件 2 备份数据库
[Status] [tinyint] NULL , --备份状态 1 等待备份 2 备份中 3 备份完成 4 备份失败
[DBName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , --数据库名称
[SourceFile] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , --备份源文件
[DestFile] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , --目标文件名(不包括后缀名,如 bak2007 )
[DestFolder] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , --目标文件夹(如c:/aa/)
[UsedTime] [float] NULL , --耗时
[DLPath] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , --下载路径
[CreatedUser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL --创建者
) ON [PRIMARY]
存储过程:
插入记录
CREATE Proc P_AddBackup
(
@Name varchar(100),
@Type tinyint,
@DBName varchar(50),
@SourceFile varchar(100),
@DestFile varchar(100),
@DestFolder varchar(100),
@CreatedUser varchar(50),
@PKID int output
)
as
begin
Insert into TBackup(Name,Type,Status,DBName,SourceFile,DestFile,DestFolder,UsedTime,DLPath,CreatedUser)
values(@Name,@Type,1,@DBName,@SourceFile,@DestFile,@DestFolder,0,'',@CreatedUser)
set @PKID =@@identity
end
更改记录
CREATE Proc P_UpdateBackup
(
@PKID int,
@Status tinyint,
@UsedTime float,
@DLPath varchar(100),
@rv int output
)
as
begin
Update TBackup
set Status=@Status,
UsedTime = @UsedTime,
DLPath = @DLPath
Where PKID = @PKID
set @rv =@@rowcount
end
4.实现代码:
服务器端是一个控制台程序,在VS.2005环境下编写.
其中用到了几个类:
CBackup.cs 实体类,作为信息的载体。
CThread.cs 主要线程类,由它进行不间断扫描程序,其中备份操作也是在该类中调用的。
DBHelper.cs 数据库操作类,用来获取备份信息及更改备份信息。
ZipHelper.cs 用来压缩备份文件。
Common.cs 通用类,存放静态变量及记录日志。
Program.cs main()函数所在类,从main开始。
注意的是在Common.cs中事先设定好数据库连接字符串及备份文件下载路径。
5.使用案例:
进行本地测试
5.1 在本地数据库pubs下,建立表及存储过程
5.2 运行控制台程序
5.3 调用 P_AddBackup 插入一条记录
5.4 查看运行效果
6.使用建议:
6.1 该备份方法 适合web服务,数据库服务集成在一个服务器上.
6.2 将控制台程序放到服务器端运行.同时建一个web页面放到服务器上,该页面用来维护TBackup信息表.
6.3 在备份数据库文件时,请注意,每次备份的目标文件名不能重复,否则备份出错.
Common.cs
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace BackupTool
... {
/**//// <summary>
/// 通用类,定义常量,公共方法
/// </summary>
class Common
...{
常量#region 常量
//数据库连接
public static string CON_CONNSTR = "Server=.;DataBase=pubs;uid=sa;pwd=;Max Pool Size=512;";
//备份文件下载
public static string CON_DOWNLOAD_PATH = "http://www.xyz.com/download/";
//日志路径
public static string LogPath = @"C:BackupToollog.txt";
public static string LogPathFloder = @"C:BackupTool";
#endregion
/**//// <summary>
/// 写入日志信息
/// </summary>
/// <param name="msg">信息</param>
public static void WriteLog(string msg)
...{
if (!Directory.Exists(LogPathFloder))
Directory.CreateDirectory(LogPathFloder);
if (!File.Exists(LogPath))
File.Create(LogPath);
try
...{
using (StreamWriter sw = File.AppendText(LogPath))
...{
sw.WriteLine("[" + System.DateTime.Now.ToString() + "] " + "" + msg + " ");
}
}
catch (Exception ex)
...{ }
finally
...{ }
}
/**//// <summary>
/// 写入异常信息
/// </summary>
/// <param name="msg">信息</param>
public static void WriteLog(Exception exsource)
...{
string msg = "异常信息:" + exsource.Message + " " + "异常明细:" + exsource.StackTrace;
if (!Directory.Exists(LogPathFloder))
Directory.CreateDirectory(LogPathFloder);
if (!File.Exists(LogPath))
File.Create(LogPath);
try
...{
using (StreamWriter sw = File.AppendText(LogPath))
...{
sw.WriteLine("[" + System.DateTime.Now.ToString() + "] " + "" + msg + " ");
}
}
catch (Exception ex)
...{ }
finally
...{ }
}
}
}