Q:

java mysqldump with where option

I try to use this code, which works on linux command line, under java 
mysqldump --where="date>='20180201' AND date<='20180228'" -uuser -ppassword --skip-add-drop-table --no-create-info --no-create-db  -B mydb  --tables table1 -r /root/Documents/DbBackup/table1.sql
To make it work in java, I use the following code:
public static boolean backupDB(String dbName, String where_filter, String path, String tableName) {
    String executeCmd = "mysqldump --where="+where_filter+" -u" + userName + " -p" + password + " --skip-add-drop-table --no-create-info --no-create-db "+" -B " + dbName +" "+tableName+" -r " + path;

    System.out.println("backupDB "+executeCmd);
    Process runtimeProcess;
    try {

        runtimeProcess = Runtime.getRuntime().exec(executeCmd);
        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) {            

    }

    return false;
}

The same command line instruction does not work if the invocation is inside the java code. Where am I wrong? is it possible to redirect an error log to a file?
If I use as where clause--where=date='20180206' it works also under java.

A:

You have too many arguments in the command. I think you should use ProcessBuilder instead of Runtime.exec. It takes the command and arguments as an array and this way is safer IMHO. So try this code:
String[] executeCmd = new String[]{
    "mysqldump", "--where=" + where_filter, "-u" + userName, "-p" + password, 
    "--skip-add-drop-table", "--no-create-info", "--no-create-db", "-B", dbName, 
    "--tables", tableName, "--result-file=" + path
};
ProcessBuilder builder = new ProcessBuilder(executeCmd);
builder.redirectErrorStream(true);
Process runtimeProcess;
try {

    runtimeProcess = builder.start();
    InputStream processInputStream = process.getInputStream();
    int processComplete = runtimeProcess.waitFor();
    if (processComplete == 0) {
        System.out.println("Backup created successfully");
        return true;
    } else {
        System.out.println("Could not create the backup");                
    }
    BufferedReader reader = new BufferedReader(new InputStreamReader(processInputStream));
    System.out.println("output: ");
        while (reader.ready()) {
            System.out.println(reader.readLine());
        }
} catch (Exception ex) {

}
return false;

Also try to write the mysqldump command with full path like /usr/bin/mysqldump if works with this, then the mysqldump command is not in the path.

