【问题标题】:How to do a backup from a Postgresql-DB via JDBC?如何通过 JDBC 从 Postgresql-DB 进行备份?
【发布时间】:2010-09-28 06:42:00
【问题描述】:

在我们的应用程序中,我们实现了从代码中触发的自动数据库迁移。现在我们要在进行任何迁移之前备份现有数据库。

谁能解释如何在 Java 代码中通过 JDBC 对 Postgresql-DB 进行完整备份?

更新:它不能通过 JDBC 工作。

这里是Frank Heikens回复的一些工作代码:

    final List<String> baseCmds = new ArrayList<String>();
    baseCmds.add("/usr/bin/pg_dump");
    baseCmds.add("-h");
    baseCmds.add("hostname");
    baseCmds.add("-p");
    baseCmds.add("5432");
    baseCmds.add("-U");
    baseCmds.add("username");
    baseCmds.add("-b");
    baseCmds.add("-v");
    baseCmds.add("-f");
    baseCmds.add("/path/to/backup.sql");
    baseCmds.add("dbName");
    final ProcessBuilder pb = new ProcessBuilder(baseCmds);

    // Set the password
    final Map<String, String> env = pb.environment();
    env.put("PGPASSWORD", "password");

    try {
        final Process process = pb.start();

        final BufferedReader r = new BufferedReader(
                  new InputStreamReader(process.getErrorStream()));
        String line = r.readLine();
        while (line != null) {
            System.err.println(line);
            line = r.readLine();
        }
        r.close();

        final int dcertExitCode = process.waitFor();

     } catch (IOException e) {
        e.printStackTrace();
     } catch (InterruptedException ie) {
        ie.printStackTrace();
     }

【问题讨论】:

    标签: java postgresql jdbc backup


    【解决方案1】:

    你为什么不用pg_dump

    【讨论】:

    • 因为当我使用 ProcessBuilder 启动 pg_dump 时,pg_dump 无法访问文件以将转储写入:(
    • 然后将 pg_dump 的输出流式传输到另一个位置。 pg_dump 是唯一安全的备份方法,所有其他方法(PITR 除外)都将失败。他们在最糟糕的时刻失败了。
    • 那也没用。它遇到了阻塞读取。我解决了这个问题,指定了没有任何“或”的文件名。
    【解决方案2】:

    Postgresql JDBC 库现在支持批量 COPY 操作。见http://jdbc.postgresql.org/documentation/publicapi/index.html?org/postgresql/copy/CopyManager.html

    要备份数据库,您需要将数据库中的CopyOut 复制到流中,然后使用CopyIn 反向进行恢复。

    【讨论】:

      【解决方案3】:

      我使用 DbUnit 从我的 java 应用程序中备份数据库:

      DbUnit 能够从 XML 数据集导出和导入数据库数据。从 2.0 版开始,当在流模式下使用时,DbUnit 也可以处理非常大的数据集。

      【讨论】:

      • DbUnit 不转储 SQL。但我没有在最初的问题中说明这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多