Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java进程挂起执行mysqldump?_Java_Mysql_Backup - Fatal编程技术网

为什么java进程挂起执行mysqldump?

为什么java进程挂起执行mysqldump?,java,mysql,backup,Java,Mysql,Backup,我想备份mysql 5.6中的数据库。 为此,我使用以下方法: 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 + "

我想备份mysql 5.6中的数据库。
为此,我使用以下方法:

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;
    }
StreamGoBler是将
runtimeProcess.getErrorStream()
runtimeProcess.getInputStream()
打包到BufferedReader中的线程。BufferedReader仅使用
readLine()
方法逐行读取。这是我得到的一个暗示

我的问题是backupDB方法挂起在这行上:

int processComplete = runtimeProcess.waitFor();
如果我用exitValue替换waitFor方法,我将收到错误

java.lang.IllegalThreadStateException: process has not exited
所以我必须使用waitFor方法。不幸的是,它永远在运行。我必须按下eclipse控制台上的红色图标来停止JVM

如何使流程完整并备份mysql数据库? 这已经解决了,谢谢

编辑要启动mysqldump.exe,我需要向其写入完整路径:

String executeCmd = "D://mysql-5.6.11-win32/bin/mysqldump -u "
难道你不知道如何摆脱完整的路径。我想在计算机上的mysqldump.exe位置独立启动mysqldump

也许有一种方法可以获取包含所有连接详细信息的mysqldump.exe路径

编辑如果我尝试在没有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
java.io.IOException:无法运行程序“mysqldump”:CreateProcess错误=2
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
位于java.lang.Runtime.exec(Runtime.java:615)
位于java.lang.Runtime.exec(Runtime.java:448)
位于java.lang.Runtime.exec(Runtime.java:345)
位于dbViewer.model.ConnectionManager.backupDB(ConnectionManager.java:273)
位于dbViewer.model.ConnectionManager.main(ConnectionManager.java:337)
由以下原因引起:java.io.IOException:CreateProcess error=2
在java.lang.ProcessImpl.create(本机方法)
位于java.lang.ProcessImpl。(ProcessImpl.java:189)
在java.lang.ProcessImpl.start(ProcessImpl.java:133)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
... 还有5个

谢谢

您只需使用mysqldump-p选项:


如果从命令行手动运行命令,会发生什么情况?它需要用户输入吗?啊。您是对的,它要求我输入密码,在我按enter键表示没有密码后,它成功地创建了备份。但我使用空密码。如何使用空密码备份数据库?您可以通过将回车写入进程的OutputStream@dkatzel请告诉我如何将回车(\n)写入OutputStream。我使用了write('\n'),但它没有帮助。无论如何,现在我可以检查密码是否为空,如果是,则执行mysqldump而不使用-p选项。谢谢,帮了大忙!请看我的第一个和第二个EDIT@VolodymyrLevytskyi提出一个新问题,你不应该在一个问题中问太多问题,或者在一个问题解决后编辑你的问题。@VolodymyrLevytskyi用户“no”是正确的。如果我的回答是正确的并且解决了你的问题,你应该接受/投赞成票;然后问第二个问题。在您提到的特定情况下,如果没有完整位置,您就不能键入mysqldump,因为命令
mysqldump
不在您的
路径中。谷歌搜索“设置windows路径”。
mysqldump –u[user name] –p[password] [database name] > [dump file]