gpt4 book ai didi

java - 通过 JDBC 恢复包含 "COPY"的 pg_dump 文件

转载 作者:行者123 更新时间:2023-12-02 12:38:54 26 4
gpt4 key购买 nike

我目前正在尝试加快用于在 Jenkins 上进行测试的数据库转储的恢复速度。

当前情况:当前转储(~15 MB)使用大量“INSERT”来恢复数据库中的所有数据。使用 JDBC 的多年老工具用于恢复转储和所有较新的更新脚本(由补丁等产生)。

问题:较新的转储默认使用“COPY”,但该工具似乎存在问题。由于标准输入部分,一个简单的statement.execute(sqlstring) 似乎失败了。 copyManager.copyIn(sqlstring) 失败,并出现错误:“\”处或附近的语法错误(每个复制命令后都跟随一个\.)命令示例:

COPY foo_data (id, cusid, tnmnid, usrid, some_text, more_text, archiv) FROM stdin;
\.

使用CopyManager的来源:

CopyManager cpManager = ((BaseConnection) connection).getCopyAPI();

String sqlContent;
sqlContent = FileUtils.readFileToString(sqlFile, "UTF-8");
// The dump contains a user variable that needs to be replaced
sqlContent = StringUtils.replace(sqlContent, DB_USER, dbName);

cpManager.copyIn(sqlContent);

我可能错过了什么吗?

提前致谢!

最佳答案

这应该会让您怀疑 copyIn 方法没有将表名作为参数......

此函数的第一个参数必须是带有 COPY 的字符串。 SQL语句。

仅当COPY语句命名应从中读取数据的文件(在数据库服务器上!)时,该函数的单参数形式才有效,例如

COPY tablename FROM '/path/to/datafile'

带有第二个(也可能是第三个)参数的表单用于

COPY tablename FROM STDIN

这里的数据是从数据库客户端读取的,您必须以 java.io.Readerjava.io.InputStream 的形式提供它们>.

您的代码可能如下所示:

try {
org.postgresql.copy.CopyManager copy = ((org.postgresql.PGConnection)conn).getCopyAPI();
java.io.FileReader infile = new java.io.FileReader("/home/laurenz/copydata");
copy.copyIn("COPY copydest FROM STDIN (FORMAT 'csv')", infile);
} catch (java.io.IOException e) {
System.err.println("Could not read file with COPY data.");
}

关于java - 通过 JDBC 恢复包含 "COPY"的 pg_dump 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com