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

来源:互联网 发布:开心贷网络借贷 编辑:程序博客网 时间:2024/06/17 10:45

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        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;@Repositorypublic 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.Driverusername=rooturl=jdbc:mysql://192.168.4.79:3306/business_collaboration?allowMultiQueries=truepassword=123456host=192.168.4.79port=3306dataBaseName=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

原创粉丝点击