java对mysql数据库进行单表筛选备份、还原操作
最近在做的一個項目需要對mysql數據庫中的單個表格進行備份
其中,一部分表格需要進行篩選備份(例如對最近插入的1000條記錄進行備份)
?
思路:java調用系統命令完成備份操作
?
假設現在有數據庫testdb
其中有數據表test_table
備份操作所做的是,把指定的數據庫表中的一部分記錄生成一個sql備份文件,以供還原操作,文件名使用日期生成。
?
備份操作
public void backUpTable(String tableName, Integer number) throws Exception {StringBuilder command = new StringBuilder();Runtime rt = Runtime.getRuntime();Process pro = null;command.append("mysqldump -u" + username + " -p" + password + " testdb ");//username為數據庫用戶名 password為密碼String time = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());String fileName ="E://" + tableName + "/" + time + ".sql";//放在E盤下
//備份表中最新number行的數據 // mysqldump -uusername -ppassword testdb test_table -w \" 1=1 ORDER BY id DESC LIMIT 0,300\" --result-file=E://test.sql command.append(tableName);command.append(" ");command.append("-w \" 1=1 ORDER BY id DESC LIMIT 0,");command.append(number);command.append("\"");command.append(" ");command.append("--result-file=" + fileName);pro = rt.exec(command.toString());//命令執行出錯則打印相關錯誤信息BufferedReader br = new BufferedReader(new InputStreamReader( pro.getErrorStream()));String errorLine = null;while ((errorLine = br.readLine()) != null) {System.out.println(errorLine);}br.close();}
其中,使用mysqldump進行備份操作
由于需要進行篩選,使用-w添加了篩選條件,--result-file= 指向生成文件的存放路徑
?
備份完成了,接下來就是還原操作
假如我們需要將E://test.sql還原到數據庫中,
需要執行的命令為mysql -uusername -ppassword testdb < E://test.sql
如果使用此命令,則涉及到了重定向符>,
而java無法識別重定向符和管道操作符,故不能向上面備份操作一樣進行還原,需要采用其他方式,如下
?
在類中定義了字符串數組String[] command = new String[3];
1、需要先判斷當前系統環境
public void initOSCommand(){String osName = System.getProperty("os.name");logger.info("系統環境為:" + osName);osName = osName.toLowerCase();if(osName.indexOf("win")>-1){command[0] = "cmd";command[1] = "/c";}else if(osName.indexOf("linux")>-1){command[0] = "/bin/bash"; // command[0] = "/bin/sh"; sh和bash的區別不大,bash是sh的增強版本command[1] = "-c";}else{logger.error("當前系統環境不支持數據庫還原操作");}}2、執行還原操作
public void restoreTable()throws Exception {//mysql -uusername -ppassword testdb < E://test.sqlStringBuilder commandStr = new StringBuilder();Runtime rt = Runtime.getRuntime();Process pro = null;String fileName = "E://test.sql";commandStr.append("mysql -u" + username + " -p" + password + " testdb < ");commandStr.append(fileName);command[2] = commandStr.toString(); // System.out.println(command[0] + command[1] + command[2]);pro = rt.exec(command);// 命令執行出錯則打印相關錯誤信息BufferedReader br = new BufferedReader(new InputStreamReader( pro.getErrorStream()));String errorLine = null;while ((errorLine = br.readLine()) != null) {System.out.println(errorLine);}br.close();}?
?
?
以上為解決方法中的一種,另一種等測試完可行之后再貼上來。
以上代碼在window10下能正常運行,尚未在linux上測試,后面測試完了再更新此隨筆。
?
需要特別注意的是,mysql5.6版本以后,執行mysqldump -uusername -ppassword ···· ? ? ? ?
會無法執行并提示安全警告
解決方法:對mysqldump命令進行配置(詳情百度2333)或降低mysql的版本到5.6以下
?
個人能力渣渣,隨筆有不對或者講述的不到位的地方,求讀者指點批判,謝謝閱讀
?
轉載于:https://www.cnblogs.com/yimqiqun/p/yimeiqun_mysqlBackupAndRestore.html
總結
以上是生活随笔為你收集整理的java对mysql数据库进行单表筛选备份、还原操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转spring boot——结合red
- 下一篇: 当一个需求到来之后