• Java备份恢复MySQL数据库


    项目中需要在数据清算前对数据库进行备份,清算产生问题时对数据库进行恢复,要在程序里实现。

      一般备份MySQL用dump就可以了,如果需要在Java程序里实现,应该是调用系统命令就可以,也就是说用java里的Runtime就可以实现。

    备份

    第一版代码
    Runtime rt = Runtime.getRuntime();
    Process pro = rt.exec("mysqldump -uUSER -pPWD DATABASE> PATH/file.sql");
    

    但是结果报错了。

    其中有了两个问题:

    1. mysqldump不一定在环境变量中,即使在,有的时候这样执行也是执行不了的。
    2. 这种命令执行方式java不能识别重定向符 >。

    修改如下:

        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString();
        Process pro = rt.exec("mysqldump -uUSER -pPWD --default-character=gbk -rPATH" + time + ".sql DATABASE");
        BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
        String errorLine = null;
        while ((errorLine = br.readLine()) != null) {
            System.out.println(errorLine);
        }
        br.close();  
    

    其中exec的参数还可以写成字符串数组,能够解决不识别mysqldump的问题。另外,Process的waitFor方法会在执行后返回int值,如果为0则执行正常。

    @Test
    public void backupDB() throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process pro = rt.exec(getCommand());
        BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
        String errorLine = null;
        while ((errorLine = br.readLine()) != null) {
            System.out.println(errorLine);
        }
        br.close();
        int result = pro.waitFor();
        if (result != 0) {
            throw new Exception("数据库备份失败! ");
        }
    }  
    
    
    private String[] getCommand() {
        String[] cmd = new String[3];
        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString();
        String os = System.getProperties().getProperty("os.name");
        if (os.startsWith("Win")) {
            cmd[0] = "cmd.exe";
            cmd[1] = "/c";
        } else {
            cmd[0] = "/bin/sh";
            cmd[1] = "-c";
        }
        StringBuilder arg = new StringBuilder();
        arg.append("mysqldump ");
        arg.append("-uUSR ");
        arg.append("-pPWD ");
        arg.append("--default-character=gbk ");
        arg.append("--skip-opt ");
        arg.append("--add-drop-database ");
        arg.append("--routines ");
        arg.append("--triggers ");
        arg.append("--compress ");
        arg.append("-r");
        arg.append("PATH");
        arg.append(time);
        arg.append(".sql ");
        arg.append("--databases DATABASE");
        cmd[2] = arg.toString();
        return cmd;
    }  
    

    说明

    --default-character=gbk 指定字符集

    --skip-opt 禁用将结果存入内存,否则大表会出现问题

    --add-drop-database 在CREATE DATABASE之前加 drop语句

    --routines 转储数据库中的函数和程序

    --compress 压缩传输的信息

    恢复

    恢复是用mysql命令,方式和备份很像

    @Test
    public void restoreDB() throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process pro = rt.exec(getCommand());
        BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
        String errorLine = null;
        while ((errorLine = br.readLine()) != null) {
            System.out.println(errorLine);
        }
        br.close();
        int result = pro.waitFor();
        if (result != 0) {
            throw new Exception("数据库恢复失败! ");
        }
    }
    private String[] getCommand() {
        String[] cmd = new String[3];
        String os = System.getProperties().getProperty("os.name");
        if (os.startsWith("Win")) {
            cmd[0] = "cmd.exe";
            cmd[1] = "/c";
        } else {
            cmd[0] = "/bin/sh";
            cmd[1] = "-c";
        }
        StringBuilder arg = new StringBuilder();
        arg.append("mysql ");
        arg.append("-uUSR ");
        arg.append("-pPWD ");
        arg.append("< ");
        arg.append(getFile());
        cmd[2] = arg.toString();
        return cmd;
    }
    private String getFile() {
        File dir = new File("PATH");
        String[] files = dir.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".sql");
            }
        });
        return Collections.max(Arrays.asList(files));
    }
  • 相关阅读:
    ASP实现禁止从外部提交数据
    随机提取N条记录[多种数据库方法]
    创建一个带滚动条的div
    将IP最后一位替换为星号
    用PHP5写的smtp类,支持身份验证、附件、抄送、暗送
    1004
    1021
    ProcessMonitor
    悲观锁和事务处理并发冲突
    spring.net入门
  • 原文地址:https://www.cnblogs.com/hyace/p/4439618.html
Copyright © 2020-2023  润新知