java 備份oracle,mysql數(shù)據(jù)庫生成sql

1.最近開發(fā)java 備份數(shù)據(jù)庫功能發(fā)現(xiàn)網(wǎng)上都是通過oracle客戶端進行備份证九,部署項目的服務器還裝oracle服務端那不是太麻煩了,mysql 也是通過客戶端實現(xiàn),
我折騰了好久終于不用客戶端實現(xiàn)
實現(xiàn)環(huán)境為spring boot,實現(xiàn)方法如下:

@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創(chuàng)表.sql";
            String dataStr=f.format(date) + "oracle數(shù)據(jù)" + ".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()) {
                /* 創(chuàng)建文件夾*/
                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("---創(chuàng)表腳本---\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()) {
                    /* 創(chuàng)建文件*/
                    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數(shù)據(jù)"+".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數(shù)據(jù)"+".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數(shù)據(jù)" + ".sql");
                if (!dataFile.exists()) {
                    /* 創(chuàng)建文件*/
                    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數(shù)據(jù)"+".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數(shù)據(jù)"+".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;
        // 查詢結(jié)果屬性
        ResultSetMetaData rsma = null;
        // 列數(shù)
        int numCols = 0;
        // 行數(shù)
        int numRows = 0;
        // 查詢語句內(nèi)容
        String queryStr = "SELECT * FROM " + tableName;
        if (whereSql != null && whereSql.length() > 0) {
            queryStr = queryStr + " where " + whereSql;
        }

        try {
            // 獲取一個查詢結(jié)果集為一張表的內(nèi)容
            results = stmt.executeQuery(queryStr);
            // 表的記錄數(shù)
            numRows = 0;
            boolean more = results.next();
            while (more) {
                numRows++;
                more = results.next();
            }
            // 初始化獲取查詢記錄集屬性
            rsma = results.getMetaData();
            // 初始化表的列數(shù)
            numCols = rsma.getColumnCount();
            columnNames = new String[numCols];
            // 初始化獲取列名
            for (int i = 0; i < numCols; i++) {
                columnNames[i] = new String(rsma.getColumnName(i + 1));
            }
            // 初始化存放一條記錄的數(shù)據(jù)
            oneRowData = new String[numCols];
        } catch (Exception e) {
            String warning = "/* Not found the table: " + tableName + "! */\n";
            System.out.println("three" + e.getMessage());
            return warning;
        }
        try {
            // 獲取一個查詢結(jié)果集為一張表的內(nèi)容
            results = stmt.executeQuery(queryStr);
            // 初始化獲取查詢記錄集屬性
            rsma = results.getMetaData();
            //獲取記錄的內(nèi)容
            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關(guān)鍵字
     */
    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";
        }
        // 查詢語句內(nèi)容
        String queryStr = "SELECT * FROM " + tableName;
        if (whereSql != null && whereSql.length() > 0) {
            queryStr = queryStr + " where " + whereSql;
        }
        System.out.println(queryStr);
        StringBuffer insertSQL = new StringBuffer();
        try {
            // 獲取一個查詢結(jié)果集為一張表的內(nèi)容
            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只是實現(xiàn)普通創(chuàng)建表腳本绍撞,其中表的字段加注釋還沒實現(xiàn)宋梧,沒想到好法子,備份數(shù)據(jù)腳本硫狞,mysql實現(xiàn)備份數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佩微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌焰,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扒俯,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門陵珍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝杖,“玉大人,你說我怎么就攤上這事互纯∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵留潦,是天一觀的道長只盹。 經(jīng)常有香客問我,道長兔院,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮坊萝,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘。我一直安慰自己十偶,他們只是感情好菩鲜,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惦积,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮崩,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天蛛勉,我揣著相機與錄音,去河邊找鬼睦柴。 笑死诽凌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的坦敌。 我是一名探鬼主播皿淋,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼招刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窝趣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤训柴,失蹤者是張志新(化名)和其女友劉穎哑舒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻馁,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡洗鸵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仗嗦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘滨。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稀拐,靈堂內(nèi)的尸體忽然破棺而出火邓,到底是詐尸還是另有隱情,我是刑警寧澤德撬,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布铲咨,位于F島的核電站,受9級特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏纤勒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望摇天。 院中可真熱鬧,春花似錦恐仑、人聲如沸泉坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坚冀。三九已至,卻和暖如春鉴逞,著一層夾襖步出監(jiān)牢的瞬間记某,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工构捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留液南,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓勾徽,卻偏偏與公主長得像滑凉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容