有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java命令在mysql中恢复数据库

这是我使用java命令恢复mysql数据库的代码

当我调试代码时,它会卡在运行时进程中。waitFor()

有谁能为这个问题提供解决方案吗

public static boolean restoreDB(String dbUserName, String dbPassword,String dbName, String path) {

    String command ="mysql -u"+dbUserName+" -p"+dbPassword+" "+dbName+" < \""+path+"\"";

    Process runtimeProcess;
    try {

        runtimeProcess = Runtime.getRuntime().exec(command);
        int processComplete = runtimeProcess.waitFor();

        if (processComplete == 0) {
            System.out.println("Backup restored successfully");
            return true;
        } else {
            System.out.println("Could not restore the backup");
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return false;
}

共 (2) 个答案

  1. # 1 楼答案

    我终于找到了答案。。 谢谢大家的支持, 我看到他们中的很多人都有同样的问题,所以这是我给你们的解决方案

    我们无法使用运行时执行mysql恢复命令。getRuntime()。exec()函数

    所以我创建了一个批处理文件,在其中添加了这个mysql恢复命令,并执行了它。工作很好。:)

    public static void restoreDB(String dbUserName, String dbPassword,String dbName, String path) {
        try{
            //for linux .bat must replaced with .sh
            String destpath = "D:\\backup\\db.bat";
    
        //creating batch file 
        PrintWriter writer = new PrintWriter(destpath);
        String command = "mysql -u"+dbUserName+" -p"+dbPassword+" "+dbName+" < \""+path+"\"";
        writer.println(command);
        writer.close();
    
        //executing batch file
        Process run = Runtime.getRuntime().exec(destpath);
        System.out.println("file created");
        int processComplete = run.waitFor();
    
            if (processComplete == 0) {
                System.out.println("Backup created successfully");
                //return true;
            } else {
                System.out.println("Could not create the backup");
            }
        }catch(Exception ex)
        {
            ex.printStackTrace();
        }
    
    }
    
  2. # 2 楼答案

    进程可能会阻塞等待输入,或者写入了太多输出,以至于填满了进程输出缓冲区,等待您读取输出。无论哪种方式,只要确保打印出流程的stdout和stderr,就可以获得更多信息:

    private static class StreamReader implements Runnable {
    
        private InputStream stream;
        private volatile boolean finished = false;
    
        public StreamReader(InputStream stream) {
            this.stream = stream;
        }
    
        public void run() {
            Scanner scanner = new Scanner(stream);
    
            while(!finished) {
                System.out.println(scanner.nextLine());          
            }
    
        }
    
    }
    
    //...
    runtimeProcess = Runtime.getRuntime().exec(command);
    StreamReader stdoutReader = new StreamReader(runtimeProcess.getInputStream());
    StreamReader stderrReader = new StreamReader(runtimeProcess.getErrorStream());
    new Thread(stdoutReader).start();
    new Thread(stderrReader).start();
    int processComplete = -1;
    try {
        processComplete = runtimeProcess.waitFor();
    } finally {
        stdoutReader.finished = true;
        stderrReader.finished = true;
    }