本文目錄一覽:
如何用Java實現MySQL資料庫的備份和恢復
MySQL的一些前台工具是有備份恢復功能的,可是如何在我們的應用程序中實現這一功能呢?本文提供了示例代碼來說明如何使用Java代碼實現MySQL資料庫的備份恢復。
本次實現是使用了MySQL資料庫本身提供的備份命令mysqldump和恢復命令mysql,在java代碼中通過從命令行調用這兩條命令來實現備份和恢復。備份和恢復所使用的文件都是sql文件。
本代碼是參照網上某網友提供的源碼完成的。
[java] view plaincopy
package xxx.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
/**
* MySQL資料庫的備份與恢復 缺陷:可能會被殺毒軟體攔截
*
* @author xxx
* @version xxx
*/
public class DatabaseBackup {
/** MySQL安裝目錄的Bin目錄的絕對路徑 */
private String mysqlBinPath;
/** 訪問MySQL資料庫的用戶名 */
private String username;
/** 訪問MySQL資料庫的密碼 */
private String password;
public String getMysqlBinPath() {
return mysqlBinPath;
}
public void setMysqlBinPath(String mysqlBinPath) {
this.mysqlBinPath = mysqlBinPath;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public DatabaseBackup(String mysqlBinPath, String username, String password) {
if (!mysqlBinPath.endsWith(File.separator)) {
mysqlBinPath = mysqlBinPath + File.separator;
}
this.mysqlBinPath = mysqlBinPath;
this.username = username;
this.password = password;
}
/**
* 備份資料庫
*
* @param output
* 輸出流
* @param dbname
* 要備份的資料庫名
*/
public void backup(OutputStream output, String dbname) {
String command = “cmd /c ” + mysqlBinPath + “mysqldump -u” + username
+ ” -p” + password + ” –set-charset=utf8 ” + dbname;
PrintWriter p = null;
BufferedReader reader = null;
try {
p = new PrintWriter(new OutputStreamWriter(output, “utf8”));
Process process = Runtime.getRuntime().exec(command);
InputStreamReader inputStreamReader = new InputStreamReader(process
.getInputStream(), “utf8”);
reader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = reader.readLine()) != null) {
p.println(line);
}
p.flush();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (p != null) {
p.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 備份資料庫,如果指定路徑的文件不存在會自動生成
*
* @param dest
* 備份文件的路徑
* @param dbname
* 要備份的資料庫
*/
public void backup(String dest, String dbname) {
try {
OutputStream out = new FileOutputStream(dest);
backup(out, dbname);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 恢復資料庫
*
* @param input
* 輸入流
* @param dbname
* 資料庫名
*/
public void restore(InputStream input, String dbname) {
String command = “cmd /c ” + mysqlBinPath + “mysql -u” + username
+ ” -p” + password + ” ” + dbname;
try {
Process process = Runtime.getRuntime().exec(command);
OutputStream out = process.getOutputStream();
String line = null;
String outStr = null;
StringBuffer sb = new StringBuffer(“”);
BufferedReader br = new BufferedReader(new InputStreamReader(input,
“utf8”));
while ((line = br.readLine()) != null) {
sb.append(line + “/r/n”);
}
outStr = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(out, “utf8”);
writer.write(outStr);
writer.flush();
out.close();
br.close();
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 恢復資料庫
*
* @param dest
* 備份文件的路徑
* @param dbname
* 資料庫名
*/
public void restore(String dest, String dbname) {
try {
InputStream input = new FileInputStream(dest);
restore(input, dbname);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Configuration config = HibernateSessionFactory.getConfiguration();
String binPath = config.getProperty(“mysql.binpath”);
String userName = config.getProperty(“connection.username”);
String pwd = config.getProperty(“connection.password”);
DatabaseBackup bak = new DatabaseBackup(binPath, userName, pwd);
bak.backup(“c:/ttt.sql”, “ttt”);
bak.restore(“c:/ttt.sql”, “ttt”);
}
}
最後的main方法只是一個簡單的使用方法的示例代碼。
本人所做的項目是使用了hibernate的,而這裡需要提供MySQL的bin路徑和用戶名、密碼,而hibernate.cfg.xml中本身就是需要配置資料庫的用戶名和密碼,所以我把MySQL的bin路徑也直接配置到了這個文件裡面,也不需要創建專門的配置文件,不需要寫讀取配置文件的介面了。
如果不明白,可以去看hibernate.cfg.xml的說明,裡面是可以配置其他的property的
mysql怎麼通過備份還原資料庫文件
一、數據備份
1、使用mysqldump命令備份
mysqldump命令將資料庫中的數據備份成一個文本文件。表的結構和表中的數據將存儲在生成的文本文件中。
mysqldump命令的工作原理很簡單。它先查出需要備份的表的結構,再在文本文件中生成一個CREATE語句。然後,將表中的所有記錄轉換成一條INSERT語句。然後通過這些語句,就能夠創建表並插入數據。
1、備份一個資料庫
mysqldump基本語法:
mysqldump -u username -p dbname table1 table2 …- BackupName.sql
其中:
dbname參數表示資料庫的名稱;
table1和table2參數表示需要備份的表的名稱,為空則整個資料庫備份;
BackupName.sql參數表設計備份文件的名稱,文件名前面可以加上一個絕對路徑。通常將資料庫被分成一個後綴名為sql的文件;
使用root用戶備份test資料庫下的person表
mysqldump -u root -p test person D:\backup.sql
其生成的腳本如下:
文件的開頭會記錄MySQL的版本、備份的主機名和資料庫名。
文件中以「–」開頭的都是SQL語言的注釋,以”/*!40101″等形式開頭的是與MySQL有關的注釋。40101是MySQL資料庫的版本號,如果MySQL的版本比1.11高,則/*!40101和*/之間的內容就被當做SQL命令來執行,如果比4.1.1低就會被當做注釋。
2、備份多個資料庫
語法:
mysqldump -u username -p –databases dbname2 dbname2 Backup.sql
加上了–databases選項,然後後面跟多個資料庫
mysqldump -u root -p –databases test mysql D:\backup.sql
3、備份所有資料庫
mysqldump命令備份所有資料庫的語法如下:
mysqldump -u username -p -all-databases BackupName.sql
示例:
mysqldump -u -root -p -all-databases D:\all.sql
2、直接複製整個資料庫目錄
MySQL有一種非常簡單的備份方法,就是將MySQL中的資料庫文件直接複製出來。這是最簡單,速度最快的方法。
不過在此之前,要先將伺服器停止,這樣才可以保證在複製期間資料庫的數據不會發生變化。如果在複製資料庫的過程中還有數據寫入,就會造成數據不一致。這種情況在開發環境可以,但是在生產環境中很難允許備份伺服器。
注意:這種方法不適用於InnoDB存儲引擎的表,而對於MyISAM存儲引擎的表很方便。同時,還原時MySQL的版本最好相同。
3、使用mysqlhotcopy工具快速備份
一看名字就知道是熱備份。因此,mysqlhotcopy支持不停止MySQL伺服器備份。而且,mysqlhotcopy的備份方式比mysqldump快。mysqlhotcopy是一個perl腳本,主要在Linux系統下使用。其使用LOCK TABLES、FLUSH TABLES和cp來進行快速備份。
原理:先將需要備份的資料庫加上一個讀鎖,然後用FLUSH TABLES將內存中的數據寫回到硬碟上的資料庫,最後,把需要備份的資料庫文件複製到目標目錄。
命令格式如下:
[root@localhost ~]# mysqlhotcopy [option] dbname1 dbname2 backupDir/
dbname:資料庫名稱;
backupDir:備份到哪個文件夾下;
常用選項:
–help:查看mysqlhotcopy幫助;
–allowold:如果備份目錄下存在相同的備份文件,將舊的備份文件加上_old;
–keepold:如果備份目錄下存在相同的備份文件,不刪除舊的備份文件,而是將舊的文件更名;
–flushlog:本次輩分之後,將對資料庫的更新記錄到日誌中;
–noindices:只備份數據文件,不備份索引文件;
–user=用戶名:用來指定用戶名,可以用-u代替;
–password=密碼:用來指定密碼,可以用-p代替。使用-p時,密碼與-p之間沒有空格;
–port=埠號:用來指定訪問埠,可以用-P代替;
–socket=socket文件:用來指定socket文件,可以用-S代替;
mysqlhotcopy並非mysql自帶,需要安裝Perl的資料庫介麵包;下載地址為:
目前,該工具也僅僅能夠備份MyISAM類型的表。
二、數據還原
1、還原使用mysqldump命令備份的資料庫的語法如下:
mysql -u root -p [dbname] backup.sq
示例:
mysql -u root -p C:\backup.sql
2、還原直接複製目錄的備份
通過這種方式還原時,必須保證兩個MySQL資料庫的版本號是相同的。MyISAM類型的表有效,對於InnoDB類型的表不可用,InnoDB表的表空間不能直接複製。
mysql資料庫備份和還原
MySQL資料庫備份與還原
備份和恢複數據
生成SQL腳本
在控制台使用mysqldump命令可以用來生成指定資料庫的腳本文本,但要注意,腳本文本中只包含資料庫的內容,而不會存在創建資料庫的語句!所以在恢複數據時,還需要自已手動創建一個資料庫之後再去恢複數據。
mysqldump –u用戶名 –p密碼 資料庫名生成的腳本文件路徑
現在可以在C盤下找到mydb1.sql文件了!
注意,mysqldump命令是在Windows控制台下執行,無需登錄mysql!!!
執行SQL腳本
執行SQL腳本需要登錄mysql,然後進入指定資料庫,才可以執行SQL腳本!!!
執行SQL腳本不只是用來恢復資料庫,也可以在平時編寫SQL腳本,然後使用執行SQL 腳本來操作資料庫!大家都知道,在黑屏下編寫SQL語句時,就算髮現了錯誤,可能也不能修改了。所以我建議大家使用腳本文件來編寫SQL代碼,然後執行之!
SOURCE C:\mydb1.sql
注意,在執行腳本時需要先行核查當前資料庫中的表是否與腳本文件中的語句有衝突!例如在腳本文件中存在create table a的語句,而當前資料庫中已經存在了a表,那麼就會出錯!
還可以通過下面的方式來執行腳本文件:
mysql -uroot -p123 mydb1c:\mydb1.sql
mysql –u用戶名 –p密碼 資料庫要執行腳本文件路徑
這種方式無需登錄mysql!
怎麼備份和還原mysql資料庫
備份資料庫
使用mysqldump命令備份資料庫
還原資料庫
1、使用mysql命令還原資料庫
將game_backup.sql
還原至
game
資料庫:
2、使用source命令還原資料庫
如果資料庫過大,建議可以使用source命令
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249258.html