像windows系统还原一样随意备份和还原数据

 

像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)注意,由于每次还原的时候,系统会断开连接该数据库所有线程,因此需要客户端重新链接数据库,最好的方法是每次数据恢复之后自动跳注销系统,跳转到用户登录界面。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值