Java實現數據庫備份與還原 [MYSQL為例]
數據庫數據的備份與還原最好是使用數據庫自帶的客戶端軟件來實現,
Java可以通過調用mysqldump、mysql客戶端軟件分別進行mysql數據庫的備份還原,
當然前提是Java服務器必須安裝mysql客戶端軟件,但是也可以通過java telnet登陸數據庫服務器實現備份,關於telnet的相關資料請Google.
MYSQL支持的備份方式:
1.使用SELECT INTO ...OUTFILE,例如
SQL代碼
SELECT * INTO OUTFILE "D:\\test.sql" fields terminatedby ',' lines terminatedby '' from category ;
生成的文件會存放在數據庫服務器上面
SELECT INTO只備份了數據庫表中的數據:如下為category備份后的文件內容,即是數據記錄,並無數據表結構
2.使用BACKUP TABLE,例如
SQL代碼
BACKUPTABLE test_tableto 'D:\backup';
BACKUP只針對MyISAM表格,且在MYSQL 5.1的參考手冊中“注釋:本語句不理想”;
BACKUP語句效果為拷貝數據庫表中的.frm文件到數據庫服務器目標目錄
3.使用mysqldump程序或mysqlhotcopy腳本
MYSQL 5.1的參考手冊中關於mysqldump的說明:
“可用來轉儲數據庫或搜集數據庫進行備份或將數據轉移到另一個SQL服務器(不一定是一個MySQL服務器)。轉儲包含創建表和/或裝載表的SQL語句。“
JAVA可以運用Process類的exec(String str)方法調用系統命令,所以需要在服務器上安裝mysqldump程序已完成備份,
可以對遠程的數據庫服務器進行備份(配置hostname參數),備份語句具體參數參考MYSQL參考手冊
MYSQL備份命令行:
SQL代碼
mysqldump -hhostname -uusername -ppassword databasename > ‘backupfile’
MYSQL還原命令行:
SQL代碼
mysql -hhostname -uusername -ppassword databasename < ‘backupfile
下面貼一種方法的Demo
DBDataBase.java
package dbmanager.action; /** * 數據庫連接信息 * @author Dana·Li */ public class DBDataBase { public final String USERNAME="root"; public final String PASSWORD="123456"; public final String DBUOSTIP="192.168.0.129"; public final String ENCONDING="UTF-8"; public final String NAME="visecmc"; }
DBBackUp.java
package dbmanager.action; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /** * 數據庫備份與還原 * @author Dana·Li */ public class DBBackUp { public final String BACKUP_COMMAND ="mysqldump"; public final String ENCODING ="utf8"; /** * 備份數據 * @param file * @return */ public boolean backup(String file) { boolean isSuccess =true; try { Runtime rt = Runtime.getRuntime(); String backupStr =this.getBackupStr(); Process process = rt.exec(backupStr); BufferedReader br =new BufferedReader(new InputStreamReader(process.getInputStream(), ENCODING)); String inStr =""; StringBuffer sb =new StringBuffer(""); while ((inStr = br.readLine()) !=null) { sb.append(inStr).append(""); } String outStr = sb.toString(); OutputStreamWriter writer =new OutputStreamWriter(new FileOutputStream(file), ENCODING); writer.write(outStr); writer.flush(); br.close(); writer.close(); }catch (Exception e) { e.printStackTrace(); isSuccess =false; } return isSuccess; } /** * 執行語句 * @return */ private String getBackupStr() { DBDataBase db=new DBDataBase(); String backupStr = BACKUP_COMMAND +" -u" + db.USERNAME +" -p" + db.PASSWORD +" -h" + db.DBUOSTIP +" --set-charset=" + db.ENCONDING +" " + db.NAME; return backupStr; } }
DBRevert.java
package dbmanager.action; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /** * 數據庫還原 * @author Dana·Li */ public class DBRevert { public final String REVERT_COMMAND ="mysql"; public final String ENCODING ="utf8"; /** * 數據還原 * @param file * @return */ public boolean revert(String file) { try { Runtime rt = Runtime.getRuntime(); String revertStr =this.getRevertStr(); Process process = rt.exec(revertStr); String inStr; StringBuffer sb =new StringBuffer(""); BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream(file), ENCODING)); while ((inStr = br.readLine()) !=null) { sb.append(inStr).append(""); } String outStr = sb.toString(); OutputStreamWriter writer =new OutputStreamWriter(process.getOutputStream(), ENCODING); writer.write(outStr); writer.flush(); br.close(); writer.close(); }catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 執行操作 * @return */ private String getRevertStr() { DBDataBase db=new DBDataBase(); String backupStr = REVERT_COMMAND +" -u" + db.USERNAME +" -p" + db.PASSWORD +" -h" + db.DBUOSTIP +" --set-charset=" + db.ENCONDING +" " + db.NAME; return backupStr; } }
