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