简体   繁体   English

为什么Java进程在执行mysqldump时挂起?

[英]Why does java process hang executing mysqldump?

I want to backup database in mysql 5.6. 我想在mysql 5.6中备份数据库。
For this I use this method: 为此,我使用以下方法:

public boolean backupDB(String dbName, String dbUserName, String dbPassword, String path) {

        String executeCmd = "D://mysql-5.6.11-win32/bin/mysqldump -u " + dbUserName + " -p" + dbPassword
                + " --add-drop-database -B " + dbName + " -r " + path;
        Process runtimeProcess;
        try {

            runtimeProcess = Runtime.getRuntime().exec(executeCmd);
            // any error message?
            StreamGobbler errorGobbler = new StreamGobbler(runtimeProcess.getErrorStream(), "ERR");
            // any output?
            StreamGobbler outputGobbler = new StreamGobbler(runtimeProcess.getInputStream(), "OUT");
            // kick them off
            errorGobbler.start();
            outputGobbler.start();

            int processComplete = runtimeProcess.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();
        }

        return false;
    }

StreamGobbler is Thread that wraps runtimeProcess.getErrorStream() and runtimeProcess.getInputStream() into BufferedReader. StreamGobbler是一个将runtimeProcess.getErrorStream()runtimeProcess.getInputStream()包装到BufferedReader中的线程。 BufferedReader merely reads line by line using readLine() method. BufferedReader仅使用readLine()方法逐行读取。 This is a hint I got on this article . 这是我对这篇文章的暗示。

My problem is that method backupDB hangs on this line : 我的问题是方法backupDB挂在此行上:

int processComplete = runtimeProcess.waitFor();

If I substitute waitFor method with exitValue I receive error 如果我用exitValue替代waitFor方法,则会收到错误

java.lang.IllegalThreadStateException: process has not exited

Therefore I must use waitFor method. 因此,我必须使用waitFor方法。 And unfortunately it runs forever. 不幸的是,它永远存在。 I must press red icon on eclipse console to stop the JVM. 我必须在Eclipse控制台上按红色图标才能停止JVM。

How to make process complete and backup mysql database? 如何使过程完成并备份mysql数据库? This is solved thanks! 解决了,谢谢!

EDIT To launch mysqldump.exe I need to write full path to it : 编辑要启动mysqldump.exe,我需要写完整路径:

String executeCmd = "D://mysql-5.6.11-win32/bin/mysqldump -u "

Don't you know how to get rid of full path. 您不知道如何摆脱完整的道路。 I want to launch mysqldump independently on mysqldump.exe location on computer. 我想在计算机上的mysqldump.exe位置上独立启动mysqldump。

Maybe there is a way to get the path to mysqldump.exe having all connection details. 也许有一种方法可以获取具有所有连接详细信息的mysqldump.exe的路径。

EDIT If I try to use mysqldump without full path to mysqldump.exe I receive this exception : 编辑如果我尝试使用没有mysqldump.exe完整路径的mysqldump,则会收到此异常:

java.io.IOException: Cannot run program "mysqldump": CreateProcess error=2, Íå óäàåòñÿ íàéòè óêàçàííûé ôàéë
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    at java.lang.Runtime.exec(Runtime.java:615)
    at java.lang.Runtime.exec(Runtime.java:448)
    at java.lang.Runtime.exec(Runtime.java:345)
    at dbViewer.model.ConnectionManager.backupDB(ConnectionManager.java:273)
    at dbViewer.model.ConnectionManager.main(ConnectionManager.java:337)
Caused by: java.io.IOException: CreateProcess error=2, Íå óäàåòñÿ íàéòè óêàçàííûé ôàéë
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:189)
    at java.lang.ProcessImpl.start(ProcessImpl.java:133)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
    ... 5 more

Thanks! 谢谢!

您可以简单地使用mysqldump -p选项:

mysqldump –u[user name] –p[password] [database name] > [dump file]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM