0

Java を使用して自動 MYSQL バックアップを実行しようとしているときに、次のエラーが発生し続け、午前中ずっと回避策を試みていました。システムは WindowsXP SP3 で、Apache Tomcat 6 と Java 1.6.25 を実行しています。

このエラーが発生し続けます:

ERROR com.busytech.barba.exception.BarbaException – java.io.IOException: Cannot run program “C:\Program”: CreateProcess error=2, The system cannot find the file specified
com.busytech.barba.exception.BarbaException: Cannot run program “C:\Program”: CreateProcess error=2, The system cannot find the file specified
at com.busytech.barba.persistence.BackUpAndRestoreDatabaseManager.getTableBackup(BackUpAndRestoreDatabaseManager.java:52)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.processRequest(CashSummaryServlet.java:95)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.doPost(CashSummaryServlet.java:495)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
at java.lang.Thread.run(Unknown Source)
java.io.IOException: Cannot run program “C:\Program”: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at com.busytech.barba.persistence.BackUpAndRestoreDatabaseManager.getTableBackup(BackUpAndRestoreDatabaseManager.java:30)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.processRequest(CashSummaryServlet.java:95)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.doPost(CashSummaryServlet.java:495)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
… 21 more
347156 [http-8080-4] ERROR com.busytech.barba.exception.BarbaException – java.io.IOException: Cannot run program “C:\Program”: CreateProcess error=2, The system cannot find the file specified
com.busytech.barba.exception.BarbaException: Cannot run program “C:\Program”: CreateProcess error=2, The system cannot find the file specified
at com.busytech.barba.persistence.BackUpAndRestoreDatabaseManager.getTableBackup(BackUpAndRestoreDatabaseManager.java:52)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.processRequest(CashSummaryServlet.java:95)
at com.busytech.barba.servlet.checkcash.CashSummaryServlet.doPost(CashSummaryServlet.java:495)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
at java.lang.Thread.run(Unknown Source)

これは追加です: これは私が試したことです {

Process run = null;
        if (System.getProperty("os.name").toLowerCase().contains("window")) {
            run = Runtime.getRuntime().exec(SystemInformation.getWindowsMySQLDump() + " --host=" + host + " --port=" + port
                    + " --user=" + user + " --password=" + password
                    + " --compact --complete-insert --extended-insert "
                    + "--skip-comments --skip-triggers --skip-lock-tables --single-transaction " + database + " " + table);

        } else {
            run = Runtime.getRuntime().exec("mysqldump --host=" + host + " --port=" + port
                    + " --user=" + user + " --password=" + password
                    + " --compact --complete-insert --extended-insert "
                    + "--skip-comments --skip-triggers --skip-lock-tables --single-transaction " + database + " " + table);
        }
        InputStream in = run.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        int count;
        char[] cbuf = new char[BUFFER];

        while ((count = br.read(cbuf, 0, BUFFER)) != -1) {
            temp.append(cbuf, 0, count);
        }
        br.close();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
4

3 に答える 3

0

問題は、アプリケーション (この場合はおそらく MySQL) がインストールされているパスです。

C:\Program Files\MySQL\bin\mysql.exe

「Program Files」の空白が問題の原因であり、引用符を付けません。

"C:\Program Files\MySQL\bin\mysql.exe"

Apache Execを使用して、Java からプロセスを開始できます。これにより、Java アプリケーションからプロセスを開始する際に問題が発生する可能性のある一般的な問題がすべて処理されます。

プロセスを開始する方法についてさらに情報を提供できる場合。

これが私が推奨するものです (Apache Commons Exec を使用した実装)。

CommandLine cmdLine = CommandLine.parse("C:\\Program Files\\MySQL\\bin\\mysqldump");
cmdLine.addArgument("--user=");
// add further args here
Executor executor = new DefaultExecutor();
OutputStream stdOut = new ByteArrayOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(stdOut);
    executor.setStreamHandler(psh);

    try {
        int exitCode = executor.execute(cmdLine);
        String output = stdOut.toString();

        BufferedReader lineReader = new BufferedReader(new StringReader(output));

        String line;
        while ((line = lineReader.readLine()) != null) {
            log.debug("Reading line #{} - '{}'", lineCount, line);
        }

    } catch (IOException e) {
        // handle the exception
    }
于 2012-04-05T09:34:41.960 に答える
0

これがMySQLまたはバックアップの質問であるかどうかはわかりませんが、エラーから:

プログラム「C:\Program」を実行できません</p>

どこかで文字列を引用符で囲むのを忘れているようです。

走ろうとすると

c:\program files\myapp\something.exe

次に、おそらく最初のスペースで分割されるため、実行しようとしていますc:\program-これは実際の実行可能ファイルではないと思います。試す

"c:\program files\myapp\something.exe"
于 2012-04-05T09:30:52.453 に答える
0

これは私が使用したソリューションです。Windows と Linux で上記の apache commons exec を使用する提案のように機能します。

        String cmdline = "mysqldump";
        DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
        CommandLine commandLine = CommandLine.parse(cmdline);
        commandLine.addArgument("--host=" + dbhost);
        commandLine.addArgument("--port=" + dbport);
        commandLine.addArgument("--user=" + dbuser);
        commandLine.addArgument("--password=" + dbpass);
        commandLine.addArgument(database);

        Set keys = table.keySet();
        for (Iterator i = keys.iterator(); i.hasNext();) {
            String key = (String) i.next();
            String value = (String) table.get(key);
            commandLine.addArgument(value);
        }
        commandLine.addArgument("-r");
        //outputFile might be a file on the server that can be downloaded
        //used apache file upload to download the files from the server
        commandLine.addArgument(outputFile);
        Executor executor = new DefaultExecutor();
        executor.execute(commandLine, resultHandler);
        resultHandler.waitFor();

ファイルをサーバーに復元するには、ファイルをアップロードします。ここに mysqldumpfile から復元するコードがあります。これは、Windows の環境変数に mysql パスのみが設定されている場合に機能しますが、Linux ではそのまま機能します。

        String cmdline = "mysql";
        DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
        CommandLine commandLine = CommandLine.parse(cmdline);
        commandLine.addArgument("--user=" + dbuser);
        commandLine.addArgument("--password=" + dbpass);
        commandLine.addArgument("--force");
        commandLine.addArgument("-v");
        commandLine.addArgument("-e");
        commandLine.addArgument("source");
        commandLine.addArgument(backUpFile);
        commandLine.addArgument(database);
        Executor executor = new DefaultExecutor();
        executor.execute(commandLine, resultHandler);
        resultHandler.waitFor();
于 2012-08-15T13:32:50.257 に答える