在Linux中进行Mysql数据库备份,显示java.io.IOException:

时间:2015-02-15 08:40:22

标签: java mysql linux

使用以下代码进行Mysql数据库备份

String shellCommand = "mysqldump --user" + dbUser + " --password="
                       + dbPass + " --databases" + dbName
                       +" |gzip - 9 > backup.sql.gz";
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(new String[]{"/bin/bash", "-c",shellCommand});
        int exitValue = process.waitFor();

我收到以下异常

java.io.IOException: Cannot run program 
"/bin/bash": CreateProcess error=2, The system cannot find the file specified

1 个答案:

答案 0 :(得分:0)

在OS X上,你的代码没有抛出异常,也没有做任何事情。检查Process.getErrorStream()的内容后,似乎命令找不到mysqldump。传递到mysqldump的完整路径(例如locate mysqldump的输出)有效(在代码中mysqldump语法中也存在一些错误)。这是有效的代码(至少在OS X上):

String shellCommand = "/usr/local/bin/mysqldump --user=" + dbUser + " --password="
        + dbPass + " --databases " + dbName
        +" |gzip -9 > backup.sql.gz";
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(new String[] {"/bin/bash", "-c",shellCommand});
int exitValue = process.waitFor();

请注意,此代码可能容易受到危险的命令注入安全漏洞的攻击。如果参数(用户名,密码和数据库名称)受应用程序用户控制,恶意用户可能会操纵参数以在操作系统上执行命令(例如,通过传递dbname | rm -rf / |作为数据库名称)。您必须确保这些参数不受应用程序用户控制或采取其他措施来防止漏洞(OS命令转义或执行mysqldump然后直接将gzip作为单独的进程直接运行到Runtime.exec并将第一个输入流连接到输出应用程序中第二个的流。)