3

当我通过 Runtime.getRuntime 从 Java 运行相同的命令时,我得到返回码 6。相同的命令在命令行中运行良好:

process = Runtime.getRuntime().exec(mysqldumpCommand);
int processComplete = process.waitFor();

对于这 2 个命令,当从 java 运行并且没有转储时,我得到返回码 6。从命令行工作正常(我在本地环境中没有密码。)

mysqldump --user=root --password= --host=localhost dbname > c:\temp\dumpfile.sql
mysqldump --user=root --password="" --host=localhost dbname > c:\temp\dumpfile.sql

当故意输入错误密码时,我在 java 中得到返回码 2,并且在命令行中出现连接错误:

mysqldump --user=root --password= --host=localhost dbname > c:\temp\dumpfile.sql

我在这里找到的返回码:

Taken from client/mysqldump.c in MySQL 5.1.59:

#define EX_USAGE 1
#define EX_MYSQLERR 2
#define EX_CONSCHECK 3
#define EX_EOM 4
#define EX_EOF 5 /* ferror for output file was got */
#define EX_ILLEGAL_TABLE 6

在 java 中运行相同的命令并且从命令行正常工作时,我为什么会得到(错误)返回码 6?

稍后编辑:我从 Windows 尝试。

4

2 回答 2

5

Runtime.exec不是 shell,因此使用 > 和 < 的重定向将不起作用。当前,该命令正在传递>mysqldump,它将其解释为您要导出的表的名称。(因此返回代码 6,“非法表”。)

有两种解决方案:

  1. 运行一个外壳。使用此命令而不是您拥有的命令:

    cmd.exe /c "mysqldump --user=root --password= --host=localhost dbname > c:\temp\dumpfile.sql"
    
  2. 自己将命令的输出写入文件,使用Process.getInputStream().

于 2013-03-17T17:49:30.363 回答
1

mysqldump 现在支持--result-file=

所以它看起来像这样。

mysqldump --user=root --password= --host=localhost dbname --result-file=c:\temp\dumpfile.sql
于 2017-08-10T15:47:36.673 回答