Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
1057
2022-05-29
使用 mysqldump 備份數(shù)據(jù)庫也是可行的,因為每次備份的時候都需要mysqldump這個文件, 我在windows備份時沒問題,但是放到linux上面時,centos系統(tǒng)死活不認(rèn)這個文件,但又不想裝mysql,一氣之下自己研究了個不需要mysqldump就可以備份的程序,
如果看了以下代碼還有不懂的地方,這個網(wǎng)站有我的聯(lián)系方式http://www.huashuku.top/about.htm, 站長就是我本人
廢話不多說,直接上代碼
添加jdbc驅(qū)動 和httpClient的 maven依賴
備份程序
package com.mysql.bak;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.utils.FileUtils;
/**
* 利用jdbc備份MySql數(shù)據(jù)庫--不用mysqldump
*
*/
public class BakDateBase {
private String DRIVER = "com.mysql.jdbc.Driver";
private String URL = null; // "jdbc:mysql://182.xxx.xxx.xxx:3306/xd_love_dev?useUnicode=true&characterEncoding=utf8";
private String USERNAME = null;// "root";
private String PASSWORD = null;//"woaini";
// 備份的文件地址
private String filePath;
private Connection conn = null;
private String SQL = "SELECT * FROM ";// 數(shù)據(jù)庫操作
/**
*
* <構(gòu)造函數(shù)>
*
* @param ip
* 數(shù)據(jù)庫ip地址
* @param database
* 數(shù)據(jù)庫名稱
* @param userName
* 數(shù)據(jù)庫用戶名
* @param password
* 密碼
* @param bakFilePath
* 備份的地址
*/
public BakDateBase(String ip, String database, String userName, String password, String bakFilePath) {
try {
Class.forName(this.DRIVER);
this.URL = String.format("jdbc:mysql://%s:3306/%s?useUnicode=true&characterEncoding=utf8", ip, database);
this.USERNAME = userName;
this.PASSWORD = password;
SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-ddHH時mm分ss秒");
String datetime = tempDate.format(new java.util.Date());
//自動加上時間戳
datetime = datetime + "_數(shù)據(jù)庫名稱:" + database ;
if(bakFilePath.indexOf(".") != -1) {
bakFilePath = bakFilePath.replace(".", datetime+".");
} else {
bakFilePath = datetime + ".sql";
}
this.filePath = bakFilePath;
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.err.println("can not load jdbc driver");
}
}
/**
* 獲取數(shù)據(jù)庫連接
*
* @return
*/
private Connection getConnection() {
try {
if (null == conn) {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
} catch (SQLException e) {
e.printStackTrace();
System.err.println("get connection failure");
}
return conn;
}
/**
* 關(guān)閉數(shù)據(jù)庫連接
*
* @param conn
*/
private void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("close connection failure");
}
}
}
/**
* 獲取數(shù)據(jù)庫下的所有表名
*/
private List
List
Connection conn = getConnection();
ResultSet rs = null;
try {
// 獲取數(shù)據(jù)庫的元數(shù)據(jù)
DatabaseMetaData db = conn.getMetaData();
// 從元數(shù)據(jù)中獲取到所有的表名
rs = db.getTables(null, null, null, new String[] { "TABLE" });
while (rs.next()) {
tableNames.add(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
System.err.println("getTableNames failure");
} finally {
try {
if (null != rs) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
System.err.println("close ResultSet failure");
}
}
return tableNames;
}
/**
* 獲取表中所有字段名稱
*
* @param tableName
* 表名
* @return
*/
private List
List
// 與數(shù)據(jù)庫的連接
Connection conn = getConnection();
PreparedStatement pStemt = null;
String tableSql = SQL + tableName;
try {
pStemt = conn.prepareStatement(tableSql);
// 結(jié)果集元數(shù)據(jù)
ResultSetMetaData rsmd = pStemt.getMetaData();
// 表列數(shù)
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
columnNames.add(rsmd.getColumnName(i + 1));
}
} catch (SQLException e) {
System.err.println("getColumnNames failure");
e.printStackTrace();
} finally {
if (pStemt != null) {
try {
pStemt.close();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("getColumnNames close pstem and connection failure");
}
}
}
return columnNames;
}
/**
* 獲取表中所有字段類型
*
* @param tableName
* @return
*/
private List
List
// 與數(shù)據(jù)庫的連接
Connection conn = getConnection();
PreparedStatement pStemt = null;
String tableSql = SQL + tableName;
try {
pStemt = conn.prepareStatement(tableSql);
// 結(jié)果集元數(shù)據(jù)
ResultSetMetaData rsmd = pStemt.getMetaData();
// 表列數(shù)
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
columnTypes.add(rsmd.getColumnTypeName(i + 1));
}
} catch (SQLException e) {
e.printStackTrace();
System.err.println("getColumnTypes failure");
} finally {
if (pStemt != null) {
try {
pStemt.close();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("getColumnTypes close pstem and connection failure");
}
}
}
return columnTypes;
}
/**
*
*
* 生成建表語句
*
*
* @param tableName
* @return
* @author 葉新東(18126064335) 2018年9月6日 上午9:35:49
*/
private String generateCreateTableSql(String tableName) {
String sql = String.format("SHOW CREATE TABLE %s", tableName);
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 返回建表語句語句,查詢結(jié)果的第二列是建表語句,第一列是表名
return rs.getString(2);
}
} catch (Exception e) {
e.printStackTrace();
try {
if (null != pstmt) {
pstmt.close();
}
} catch (Exception e2) {
e.printStackTrace();
System.err.println("關(guān)閉流異常");
}
}
return null;
}
/**
* 獲取表中字段的所有注釋
*
* @param tableName
* @return
*/
private List
// 與數(shù)據(jù)庫的連接
Connection conn = getConnection();
PreparedStatement pStemt = null;
String tableSql = SQL + tableName;
List
ResultSet rs = null;
try {
pStemt = conn.prepareStatement(tableSql);
rs = pStemt.executeQuery("show full columns from " + tableName);
while (rs.next()) {
columnComments.add(rs.getString("Comment"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("getColumnComments close ResultSet and connection failure");
}
}
}
return columnComments;
}
/**
*
*
* 備份表數(shù)據(jù)
*
*
* @param tableName
* @return
* @author () 2018年9月6日 上午10:18:07
*/
private String bakTableData(String tableName) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 備份建表語句
String createTableSql = generateCreateTableSql(tableName);
createTableSql = String.format(
"\n\n\n/**\n * table name :<%s>\n *\n */\n%s\n",
tableName, createTableSql);
FileUtils.writeFileContent(filePath, createTableSql);
// 獲取字段類型
List
// 獲取所有 字段
List
String columnArrayStr = null;
for (String column : columnNames) {
if (null == columnArrayStr) {
columnArrayStr = "`" + column + "`";
} else {
columnArrayStr = columnArrayStr + "," + "`" + column + "`";
}
}
String sql = String.format("select %s from %s", columnArrayStr, tableName);
conn = getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String rowValues = getRowValues(rs, columnNames.size(), columnTypes);
// 返回建表語句語句,查詢結(jié)果的第二列是建表語句,第一列是表名
String insertSql = String.format("insert into %s (%s) values(%s);", tableName, columnArrayStr,
rowValues);
System.out.println(insertSql);
insertSql = insertSql.replaceAll("\n", "
");
insertSql = insertSql + "\n";
FileUtils.writeFileContent(filePath, insertSql);
}
} catch (Exception e) {
e.printStackTrace();
try {
if (null != pstmt) {
pstmt.close();
}
} catch (Exception e2) {
e.printStackTrace();
System.err.println("關(guān)閉流異常");
}
}
return null;
}
/**
*
*
* 獲取表數(shù)據(jù)一行的所有值
*
*
* @param rs
* @param size
* @author 2018年9月6日 上午11:03:05
*/
private String getRowValues(ResultSet rs, int size, List
try {
String rowValues = null;
for (int i = 1; i <= size; i++) {
String columnValue = null;
// 獲取字段值
columnValue = getValue(rs, i, columnTypeList.get(i - 1));
// 如果是空值不添加單引號
if (null != columnValue) {
columnValue = "'" + columnValue + "'";
}
// 拼接字段值
if (null == rowValues) {
rowValues = columnValue;
} else {
rowValues = rowValues + "," + columnValue;
}
}
return rowValues;
} catch (Exception e) {
e.printStackTrace();
System.out.println("獲取表數(shù)據(jù)一行的所有值異常");
return null;
}
}
/**
*
*
* 根據(jù)類型獲取字段值
*
*
* @param obj
* @return
* @author 2018年9月6日 上午11:16:00
*/
private String getValue(ResultSet resultSet, Integer index, String columnType) {
try {
if ("int".equals(columnType) || "INT".equals(columnType)) {
// 整數(shù)
Object intValue = resultSet.getObject(index);
if (null == intValue) {
return null;
}
return intValue + "";
} else if ("bigint".equals(columnType) || "BIGINT".equals(columnType)) {
// 長整形
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("smallint".equals(columnType) || "SMALLINT".equals(columnType)) {
// 整數(shù)
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("tinyint".equals(columnType) || "TINYINT".equals(columnType)) {
// 整數(shù)
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("mediumint".equals(columnType) || "MEDIUMINT".equals(columnType)) {
// 長整形
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("integer".equals(columnType) || "INTEGER".equals(columnType)) {
// 整數(shù)
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("float".equals(columnType) || "FLOAT".equals(columnType)) {
// 浮點數(shù)
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("double".equals(columnType) || "DOUBLE".equals(columnType)) {
// 浮點數(shù)
Object value = resultSet.getObject(index);
if (null == value) {
return null;
}
return value + "";
} else if ("decimal".equals(columnType) || "DECIMAL".equals(columnType)) {
// 浮點數(shù)-金額類型
BigDecimal value = resultSet.getBigDecimal(index);
if (null == value) {
return null;
}
return value.toString();
} else if ("char".equals(columnType) || "CHAR".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("varchar".equals(columnType) || "VARCHAR".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("tinytext".equals(columnType) || "TINYTEXT".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("text".equals(columnType) || "TEXT".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("mediumtext".equals(columnType) || "MEDIUMTEXT".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("longtext".equals(columnType) || "LONGTEXT".equals(columnType)) {
// 字符串類型
String value = resultSet.getString(index);
return value;
} else if ("year".equals(columnType) || "YEAR".equals(columnType)) {
// 時間類型:范圍 1901/2155 格式 YYYY
String year = resultSet.getString(index);
if (null == year) {
return null;
}
// 只需要年的字符即可,
return year.substring(0, 4);
} else if ("date".equals(columnType) || "DATE".equals(columnType)) {
// 時間類型:范圍 '1000-01-01'--'9999-12-31' 格式 YYYY-MM-DD
return resultSet.getString(index);
} else if ("time".equals(columnType) || "TIME".equals(columnType)) {
// 時間類型:范圍 '-838:59:59'到'838:59:59' 格式 HH:MM:SS
return resultSet.getString(index);
} else if ("datetime".equals(columnType) || "DATETIME".equals(columnType)) {
// 時間類型:范圍 '1000-01-01 00:00:00'--'9999-12-31 23:59:59' 格式 YYYY-MM-DD HH:MM:SS
return resultSet.getString(index);
} else if ("timestamp".equals(columnType) || "TIMESTAMP".equals(columnType)) {
// 時間類型:范圍 1970-01-01 00:00:00/2037 年某時 格式 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
return resultSet.getString(index);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("獲取數(shù)據(jù)庫類型值異常");
return null;
}
}
/**
*
* <開始備份>
*
* @author 2018年9月6日 下午3:30:43
*/
public void startBak() {
try {
List
System.out.println("tableNames:" + tableNames);
for (String tableName : tableNames) {
bakTableData(tableName);
// System.out.println(generateCreateTableSql(tableName));
// System.out.println("ColumnNames:" + getColumnNames(tableName));
// System.out.println("ColumnTypes:" + getColumnTypes(tableName));
// System.out.println("ColumnComments:" + getColumnComments(tableName));
}
// 統(tǒng)一關(guān)閉連接
closeConnection(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new BakDateBase("182.xxx.xxx.xxx", "xd_love_dev", "root", "woaini", "f:\\bak.sql").startBak();
}
}
執(zhí)行 main 方法后會在磁盤指定位置生成 .sql? 的文件,內(nèi)容如下:
Java MySQL 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。