您的位置:首页 > 编程语言 > Java开发

java调用命令行执行mysqldump和执行sql文件恢复命令

2017-09-18 19:21 666 查看
java执行mysqldump步骤:

1.服务器上需要安装mysql客户端:

(1)windows系统安装mysql客户端并配置环境变量;

(2)linux系统安装mysql客户端,不需要配置环境变量;

2.java拼接mysqldump命令:

/**
*
* @Title: getMysqlDumpCommand
* @Description: TODO(拼接模板备份数据库的mysqldump命令)
* @return String    返回类型
* @param properties
* @param tempFilePath sql临时文件存放路径
* @param templateId
* @param credentialsIds
* @param transactNodeIds
* @param transactLinkIds
* @return
*/
private String getMysqlDumpCommand(Properties properties, String tempFilePath, Integer templateId, String credentialsIds, String transactNodeIds, String transactLinkIds) {
StringBuilder sbf = new StringBuilder();
// 获取对应的数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String host = properties.getProperty("host");
String port = properties.getProperty("port");
// 拼接sql命令
String dataBaseName = properties.getProperty("dataBaseName");
StringBuilder dumpPrefix = new StringBuilder();
dumpPrefix.append("mysqldump -h" + host);
dumpPrefix.append(" -P" + port);
dumpPrefix.append(" -u" + username);
dumpPrefix.append(" -p" + password);
//导出的sql中不包含drop table,create table语句
dumpPrefix.append(" --no-create-info");
dumpPrefix.append(" --skip-add-drop-table");
dumpPrefix.append(" --skip-add-locks");
dumpPrefix.append(" --skip-comments");
//      --max_allowed_packet=10240

1b4c9
dumpPrefix.append(" --max_allowed_packet=500M");

dumpPrefix.append(" --hex-blob");
dumpPrefix.append(" --default-character-set=utf8");
dumpPrefix.append(" --databases " + dataBaseName);

sbf.append(dumpPrefix);
sbf.append(" --tables");
for (int i = 0; i < TABLE_NAME1S.length; i++) {
sbf.append(" " + TABLE_NAME1S[i]);
}
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"template_id=" + templateId + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);

sbf.append(" && ");
sbf.append(dumpPrefix);
sbf.append(" --tables");
sbf.append(" management_credentials");
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"coordination_template_id=" + templateId + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);

if(!"".equals(credentialsIds)) {
sbf.append(" && ");
sbf.append(dumpPrefix);
sbf.append(" --tables");
sbf.append(" management_verify_verification");
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"credentials_management_id in(" + credentialsIds + ")" + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);
}

if(!"".equals(transactNodeIds)) {
sbf.append(" && ");
sbf.append(dumpPrefix);
sbf.append(" --tables");
sbf.append(" transact_link");
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"examine_nodeid in(" + transactNodeIds + ")" + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);

sbf.append(" && ");
sbf.append(dumpPrefix);
sbf.append(" --tables");
sbf.append(" transact_file_pocket");
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"node_id in(" + transactNodeIds + ")" + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);
}

if(!"".equals(transactLinkIds)) {
sbf.append(" && ");
sbf.append(dumpPrefix);
sbf.append(" --tables");
sbf.append(" transact_detail");
sbf.append(" --where=");
//where后边的条件查询语句不能用单引号,可以用双引号或者不加任何修饰
sbf.append("\"link_id in(" + transactLinkIds + ")" + "\"");
sbf.append(" >> ");
sbf.append(tempFilePath);
}

System.out.println("SQL==" + sbf.toString());
return sbf.toString();
}


3.java代码调用命令行执行mysqldump命令;

示例如下:

package edu.hrbeu.platform.modeling.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
* @ClassName: ExportSQLUtil
* @Description: TODO(导出SQL工具包)
* @author 陈立明
* @date 2016年12月29日 下午2:12:50
*/
public class ExportSQLUtil {
/**
*
* @Title: readProperties
* @Description: TODO(读取jdbc配置文件)
* @return Properties 返回类型
* @return
*/
public static Properties readProperties() {
// 读取配置文件
Properties properties = null;
InputStream inputStream = null;
try {
// 加载配置文件
inputStream = ExportSQLUtil.class.getResourceAsStream("/jdbc.properties");
properties = new Properties();
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return properties;
}
/**
*
* @Title: exeDump
* @Description: TODO(java调用命令行执行mysqldump命令)
* @return void    返回类型
* @param mysqlDumpCommand mysqldump命令
* @throws IOException
* @throws InterruptedException
*/
public static void exeDump(String mysqlDumpCommand) throws IOException, InterruptedException {
try {
// 运行导出SQL命令
String os = System.getProperty("os.name"); // 系统名称
if (os.toLowerCase().startsWith("win")) {
Process process = Runtime.getRuntime().exec(new String[] { "cmd", "/c", mysqlDumpCommand }); // windows
process.waitFor();
} else if (os.toLowerCase().startsWith("linux")) {
Process process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", mysqlDumpCommand }); // linux
process.waitFor();
}
} catch (IOException e) {
e.printStackTrace();
throw e;
} catch (InterruptedException e) {
e.printStackTrace();
throw e;
}
}
}


========================================================================

java读取sql文件并执行sql语句进行恢复的三种方式:

方式一:jdbc执行sql文件

1.读取备份sql文件并获取sql集合:

/**
*
* @Title: byteToSqlList
* @Description: TODO(将byte[]转换为可执行的sql集合)
* @return List<String>    返回类型
* @param bytes
* @throws Exception
*/
public List<String> byteToSqlList(byte[] bytes) throws Exception {
StringBuffer dumpSql = new StringBuffer();
dumpSql.append(new String(bytes, 0, bytes.length, "UTF-8"));
// Windows 下换行是 /r/n, Linux 下是 /n  (;\\s*\\r\\n)|(;\\s*\\n)
//默认是linux
String regex = ";\\s*\\n";
String os = System.getProperty("os.name"); // 系统名称
if (os.toLowerCase().startsWith("win")) {
regex = ";\\s*\\r\\n";
} else if (os.toLowerCase().startsWith("linux")) {
regex = ";\\s*\\n";
}
String[] sqlArr = dumpSql.toString().split(regex);
List<String> sqlList = new ArrayList<>();
for (int i = 0; i < sqlArr.length; i++) {
//去除"--"和"/**/"
String sql = sqlArr[i].replaceAll("--.*", "").replaceAll("^/\\*.*\\*/$", "").trim();
if (!sql.equals("")) {
sqlList.add(sql);
}
}
return sqlList;
}


2.由于sql语句类型比较繁杂,没有使用mybatis框架执行sql语句,而是采用了原始jdbc执行sql集合:

package edu.hrbeu.platform.modeling.businessCollaboration.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import org.springframework.stereotype.Repository;

import edu.hrbeu.platform.modeling.common.util.JdbcUtils;
import edu.hrbeu.platform.modeling.pojo.ContentLicense;
import edu.hrbeu.platform.modeling.pojo.ContentVitalDocument;
@Repository
public class CoordinationTemplateVersionDao {
/**
*
* @Title: recoverTemplate
* @Description: TODO(执行恢复模板,sql集合)
* @return void    返回类型
* @param sqlList
* @throws Exception
*/
public void recoverTemplate(List<String> sqlList) throws Exception {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
JdbcUtils.startTransaction();
//执行模板恢复
for (int i = 0; i < sqlList.size(); i++) {
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sqlList.get(i));
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
JdbcUtils.closeStatement(preparedStatement);
}
}

} catch (Exception e) {
e.printStackTrace();
try {
JdbcUtils.rollback();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
throw e;
} finally {
try {
JdbcUtils.commitAndClose();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}

}


jdbc工具类:

package edu.hrbeu.platform.modeling.common.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

//使用ThreadLocal完成操作
public class JdbcUtils {

public static final String DRIVERCLASS;
public static final String URL;
public static final String USERNAME;
public static final String PASSWORD;

static {
// 从配置文件中加载数据
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
DRIVERCLASS = bundle.getString("driver");
URL = bundle.getString("url");
USERNAME = bundle.getString("username");
PASSWORD = bundle.getString("password");
//      URL = "jdbc:mysql://192.168.2.23:3306/business_collaboration?allowMultiQueries=true";
//      PASSWORD = "root";
}

static {
// 1.注册驱动
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

private static final ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

public static Connection getConnection() throws ClassNotFoundException,
SQLException {

// 2.获取连接对象Connection
Connection con = tl.get(); // 从ThreadLocal中获取,那么第一次获取时,得到的是null 代码
// map.get(Thread.currentThread());
//tomcat线程复用可能导致,线程获取到已经关闭的连接,所以需要判断是否关闭
if (con == null || con.isClosed()) {
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
tl.set(con);// 这时就相当于 map.put(Thread.currentThead(),con);
}
return con;
}

// 做一个开启事务的方法
public static void startTransaction() throws ClassNotFoundException,
SQLException {
Connection con = JdbcUtils.getConnection();
if (con != null) {
con.setAutoCommit(false);
//设定隔离级别为重复读
con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
}
}

// 事务回滚
public static void rollback() throws SQLException, ClassNotFoundException {
Connection con = JdbcUtils.getConnection();
if (con != null) {
con.rollback();
}
}

// 事务提交及关闭资源
public static void commitAndClose() throws SQLException,
ClassNotFoundException {
Connection con = JdbcUtils.getConnection();
if (con != null) {
con.commit();
con.close();
}
}
public static void Close() throws SQLException,
ClassNotFoundException {
Connection con = JdbcUtils.getConnection();
if (con != null) {
con.close();
}
}

// 提供关闭操作
public static void closeConnection(Connection con) throws SQLException {
if (con != null) {
con.close();
}
}

public static void closeStatement(Statement st) throws SQLException {
if (st != null)
st.close();
}

public static void closeResultSet(ResultSet rs) throws SQLException {
if (rs != null)
rs.close();
}
}


jdbc配置文件:jdbc.properties

driver=com.mysql.jdbc.Driver
username=root
url=jdbc:mysql://192.168.4.79:3306/business_collaboration?allowMultiQueries=true
password=123456
host=192.168.4.79
port=3306
dataBaseName=business_collaboration


其他两种执行sql文件的方式参考链接:http://blog.csdn.net/fish_817/article/details/49890753

(1)ibatis方式执行SQL文件:http://blog.csdn.net/menghuanzhiming/article/details/78257060

(2)ant执行SQL文件

参考:

MySQL的mysqldump工具的基本用法:http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html

java调用mysql工具,实现数据库备份:http://skying007.iteye.com/blog/769627

MySQL mysqldump数据导出详解:http://www.cnblogs.com/chenmh/p/5300370.html

Java对MySql数据库进行备份与还原:http://www.cnblogs.com/molao-doing/articles/MySql.html

java 调用命令 备份mysql数据库【收藏】:http://www.cnblogs.com/cf1504/articles/1352627.html

java程序执行SQL脚本文件:http://blog.csdn.net/runming56/article/details/35985479
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: