數據庫的完整備份與恢復 "--hex-blob"

Yangcl 11年前發布 | 5K 次閱讀 Android規范 Apache Cayenne

閑言少絮,這個程序利用MySql 數據庫自帶小程序進行數據庫的備份和還原。這兩個程序分別是:mysql.exemysqldump.exe。這兩個程序在您安裝Mysql數據庫的時候會自動安裝到數據庫的bin目錄。這兩個程序存在的目錄為:C:\Program File\MySQL\MySQL Server 5.5\bin 這個目錄下。在這個目錄下您還可以看到很多MySql自帶的工具程序,他們都很方便和實用。

數據庫安裝程序信息:mysql- 5.5.25a-win32.msi。

安裝路徑:程序默認路徑。

應用程序:Navicat_for_Mysql.exe,默認安裝。

依賴項:mysql-connector-java-5.1.10-bin.jar

服務器地址:192.168.0.100

核心語句:

備份:"cmd.exe /C C:\\mysqldump -uroot -p123456 -h 192.168.0.100 " + database + " >" + path + "";

還原:"cmd.exe /C C:\\mysql -uroot -p123456 -h 192.168.0.100 " + database + " <" + path + "";

其他說明:建立的數據庫名稱為:qqwe,數據庫建立在遠程服務器上。mysql.exe和mysqldump.exe從bin目錄下取出來,放入到 C:\\ 下。

 

這個程序通過讀取*.properties配置文件來獲取外界傳遞進來的信息。這個文件是自己定義的。其中定義的內容如下:

EasyRecoveryConfig.properties 中的配置文件信息


OK,簡要說明結束,看代碼! 

package DatabaseRR;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.lang.Process;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.sql.Statement;

public class EasyRecovery 
{
    Connection conn = null;

    public Connection getConnection(String fileNameAndURL) 
    {
        Properties prop = new Properties();
        FileInputStream fis;
        try{
            fis = new FileInputStream(fileNameAndURL);

            prop.load(fis);
            fis.close();

            String userName  = prop.getProperty("userName");
            String password  = prop.getProperty("password");
            String localHost = prop.getProperty("localHost");//主機名或主機地址IP,如 192.168.0.100
            String database  = prop.getProperty("database");//數據庫名稱

            String jdbcDriver = prop.getProperty("jdbcDriver");//加載數據庫驅動的名稱
            String port = prop.getProperty("port");             //端口
            String dataBaseCompany = prop.getProperty("dataBaseCompany");

            String pathUrl = "jdbc:"+dataBaseCompany+"://"+localHost+":"+port+"/"+database;

            Class.forName(jdbcDriver);                              // 加載MySQL數據庫驅動
            String url = pathUrl;                                   // 定義與連接數據庫的url
            String user = userName;                                 // 定義連接數據庫的用戶名
            String passWord = password;                             // 定義連接數據庫的密碼
            conn = DriverManager.getConnection(url, user, passWord); // 連接連接
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 獲取MySQL所有數據庫方法 
<pre name="code" class="java">SCHEMATA 這是MySql記錄數據庫中一共建立了多少個數據庫,并保存他們表名的一個數據庫表</pre>
* @param fileNameAndURL
     * @return list
     */
    public List<String> getDatabase(String fileNameAndURL) 
    {
        List<String> list = new ArrayList<String>();        // 定義List集合對象
        Connection con = getConnection(fileNameAndURL);     // 獲取數據庫連接
        Statement st;                       // 定義Statement對象
        try 
        {
            st = con.createStatement();     // 實例化Statement對象
            ResultSet rs = st.executeQuery("select schema_name from SCHEMATA");// 指定查詢所有數據庫方法
            while (rs.next())               // 循環遍歷查詢結果集
            {           
                list.add(rs.getString(1));  // 將查詢數據添加到List集合中
            }
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return list;                        // 返回查詢結果
    }

    /**
     * 備份數據庫
     * 
     * @param fileNameAndURL 配置文件和他的路徑
     * 
     * @param database  數據庫名
     * @param path      文件保存路徑
     * @param userName  創建數據庫時設定的用戶名 
     * @param password  數據庫用戶密碼 
     * @param localHost 主機名或主機地址IP,如 192.168.0.100 
     * @param CmdDisk   mysql.exe、mysqldump.exe這兩個文件存放的目錄
     */
    private void mysqldump(String fileNameAndURL)
    {
        Connection con = getConnection(fileNameAndURL);
        Properties prop = new Properties();

        try {
            FileInputStream fis = new FileInputStream(fileNameAndURL);
            prop.load(fis);
            fis.close();

            String userName  = prop.getProperty("userName");
            String password  = prop.getProperty("password");
            String localHost = prop.getProperty("localHost");//主機名或主機地址IP,如 192.168.0.100
            String database  = prop.getProperty("database");//數據庫名稱
            String saveDisk  = prop.getProperty("saveDisk");//要保存的盤符
            String fileName  = prop.getProperty("fileName");//要保存成的文件名稱
            String fileType  = prop.getProperty("fileType");//要保存成的文件格式
            String CmdDisk   = prop.getProperty("CmdDisk"); //

            String path = saveDisk + fileName + fileType;//構成了完整路徑
            String Cmd = "cmd.exe /C " + CmdDisk + "mysqldump --hex-blob -u" + userName + " -p" + password + " -h " + localHost + " " + database + " >" + path + "";     
            //String asd = "cmd.exe /C C:\\mysqldump -uroot -p123456 -h 192.168.0.100 " + database + " >" + path + ""; 原始格式,不要刪除該語句

            Process p = Runtime.getRuntime().exec(Cmd);             //定義進行數據備份的語句
            StringBuffer out1 = new StringBuffer();                 //定義字符串緩沖對象
            byte[] b = new byte[1024];                              //定義字節數組
            for (int i; ((i = p.getInputStream().read(b)) != -1);)  // 將數據寫入到指定文件中   mysqldump.exe
            {
                out1.append(new String(b, 0, i));                   //向流中追加數據
            }
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }

    /**
     * 恢復數據庫
     * 
     * @param fileNameAndURL 配置文件和他的路徑
     * 
     * @param database  數據庫名
     * @param path      文件保存路徑
     * @param userName  創建數據庫時設定的用戶名 
     * @param password  數據庫用戶密碼 
     * @param localHost 主機名或主機地址IP,如 192.168.0.100 
     * @param CmdDisk   mysql.exe、mysqldump.exe這兩個文件存放的目錄
     */
    private void mysqlresume(String fileNameAndURL)
    {
        Connection con = getConnection(fileNameAndURL);
        Properties prop = new Properties();

        try 
        {
            FileInputStream fis = new FileInputStream(fileNameAndURL);
            prop.load(fis);
            fis.close();

            String userName  = prop.getProperty("userName");
            String password  = prop.getProperty("password");
            String localHost = prop.getProperty("localHost");   //主機名或主機地址IP,如 192.168.0.100
            String database  = prop.getProperty("database");    //數據庫名稱
            String saveDisk  = prop.getProperty("saveDisk");    //要保存的盤符
            String fileName  = prop.getProperty("fileName");    //要保存成的文件名稱
            String fileType  = prop.getProperty("fileType");    //要保存成的文件格式
            String CmdDisk   = prop.getProperty("CmdDisk");     //mysql.exe、mysqldump.exe這兩個文件存放的目錄

            String path = saveDisk + fileName + fileType;       //構成了完整路徑
            String Cmd = "cmd.exe /C " + CmdDisk + "mysql -u" + userName + " -p" + password + " -h " + localHost + " " + database + " <" + path + "";
            Process p = Runtime.getRuntime().exec(Cmd);

            StringBuffer out1 = new StringBuffer();                 // 定義字符串緩沖對象
            byte[] b = new byte[1024];                              // 定義字節數組

            for (int i; ((i = p.getInputStream().read(b)) != -1);)  // 將數據寫入到指定文件中
            { 
                out1.append(new String(b, 0, i));                   // 向流中追加數據
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }

    /**
     * 編輯屬性文件,向配置文件中寫入新的信息
     * @param fileNameAndURL 
     * @param Key
     * @param Value
     */
    public void propertyEditor(String fileNameAndURL , String Key , String Value)
    {
        Properties prop = new Properties();
        try 
        {
            InputStream fis = new FileInputStream(fileNameAndURL);
            prop.load(fis);
            prop.setProperty(Key, Value);

            OutputStream fos = new FileOutputStream(fileNameAndURL);
            prop.store(fos , Key);

            fos.flush();
            fis.close();

        }
        catch(IOException e)
        {
            e.getStackTrace();
        }
    }
    //################################################//
    /**
     * 備份  可供外界調用的方法
     * @param fileNameAndURL
     */
    public void dataBaseReserve(String fileNameAndURL)
    {
        EasyRecovery mc = new EasyRecovery();
        mc.mysqldump(fileNameAndURL);
    }

    /**
     * 恢復  可供外界調用的方法
     * @param fileNameAndURL
     */
    public void dataBaseRecovery(String fileNameAndURL)
    {
        EasyRecovery mc = new EasyRecovery();
        mc.mysqlresume(fileNameAndURL);
    }


    public static void main(String args[])
    {
        EasyRecovery mc = new EasyRecovery();
        String fileNameAndURL = "E:\\propertiesConfig\\EasyRecoveryConfig.properties";

    mc.dataBaseReserve(fileNameAndURL);
        mc.propertyEditor(fileNameAndURL, "userName", "Doctor Lee");

        mc.dataBaseRecovery(fileNameAndURL);
    }

}

        --hex-blob;這個命令是用于將導出的內容處理成為2進制流的形式。因為有些時候你會發現,導出的數據庫文件大小與數據庫本身真實內容的大小存在沖突,往往是小于真實的大小。加入這個命令你就可以解決這個問題了。這個命令加在備份數據庫的時候。

 

 這個程序適用于任何Mis系統、ERP系統等,在您的界面中只需要添加兩個按鈕然后完成相應的事件即可。這個程序也可以將他改成一個Action(EasyRecoveryAction.java),幫助您完成相應的后臺請求。初學者,不足之處請您多多指點。相應的項目工程和依賴程序在下面,您可以拿來直接運行。希望對您有所幫助。開源萬歲!轉載請您注明出處。







































 本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!