天天看點

Java實作SQLServer的資料庫備份與還原

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