【问题标题】:java mysqldump with where option带有 where 选项的 java mysqldump
【发布时间】:2018-08-16 10:29:30
【问题描述】:

我尝试使用这个代码,它适用于 linux 命令行,在 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

为了使其在 java 中工作,我使用以下代码:

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;
}

如果调用在 java 代码中,则相同的命令行指令不起作用。我哪里错了?是否可以将错误日志重定向到文件?

如果我使用 where 子句--where=date='20180206' 它也适用于 java。

【问题讨论】:

  • 根据您的最后一个问题,您可以使用2> output.log 作为mysqldump 参数将日志重定向到文件。
  • @IldarAkhmetov 它适用于命令行,但不适用于我的 java 代码
  • 我假设System.out.println 打印完全相同的命令,对吧?
  • @IldarAkhmetov 是的
  • + dbName +" "+tableName+" -r "tableName 参数是否在表名table1 之前包含--table 参数?或者必须是+ dbName +" --tables " +tableName+" -r "

标签: java mysql linux


【解决方案1】:

命令中的参数太多。我认为您应该使用ProcessBuilder 而不是Runtime.exec。它将命令和参数作为一个数组,这种方式更安全恕我直言。所以试试这个代码:

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;

还可以尝试编写带有完整路径的mysqldump 命令,如/usr/bin/mysqldump,如果适用于此,则mysqldump 命令不在路径中。

【讨论】:

  • 我已经尝试过你的代码,但它并没有解决问题!
  • @famedoro 你有没有重定向命令的输出看看?
  • @No,我试过 2> error.log,但它不起作用(在 java 代码中),如果我使用 --where=date='20180206' 而不是 - -where="date>='20180201' AND date
  • @famedoro 我编辑了答案以打印输出。请重试
  • 谁是进程对象?运行时进程!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
相关资源
最近更新 更多