數據庫的完整備份與恢復 "--hex-blob"
閑言少絮,這個程序利用MySql 數據庫自帶小程序進行數據庫的備份和還原。這兩個程序分別是:mysql.exe和mysqldump.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配置文件來獲取外界傳遞進來的信息。這個文件是自己定義的。其中定義的內容如下:

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),幫助您完成相應的后臺請求。初學者,不足之處請您多多指點。相應的項目工程和依賴程序在下面,您可以拿來直接運行。希望對您有所幫助。開源萬歲!轉載請您注明出處。