0

我正在尝试在我由 java 开发的桌面应用程序之一上添加“创建备份”选项。我对此进行了很多搜索,并找到了一些解决此问题的方法,但它们都破坏了一个重要的概念“可移植性”。许多人建议使用 mysqldump.exe(在 Windows 中)来执行此操作,但我想我需要知道 mysql 安装文件夹才能采用这种方法。以下是推荐的代码,顺便说一下无法正常运行(我不知道为什么,如果您注意到原因,请告诉我)

private static String dbName = "shams";
private static String dbUserName = "root";
private static String dbPassword = "";

public static boolean backupDB(File file) {
    String path = file.getPath();
    if (!path.contains(".sql")) {
        file = new File(path +".sql");
    }

    String executeCmd = "mysqldump -u " + dbUserName + " -p" + dbPassword + " --add-drop-database -B " + dbName + " -r " + file.getPath();
    Process runtimeProcess;
    try {

        runtimeProcess = Runtime.getRuntime().exec(executeCmd);
        int processComplete = runtimeProcess.waitFor();

        if (processComplete == 0) {
            System.out.println("Backup created successfully");
            runtimeProcess.destroy();
            return true;
        } else {

            System.out.println("Could not create the backup");
        }


    } catch (Exception ex) {
        ex.printStackTrace();


    }

    return false;
}

有些人建议简单地将数据库复制到某个位置。

所以..我应该以一种简洁的方式对此做些什么?有可用的第三方 jar 吗?

- 编辑 - -

给定代码的问题在于,当您没有用户(在本例中为 root 用户)的密码时,您不应在命令中提及密码。命令应该是这样的: String executeCmd = "mysqldump -u " + dbUserName + " --add-drop-database -B " + dbName + " -r " + file.getPath();

而且您毕竟不需要指定mysql安装文件夹。上面的代码按原样工作。

4

2 回答 2

1

首先,需要知道 mysqldump 可执行文件的位置并不一定意味着失去可移植性 - 只需将其作为配置参数 - 作为程序的命令行选项,或在配置文件中。

其次,您运行 mysqldump 命令的问题可能与您使用 Runtime.exec() 有关。ProcessBuilder 对象为您提供了更多的控制权。SO 和整个网络上有很多关于正确使用 ProcessBuilder 的问题/答案 - 您可能会发现其中一些很有用。

据我所知,在不实际运行 mysqldump 可执行文件的情况下,没有全 java 方式来执行 mysqldump。

于 2012-09-22T14:57:53.673 回答
1

这个问题有纯Java解决方案;例如

(我还没有检查其中任何一个,看看他们是否做得不错...... YMMV。)

但是,我对使用 3rd-party 转储程序持谨慎态度,因为您最终可能会遇到无法正确恢复的转储的风险。

是的,您确实需要知道mysqldump程序的路径。但这可以使用合理的默认值和/或配置文件中的条目来处理。您的“破坏可移植性”评论正在使一座小山变成一座山。


我看不出您的代码有任何明显错误。我建议您从中捕获“标准错误”和“标准输出”mysqldump并查看它的内容。

  • 也许它类似于不正确的凭据或不存在的输出目录。
  • 也许您的选项之一不正确。(这真的是你应该如何使用该-B选项吗??)
于 2012-09-22T15:07:07.670 回答