1

When I try to run mysqldump ... (all the missing parameters are correct for me) in a Heroku worker dyno with ClearDB support, I get this error message

SEVERE: null
9-09-01T13:16:14.618354+00:00 app[worker.1]: java.io.IOException: Cannot run program "mysqldump": error=2, No such file or directory
2019-09-01T13:16:14.618356+00:00 app[worker.1]: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
2019-09-01T13:16:14.618358+00:00 app[worker.1]: at fi.vakuutustiedot.workers.threads.MySQLDatabaseDumpThread.yeah(MySQLDatabaseDumpThread.java:192)
2019-09-01T13:16:14.618360+00:00 app[worker.1]: at fi.vakuutustiedot.workers.threads.MySQLDatabaseDumpThread.run(MySQLDatabaseDumpThread.java:44)
2019-09-01T13:16:14.618362+00:00 app[worker.1]: Caused by: java.io.IOException: error=2, No such file or directory
2019-09-01T13:16:14.618363+00:00 app[worker.1]: at java.lang.UNIXProcess.forkAndExec(Native Method)
2019-09-01T13:16:14.618365+00:00 app[worker.1]: at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
2019-09-01T13:16:14.618366+00:00 app[worker.1]: at java.lang.ProcessImpl.start(ProcessImpl.java:134)
2019-09-01T13:16:14.618367+00:00 app[worker.1]: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
2019-09-01T13:16:14.618368+00:00 app[worker.1]: ... 2 more
2019-09-01T13:16:14.618370+00:00 app[worker.1]:

My question is: is there a workaround for the missing mysqldump?

PS: my Java code calling mysqldump is as follows:

private static void dumpDatabase() throws InterruptedException, IOException {
    String envvar = System.getenv("CLEARDB_DATABASE_URL");
    String[] vars = envvar.split(":");
    String userName = vars[1].substring(2);
    String password = vars[2].substring(0, vars[2].lastIndexOf('@'));
    String hostName = vars[2].substring(vars[2].lastIndexOf('@') + 1,
                                        vars[2].lastIndexOf('/'));
    String database = vars[2].substring(vars[2].lastIndexOf('/') + 1,
                                        vars[2].lastIndexOf('?'));

    String cmd = String.format(COMMAND_FORMAT,
                               hostName, 
                               userName, 
                               password,
                               database);
    System.out.println(">>> Dump command: " + cmd + " <<<");
    String[] cmds = cmd.split("\\s+");
    String databaseDumpFileName = DATE_FORMAT.format(new Date()) + 
                                  "_" + 
                                  UUID.randomUUID();

    File databaseDumpFile = 
            new File(
                    System.getProperty("user.home") + "/db.dump.sql");

    ProcessBuilder processBuilder = 
            new ProcessBuilder(cmds[0],
                               cmds[1],
                               cmds[2],
                               cmds[3],
                               cmds[4],
                               cmds[5],
                               cmds[6]);

    processBuilder.redirectOutput(databaseDumpFile);
    Process process = processBuilder.start();
    process.waitFor();

    // Unrelevant!
    AmazonS3Utilities.AMAZON_S3_UTILITIES
                     .putDatabaseDumpFile(databaseDumpFileName, 
                                          databaseDumpFile);
}
coderodde
  • 1,269
  • 4
  • 17
  • 34

0 Answers0