Java实现SQLServer的数据库备份与还原

来源:互联网 发布:索隆是副船长知乎 编辑:程序博客网 时间:2024/05/10 12:41
import java.io.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
//---------------------------------
// java mssql数据库的备份与还原
//---------------------------------
public class SqlBak extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{
    static final long serialVersionUID = 1L;
    public SqlBak() {super();} 
    //----------------------------------
    // POST请求
    //----------------------------------
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doGet(request,response);
    }
    //----------------------------------
    // Get请求
    //----------------------------------
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Connection conn = null;
        try
        {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
            String url="jdbc:sqlserver://localhost:1433;databaseName=db_test;user=sa;password=123";
            conn= DriverManager.getConnection(url);
            //----------------------
            // 数据库备份
            // 参数:
            //     存盘路径
            //     要备份的数据库名称
            //     数据库连接对象
            //     返回结果:备份名称
            //----------------------
            //String bkname = bkData("C:\\", "db_test", conn);
            //response.getWriter().print("back name:"+bkname);//输出备份的名称
            //----------------------
            // 数据库还原  
            // 参数:
            //     备份文件存盘路径
            //     备份文件名称
            //     要还原的数据库名称
            //     数据库连接对象
            //     返回结果:true | false
            //----------------------
            //boolean result = hfData("C:\\","20091118104911.bak","db_test",conn);
            //response.getWriter().print("result:"+result);
        }
        //异常
        catch(Exception e)
        {
            e.printStackTrace();
        }
        //释放连接
        finally
        {
            try{conn.close();}catch(Exception e){}
        }
    }  
    //----------------------------------
    // 数据库备份
    // 参数:
    //     存盘路径
    //     要备份的数据库名称
    //     数据库连接对象
    //----------------------------------
    public static String  bkData(String path,String db_name,Connection conn)
    {
        String bk_name = ""; //要返回的备份名称
        //盘名是否正确
        if(path.lastIndexOf("\\") == -1) path += "\\";
        //------------------------
        // 与数据库进行操作
        //------------------------
        PreparedStatement stmt = null;
        String sql = "";
        try
        {
            String file = new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date())+".bak";
            sql = "backup database "+db_name+" to disk='"+path+file+"' with format,name='full backup of "+db_name+"'";
            stmt = conn.prepareStatement(sql);
            stmt.executeUpdate();
            bk_name = file; //返回的文件名
        }
        //异常
        catch(Exception e)
        {
            e.printStackTrace();
        }
        //状态集释放
        finally
        {
            try{stmt.close();} catch(Exception e){}
        }
        //返回
        return bk_name;
    }
    //----------------------------------
    // 数据库恢复
    // 参数:
    //     备份文件存盘路径
    //     备份文件名称
    //     要还原的数据库名称
    //     数据库连接对象
    //----------------------------------
    public static boolean hfData(String path,String bk_name,String db_name,Connection conn)
    {
        boolean result = false; //要返回的备份名称
        //盘名是否正确
        if(path.lastIndexOf("\\") == -1) path += "\\";
        //------------------------
        // 与数据库进行操作
        //------------------------
        PreparedStatement stmt = null;
        String sql = "";
        try
        {
            sql = "alter database "+db_name+" set offline with rollback immediate;";
            sql += "restore database  "+db_name+"  from disk='" + path+bk_name + "'";
            sql += "with replace "; //解决备尚未备份数据库 数据库 的日志尾部
            sql += "alter database  "+db_name+"  set onLine with rollback immediate;";
            stmt = conn.prepareStatement(sql);
            stmt.executeUpdate();
            result = true;
        }
        //有异常
        catch(Exception e)
        {
            e.printStackTrace();
        }
        //数据库操作释放
        finally
        {
            try{stmt.close();} catch(Exception e){}
        }
        //返回
        return result;
    }           

}


来自:http://www.chinasb.org/archives/2010/08/119.shtml

原创粉丝点击