CreateProcess error=5,在java中使用processbuilder备份mysql数据库时拒绝访问

CreateProcess error=5,在java中使用processbuilder备份mysql数据库时拒绝访问,java,mysql,access-denied,Java,Mysql,Access Denied,我试图用Java中的ProcessBuilder备份MySQLDB,但是,我得到了这个错误 "!Cannot run program "C:\Program Files\MySQL\MySQL Server 5.5\bin": CreateProcess error=5, Access is denied". 这是我的密码 public static String backupDb() { String resp=null; try { System.out.p

我试图用Java中的
ProcessBuilder
备份MySQLDB,但是,我得到了这个错误

"!Cannot run program "C:\Program Files\MySQL\MySQL Server 5.5\bin": CreateProcess error=5, Access is denied".
这是我的密码

public static String backupDb() {
    String resp=null;
    try {
        System.out.println("Started........");
        ProcessBuilder builder = new ProcessBuilder("C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin", "mysqldump -u root -pmypass mydb> c:\\backup\\mybackup.sql");
        builder.redirectErrorStream(true);
        Process p = builder.start();
    } catch(Exception e) {
        resp="!"+e.getMessage();
    }
    return resp;
}

我哪里会出错?

要想让它正常工作,您必须做几件事:

  • 打开终端/控制台以在中运行mysql转储命令,否则重定向操作符(
    )将无法工作
  • 检查文件路径中所需的文件夹是否存在。例如,如果要在
    C:\\foo\bar\foobar\backup.sql
    中备份数据库,但
    C:\\foo
    C:\\foo\\bar
    C:\\foo\\bar\\foobar
    文件夹中的一个不存在,则会出现错误
  • 调整mysqldump的路径,以便包含空格的文件夹名称被包装在
    ”中,否则您将遇到棘手的错误,例如:
    “C:\Program”未被识别为内部或外部命令
  • 如果出现错误,请读取错误流,否则进程将挂起。返回值为0表示成功
  • 这是一个经过测试的版本,包括上述所有内容。我将文件路径作为参数传递,因为这样更灵活

    public static void backupDb(final String mysqlDumpFilePath)
        throws IOException, InterruptedException {
    
        String folderPath = mysqlDumpFilePath.substring(0, mysqlDumpFilePath.lastIndexOf("\\"));
        File folder = new File(folderPath);
        if (!folder.exists()) {
            folder.mkdirs(); // 2
        }
        File f = new File(mysqlDumpFilePath);
        ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "C:\\\"Program Files\"\\MySQL\\\"MySQL Server 5.5\"\\bin\\mysqldump -u root -pmypass mydb > "
            + f.getAbsolutePath()); //1 & 3
    
        Process exec = builder.start();
        int retCode = exec.waitFor();
        if (retCode != 0) { //4
            // something went wrong
            InputStream errorStream = exec.getErrorStream();
            byte[] buffer = new byte[errorStream.available()];
            errorStream.read(buffer);
    
            System.out.println(new String(buffer));
        }
    
    }
    

    C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin
    更改为
    C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\MySQL.exe
    。错误本身表明该文件不可执行。谢谢。恢复呢?