我目前正在尝试加速恢复用于在Jenkins上进行测试的数据库转储。
当前情况:当前转储(~15 MB)使用大量“INSERT”来恢复数据库中的所有数据。使用JDBC的多年历史的工具用于恢复转储和所有更新的更新脚本(由补丁等产生)。
问题:默认情况下,较新的转储使用“COPY”,但该工具似乎有问题。由于stdin部分,一个简单的statement.execute(sqlstring)似乎失败了。 copyManager.copyIn(sqlstring)失败并出现 ERROR:语法错误在“\”处或附近(每个复制命令后跟一个\。) 命令示例:
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);
我可能错过了什么吗?
提前致谢!
答案 0 :(得分:1)
它应该让你怀疑copyIn
方法不会将表名作为参数......
此函数的第一个参数必须是带有COPY
SQL语句的字符串。
该函数的单参数形式仅在COPY
语句命名文件(在数据库服务器上!)从中读取数据时才有效,如
COPY tablename FROM '/path/to/datafile'
带有第二个(可能是第三个)参数的表单用于
COPY tablename FROM STDIN
此处的数据是从数据库客户端读取的,您必须以java.io.Reader
或java.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.");
}