mysqldump从java运行时返回代码6,但同样的命令从命令行运行正常

时间:2013-03-17 17:42:05

标签: java mysql process mysqldump runtime.exec

当我通过Runtime.getRuntime从Java运行相同的命令时,我得到了返回代码6.同样的命令在命令行中运行正常:

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

对于这两个命令,当从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

我找到它们的返回码here

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尝试的。

2 个答案:

答案 0 :(得分:5)

Runtime.exec is not a shell,所以重定向为>和<不行。目前,该命令正在将>传递给mysqldumpcmd.exe /c "mysqldump --user=root --password= --host=localhost dbname > c:\temp\dumpfile.sql" 将其解释为要导出的表的名称。 (因此返回代码6,“非法表格”。)

有两种解决方案:

  1. 运行shell。使用此命令而不是您拥有的命令:

    Process.getInputStream()
  2. 使用{{1}}自行将命令的输出写入文件。

答案 1 :(得分:1)

mysqldump现在支持--result-file=

所以它看起来像这样。

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