java调用命令行执行mysqldump和执行sql文件恢复命令
2017-09-18 19:21
666 查看
java执行mysqldump步骤:
1.服务器上需要安装mysql客户端:
(1)windows系统安装mysql客户端并配置环境变量;
(2)linux系统安装mysql客户端,不需要配置环境变量;
2.java拼接mysqldump命令:
3.java代码调用命令行执行mysqldump命令;
示例如下:
========================================================================
java读取sql文件并执行sql语句进行恢复的三种方式:
方式一:jdbc执行sql文件
1.读取备份sql文件并获取sql集合:
2.由于sql语句类型比较繁杂,没有使用mybatis框架执行sql语句,而是采用了原始jdbc执行sql集合:
jdbc工具类:
jdbc配置文件:jdbc.properties
其他两种执行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
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
相关文章推荐
- java 执行命令、调用bat文件、调用外部程序的两种方法
- java调用windows/Linux/Unix 命令行执行命令的方法--调用ImageMagick的合并图形的命令
- Linux命令行执行.sql文件及常用sql命令
- Java如何调用可执行文件和批处理命令
- 通过adb命令在Android设备中执行Java命令, 并调用so文件。
- Java调用可执行文件和批处理命令
- 执行文件下载Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决
- Java如何调用可执行文件和批处理命令
- 使用java的java 命令,直接调用执行class文件
- Java——调用命令行执行命令后到Java控制台显示
- JAVA调用系统命令或可执行文件
- java调用sqlplus执行批量脚本获得输出结果和调用.bat文件
- Java 执行终端命令实现,调用执行另外一个Java文件
- Java调用可执行文件和批处理命令
- Java 环境中执行SQL命令和调用存储过程
- java 调用命令行执行ruby ruby文件必须放在项目跟目录
- java 中调用window系统中的文件,或者执行命令(shell、.CMD、.EXE)并获取返回值
- Java如何调用可执行文件和批处理命令
- Java如何调用可执行文件和批处理命令
- PHP调用Linux的命令行执行文件压缩命令