java 备份oracle,mysql数据库生成sql

1.最近开发java 备份数据库功能发现网上都是通过oracle客户端进行备份,部署项目的服务器还装oracle服务端那不是太麻烦了,mysql 也是通过客户端实现,
我折腾了好久终于不用客户端实现
实现环境为spring boot,实现方法如下:

@Service
public class BackUpDoServiceImpl extends ServiceImpl<BackUpDoMapper, BackUpDo> implements BackUpDoService {
Logger logger = LoggerFactory.getLogger(BackUpDoServiceImpl.class);
    @Value("${spring.datasource.driverClassName}")
    private String jdbcDriver;

    @Value("${spring.datasource.druid.first.url}")
    private String jdbcUrl;
    @Resource
    private UploadProperties uploadProperties;

    @Value("${spring.datasource.druid.first.username}")
    private String jdbcUserName;

    @Value("${spring.datasource.druid.first.password}")
    private String jdbcPassword;
    private String orcaleSQL = "SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE "
            + "FROM USER_OBJECTS U "
            + "where U.OBJECT_TYPE = 'TABLE' "
            + "or U.OBJECT_TYPE = 'VIEW' "
            + "or U.OBJECT_TYPE = 'INDEX' "
            + "or U.OBJECT_TYPE = 'PROCEDURE' "
            + "or U.OBJECT_TYPE = 'SEQUENCE' "
            + "or U.OBJECT_TYPE = 'TRIGGER' " + "order by U.OBJECT_TYPE desc";

  @Override
  public String backupData() throws IOException, ClassNotFoundException, SQLException {

        File file=new File(uploadProperties.getBasePath());
        if(!file.exists()){
            file.mkdir();
        }
        Format f = new SimpleDateFormat("yyyyMMddHmmss");
        Date date = new Date();
        //oracle备份模式
        if (jdbcDriver.contains("oracle")) {
            String tablesFile = "";
            String sequencesFile = "";
            String indexsFile = "";
            String createTableStr=f.format(date) + "oracle创表.sql";
            String dataStr=f.format(date) + "oracle数据" + ".sql";
            File dataFile=null;
            StringBuilder fwT = new StringBuilder();
            StringBuilder fwS = new StringBuilder();
            StringBuilder fwI = new StringBuilder();
            File outFile=null;

            Class.forName(jdbcDriver);
            Connection con = DriverManager.getConnection(jdbcUrl, jdbcUserName, jdbcPassword);
            Statement statement = con.createStatement();
            ResultSet rs = statement.executeQuery(orcaleSQL);

             outFile = new File(uploadProperties.getBasePath() + "/" + createTableStr);
            if (!outFile.exists()) {
                /* 创建文件夹*/
                outFile.createNewFile();
            }
            FileWriter fw = new FileWriter(outFile, true);
            while (rs.next()) {
                Clob ddl = rs.getClob(1);
                String objectName = rs.getString(2);

                String ddlStr = ddl.getSubString(1L, (int) ddl.length());
                if ("TABLE".equals(objectName)) {
                    fwT.append(ddlStr).append("\r\n");
                    ;
                }
                if ("SEQUENCE".equals(objectName)) {
                    fwS.append(ddlStr).append("\r\n");
                    ;
                }
                if ("INDEX".equals(objectName)) {
                    fwI.append(ddlStr).append("\r\n");
                    ;
                }
            }
            fw.write("---创表脚本---\r\n");
            fw.write(fwT.toString());
            fw.write("---序列脚本---\r\n");
            fw.write(fwS.toString());
            fw.write("---索引脚本---\r\n");
            fw.write(fwI.toString());
            fw.flush();
            fw.close();
            DatabaseMetaData dbmd = con.getMetaData();
            /*getTables获取表对象时用户名必须为大写*/
            String dbUserNameStr = jdbcUserName.toUpperCase();
            rs = dbmd.getTables("null", dbUserNameStr, "%", new String[]{"TABLE"});
            List<String> tableNames = new ArrayList<>();
            while (rs.next()) {
                String tableName = rs.getString("TABLE_NAME");
                tableNames.add(tableName);
            }
            if (tableNames != null && tableNames.size() > 0) {
                 dataFile = new File(uploadProperties.getBasePath() + "/" + dataStr);
                if (!dataFile.exists()) {
                    /* 创建文件*/
                    dataFile.createNewFile();
                }
                FileWriter dataFw = new FileWriter(dataFile, true);
                for (String str : tableNames) {
                    StringBuilder datWt = new StringBuilder();
                    try {
                        String insertSqlStr = SqlUtils.genOracleInsertInto(str, "", statement);
                        dataFw.write(insertSqlStr);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                dataFw.flush();
                dataFw.close();
            }
            rs.close();
            statement.close();
            con.close();
            /** 压缩方法2  */
            List<File> fileList = new ArrayList<>();
            if(dataFile!=null){
                fileList.add(dataFile);
            }
            if(outFile!=null){
                fileList.add(outFile);
            }
            FileOutputStream fos2 = new FileOutputStream(new File(uploadProperties.getBasePath()+f.format(date)+"oracle数据"+".zip"));
            try {
                FileUtils.toZip(fileList, fos2);
                dataFile.delete();
                outFile.delete();
                fos2.close();
            }catch (Exception ex){
                logger.error("压缩mysql脚本失败"+ex.toString());
                return "";
            }
            return uploadProperties.getBasePath()+f.format(date)+"oracle数据"+".zip";
        }
        if(jdbcDriver.contains("mysql")){

            File dataFile=null;
            Class.forName(jdbcDriver);
            Connection con = DriverManager.getConnection(jdbcUrl, jdbcUserName, jdbcPassword);

            Statement statement = con.createStatement();

            DatabaseMetaData dbmd = con.getMetaData();

            String dbName="";
            Integer index=jdbcUrl.lastIndexOf("/");
            String before=jdbcUrl.substring(0,index);
            String after=jdbcUrl.substring(index+1);
            if(after.contains("?")){
                index=after.lastIndexOf("?");
                dbName=after.substring(0,index);
            }
            con.getMetaData().getDatabaseProductName();
              ResultSet  rs = dbmd.getTables(dbName, null, null, new String[] { "TABLE" });
            List<String> tableNames = new ArrayList<>();
            while (rs.next()) {
                String tableName = rs.getString("TABLE_NAME");
                tableNames.add(tableName);
            }
            if (tableNames != null && tableNames.size() > 0) {
                 dataFile = new File(uploadProperties.getBasePath() + "/" + f.format(date) + "mysql数据" + ".sql");
                if (!dataFile.exists()) {
                    /* 创建文件*/
                    dataFile.createNewFile();
                }
                FileWriter dataFw = new FileWriter(dataFile, true);
                for (String str : tableNames) {
                    StringBuilder datWt = new StringBuilder();
                    try {
                        String insertSqlStr = SqlUtils.getMysqlInsertSql(statement, str, "");
                        dataFw.write(insertSqlStr);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                dataFw.flush();
                dataFw.close();
            }
                rs.close();
                statement.close();
                con.close();
            /** 压缩方法2  */
            List<File> fileList = new ArrayList<>();
            if(dataFile!=null){
                fileList.add(dataFile);
            }
            FileOutputStream fos2 = new FileOutputStream(new File(uploadProperties.getBasePath()+f.format(date)+"mysql数据"+".zip"));
           try {
               FileUtils.toZip(fileList, fos2);
               dataFile.delete();
               fos2.close();
           }catch (Exception ex){
               logger.error("压缩mysql脚本失败"+ex.toString());
               return "";
           }
            return uploadProperties.getBasePath()+f.format(date)+"mysql数据"+".zip";
        }
        return "";
    }

核心代码:Sqlutils代码如下:

 * Copyright
 *
 * @author chenwenchao
 * @date 2018/11/15 0015
 * Description:
 */
public class SqlUtils {

    /**
     * oracle生成插入语句语句
     *
     * @param tableName
     * @param whereSql
     * @param stmt
     * @return
     */
    public static String genOracleInsertInto(String tableName, String whereSql, Statement stmt) {
        ResultSet results = null;
        if (tableName.equals(null)) {
            return "/* No table! */\n";
        }
        // 存放表属性名
        String[] columnNames;
        // 存放一条记录的值
        String[] oneRowData;
        String insertOneTalbeDatas = null;
        // 查询结果属性
        ResultSetMetaData rsma = null;
        // 列数
        int numCols = 0;
        // 行数
        int numRows = 0;
        // 查询语句内容
        String queryStr = "SELECT * FROM " + tableName;
        if (whereSql != null && whereSql.length() > 0) {
            queryStr = queryStr + " where " + whereSql;
        }

        try {
            // 获取一个查询结果集为一张表的内容
            results = stmt.executeQuery(queryStr);
            // 表的记录数
            numRows = 0;
            boolean more = results.next();
            while (more) {
                numRows++;
                more = results.next();
            }
            // 初始化获取查询记录集属性
            rsma = results.getMetaData();
            // 初始化表的列数
            numCols = rsma.getColumnCount();
            columnNames = new String[numCols];
            // 初始化获取列名
            for (int i = 0; i < numCols; i++) {
                columnNames[i] = new String(rsma.getColumnName(i + 1));
            }
            // 初始化存放一条记录的数据
            oneRowData = new String[numCols];
        } catch (Exception e) {
            String warning = "/* Not found the table: " + tableName + "! */\n";
            System.out.println("three" + e.getMessage());
            return warning;
        }
        try {
            // 获取一个查询结果集为一张表的内容
            results = stmt.executeQuery(queryStr);
            // 初始化获取查询记录集属性
            rsma = results.getMetaData();
            //获取记录的内容
            StringBuffer insertAllRows = new StringBuffer();
            boolean more = results.next();
            int rowCounts = 0;
            while (more) {
                for (int i = 1; i <= numCols; i++) {
                    oneRowData[i - 1] = results.getString(i);
                }
                insertAllRows.append("insert into " + tableName.trim() + " (");
                for (int i = 0; i < numCols; i++) {
                    if (i != 0) {
                        insertAllRows.append(',');
                    }
                    insertAllRows.append(columnNames[i]);
                }
                insertAllRows.append(") values (");
                String columnType = "";
                for (int i = 0; i < numCols; i++) {
                    if (i != 0) {
                        insertAllRows.append(',');
                    }
                    columnType = rsma.getColumnTypeName(i + 1);
                    columnType = columnType.toUpperCase();
                    if (columnType.indexOf("VAR") >= 0 ||
                            columnType.indexOf("CHAR") >= 0 ||
                            columnType.indexOf("DATE") >= 0 ||
                            columnType.indexOf("TIME") >= 0 ||
                            columnType.indexOf("TEXT") >= 0 ||
                            columnType.indexOf("BINARY") >= 0) {
                        if (columnType.indexOf("DATE") >= 0) {
                            //  String NotNull="TO_DATE(\'" +   oneRowData[i].trim() + "', 'YYYY-MM-DD HH24:MI:SS')";
                            insertAllRows.append("" +
                                    ((oneRowData[i] == null ||
                                            oneRowData[i].length() == 0) ? "NULL" :
                                            "TO_DATE(\'" + oneRowData[i].trim() + "', 'YYYY-MM-DD HH24:MI:SS')"));
                        } else {
                            insertAllRows.append("'" +
                                    ((oneRowData[i] == null ||
                                            oneRowData[i].length() == 0) ? "" :
                                            oneRowData[i].trim()) + "'");
                        }
                    } else {
                        insertAllRows.append(((oneRowData[i] == null ||
                                oneRowData[i].length() == 0) ? "\'\'" :
                                oneRowData[i]));
                    }
                }
                insertAllRows.append(");\n");
                more = results.next();
            }
            results.close();
            if (insertAllRows.length() != 0) {
                insertOneTalbeDatas = new String(insertAllRows);
            } else {
                insertOneTalbeDatas = "/* Not found data in the table: " + tableName +
                        "! */\n";
            }
            insertAllRows.delete(0, insertAllRows.length() - 1);
        } catch (Exception e) {
            String warning = "/* Not found the table: " + tableName + "! */\n";
            System.out.println("four");
            e.printStackTrace();
            return warning;
        }
        return insertOneTalbeDatas;
    }

    /**
     * 插入sql
     */
    private static String insert = "INSERT INTO";

    /**
     * values关键字
     */
    private static String values = "VALUES";


    /**
     *
     * @param stmt
     * @param tableName
     * @param whereSql
     * @return
     * @throws SQLException
     */
    public static String getMysqlInsertSql(Statement stmt, String tableName, String whereSql)
            throws SQLException {
        ResultSet results = null;
        if (tableName.equals(null)) {
            return "/* No table! */\n";
        }
        // 查询语句内容
        String queryStr = "SELECT * FROM " + tableName;
        if (whereSql != null && whereSql.length() > 0) {
            queryStr = queryStr + " where " + whereSql;
        }
        System.out.println(queryStr);
        StringBuffer insertSQL = new StringBuffer();
        try {
            // 获取一个查询结果集为一张表的内容
            results = stmt.executeQuery(queryStr);
            ResultSetMetaData rsmd = results.getMetaData();
            int columnCount = rsmd.getColumnCount();

            while (results.next()) {
                StringBuffer columnName = new StringBuffer();
                StringBuffer columnValue = new StringBuffer();

                for (int i = 1; i <= columnCount; i++) {
                    String value = results.getString(i);
                    if (i == columnCount) {
                        columnName.append(rsmd.getColumnName(i));
                        if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i) || Types.LONGVARCHAR == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null");
                            } else {
                                columnValue.append("'").append(value).append("'");
                            }
                        } else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i) || Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i) || Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i) || Types.DECIMAL == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null");
                            } else {
                                columnValue.append(value);
                            }
                        } else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i) || Types.TIMESTAMP == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null");
                            } else {
                                //append("timestamp'")
                                columnValue.append(value).append("'");
                            }
                        } else {
                            if (value == null) {
                                columnValue.append("null");
                            } else {
                                columnValue.append(value);
                            }
                        }
                    } else {
                        columnName.append(rsmd.getColumnName(i) + ",");
                        if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i) || Types.LONGVARCHAR == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null,");
                            } else {
                                columnValue.append("'").append(value).append("',");
                            }
                        } else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i) || Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i) || Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i) || Types.DECIMAL == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null,");
                            } else {
                                columnValue.append(value).append(",");
                            }
                        } else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i) || Types.TIMESTAMP == rsmd.getColumnType(i)) {
                            if (value == null) {
                                columnValue.append("null,");
                            } else {
                                //append("timestamp'")
                                columnValue.append(value).append("',");
                            }
                        } else {
                            if (value == null) {
                                columnValue.append("null,");
                            } else {
                                columnValue.append(value).append(",");
                            }
                        }
                    }
                }
                insertSQL.append(insert).append(" ").append(tableName).append("(").append(columnName.toString()) .append(")").append(values).append("(").append(columnValue.toString()).append(");\n");
            }
        } catch (Exception e) {
            String warning = "/* Not found the table: " + tableName + "! */\n";
            System.out.println("three" + e.getMessage());
            return warning;
        }

        return insertSQL.toString();
    }

}

压缩工具类FileUtils也提供给大家

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
 * Copyright
 *
 * @author chenwenchao
 * @date 2018/11/15 0015
 * Description:
 */
public class FileUtils {

    private static final int  BUFFER_SIZE = 2 * 1024;
    /**

     * 压缩成ZIP 方法2
     * @param srcFiles 需要压缩的文件列表
     * @param out           压缩文件输出流
     * @throws RuntimeException 压缩失败会抛出运行时异常
     */
    public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
        long start = System.currentTimeMillis();
        ZipOutputStream zos = null ;
        try {
            zos = new ZipOutputStream(out);
            for (File srcFile : srcFiles) {
                byte[] buf = new byte[BUFFER_SIZE];
                zos.putNextEntry(new ZipEntry(srcFile.getName()));
                int len;
                FileInputStream in = new FileInputStream(srcFile);
                while ((len = in.read(buf)) != -1){
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
                in.close();
            }
            long end = System.currentTimeMillis();
            System.out.println("压缩完成,耗时:" + (end - start) +" ms");
        } catch (Exception e) {
            throw new RuntimeException("zip error from ZipUtils",e);
        }finally{
            if(zos != null){
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

目前oracle只是实现普通创建表脚本,其中表的字段加注释还没实现,没想到好法子,备份数据脚本,mysql实现备份数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容