像windows系统还原一样随意备份和还原数据
数据库:MSsqlServer2000,JDK1.5,Apache Tomcat5.0
1)创建备份文件:
在项目中使用了hibernate的session工厂,因此从session获得数据连接:
备份之前需要准备好设备(硬盘,包)这里是c:/assetBackup,所有的备份文件都将写道这里,然后执行backup,系统会自动在所描述的设备上创建备份文件。
public boolean backup(Backups backup) {
boolean suc = false;
Session session = this.getSession();
Connection conn = session.connection();
Statement st = null;
String filename = "asset_" + "at_" + backup.getBktime() + ".bak";
backup.setFilename(filename);
String SQL = "backup database ASSET to disk='c://assetBackup//" + filename + "'";
try {
this.save(backup);
st = conn.createStatement();
st.executeUpdate(SQL);
suc = true;
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
conn = null;
}
return suc;
}
2)数据还原
2.1)在进行数据还原之前,需要进行一些准备工作,首先创建一个名为killThread的存储过程,用来结束所有已连接需要还原的数据库的线程,该存储过程需要在master数据库下创建。
CREATE PROCEDURE killThread
@dbName VARCHAR(50)
AS
BEGIN
DECLARE @sql NVARCHAR(500)
DECLARE @sPid INT
SET @sql='declare getspid cursor for select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
EXECUTE(@sql)
OPEN getspid
FETCH NEXT FROM getspid INTO @spid
WHILE @@fetch_status<>-1
BEGIN
EXECUTE('kill '+@spid)
FETCH NEXT FROM getspid INTO @spid
END
CLOSE getspid
DEALLOCATE getspid
END
2.2)实现数据恢复
public boolean restore(Backups backup) {
boolean suc = false;
Session session = this.getSession();
Connection conn = session.connection();
Statement st = null;
CallableStatement stt =null;
String filename = backup.getFilename();
String SQL = "restore database ASSET from disk='c://assetBackup//" + filename + "'";
//恢复之前需要做些准备
try {
stt = conn.prepareCall("{call killThread ASSET }");
//执行命令,杀死所有正在使用的数据库线程
stt.execute();
} catch (SQLException e1) {
e1.printStackTrace();
}
//开始恢复数据
try {
st =conn.createStatement();
st.executeUpdate(SQL);
suc = true;
} catch (SQLException e) {
e.printStackTrace();
suc = false;
}finally{
stt = null;
conn = null;
st = null;
}
return suc;
}
public boolean backup(Backups backup) {
boolean suc = false;
Session session = this.getSession();
Connection conn = session.connection();
Statement st = null;
String filename = "asset_" + "at_" + backup.getBktime() + ".bak";
backup.setFilename(filename);
String SQL = "backup database ASSET to disk='c://assetBackup//" + filename + "'";
try {
this.save(backup);
st = conn.createStatement();
st.executeUpdate(SQL);
suc = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
st = null;
conn = null;
}
return suc;
}
3)创建Backups模型:(略)
Backups脚本:
CREATE TABLE [dbo].[BACKUPS] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[BKNAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[BKREASON] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[OPER] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[BKTIME] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[FILENAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
FILENAME是备份文件的名称,将来会从数据库中查找filename,然后从设备上找到相应的备份文件进行还原
4)以上准备工作做好了以后,每次调用backup方法都会在制定的设备上保存一个名为asset_at_+备份时间(精确到秒).bak的文件。
5)UI处理:
用户输入备份名称及相关信息后,在BACKUPS表中创建一条备份记录,注意文件名需要和设备上的文件名一致(或者可以在FILENAME中保存设备名称+文件名称,增强系统的可移植性)。
当用户需要还原数据的时候,只需选择一个还原点,将用户选择的Backups对象送给数据访问层的restore方法即可实现数据还原。
6)注意,由于每次还原的时候,系统会断开连接该数据库所有线程,因此需要客户端重新链接数据库,最好的方法是每次数据恢复之后自动跳注销系统,跳转到用户登录界面。