Java 通过JDBC恢复包含“拷贝”的pg_转储文件

Java 通过JDBC恢复包含“拷贝”的pg_转储文件,java,postgresql,jdbc,Java,Postgresql,Jdbc,我目前正在尝试加快用于Jenkins上测试的数据库转储的恢复速度 当前情况:当前转储~15 MB使用大量插入来恢复数据库中的所有数据。一个有多年历史的JDBC工具用于恢复转储和补丁等产生的所有更新脚本 问题:较新的转储默认使用COPY,但该工具似乎在这方面存在问题。由于stdin部分的原因,一个简单语句.executesqlstring似乎失败了。copyManager.copyInsqlstring失败,错误为:语法错误位于或接近\A\。在每个复制命令之后 命令示例: COPY foo_dat

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

当前情况:当前转储~15 MB使用大量插入来恢复数据库中的所有数据。一个有多年历史的JDBC工具用于恢复转储和补丁等产生的所有更新脚本

问题:较新的转储默认使用COPY,但该工具似乎在这方面存在问题。由于stdin部分的原因,一个简单语句.executesqlstring似乎失败了。copyManager.copyInsqlstring失败,错误为:语法错误位于或接近\A\。在每个复制命令之后 命令示例:

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方法没有将表名作为参数,这应该会让您产生怀疑

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

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

COPY tablename FROM '/path/to/datafile'
带有第二个和第三个参数的表单用于

COPY tablename FROM STDIN
在这里,数据是从数据库客户端读取的,您必须以java.io.Reader或java.io.InputStream的形式提供它们

您的代码可能如下所示:

试一试{ org.postgresql.copy.CopyManager copy=org.postgresql.PGConnectionconn.getCopyAPI; java.io.FileReader infle=new java.io.FileReader/home/laurenz/copydata; copy.copyInCOPY copydest从标准格式“csv”复制,填充; }捕获java.io.ioe异常{ System.err.PrintLn无法读取包含复制数据的文件。; } copyInsomeSqlString是有效的签名。关键是,我不想只恢复一个表,我想这不会是一个问题,而是一个包括模式、表、函数等的整个数据库。也许我被误导了,这在copyIn中甚至是不可能的?对。copyIn是将表复制到单个PostgreSQL表中或从中复制出来。您必须拆分转储文件并将副本数据提取到各个文件中,然后才能加载这些文件。分叉psql进程可能更容易。。。