我试图将数据从内部PostgeSQL或MSSQL中的视图复制到Azure PostgreSQL中的表。当我从源到接收器映射超过6列时,似乎无法成功复制此内容。
我怀疑问题所在是源列之一,所以映射的列各有不同,但是如果总共复制少于6个,则所有列都将成功。 然后,我尝试了不同的源表和接收器表,它们产生相同的结果。
如果我复制到一个中间csv文件,则可以成功导入/导出无限制的列。
ADF控制台中始终显示的错误输出是: “对目标Copy_7dp的操作失败:Type = Npgsql.PostgresException,Message = 08P01:无效的消息格式,Source = Npgsql,'”
答案 0 :(得分:1)
ADF控制台中始终显示的错误输出为:“ 目标Copy_7dp失败:类型= Npgsql.PostgresException,消息= 08P01: 无效的消息格式,Source = Npgsql,'“
您可能会在此old case中找到一些线索,这与您的错误跟踪类似。请在上面的链接中查看解决方案:https://github.com/npgsql/npgsql/issues/189#issuecomment-67001166
基本上,如果我们尝试使用Npgsql保留的字符串值是 从MemoryStream.GetBuffer()派生,它将爆炸,但是如果它来了 从MemoryStream.ToArray()可以正常工作。
在官方document中对此进行了解释:
请注意,缓冲区包含分配的字节,这些字节可能未使用。例如,如果将字符串“ test”写入MemoryStream对象,则从GetBuffer返回的缓冲区的长度为256,而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用ToArray方法。但是,ToArray会在内存中创建数据的副本。
但是,我怀疑这是ADF Postgresql连接器的缺陷,我们无法在使用级别上调整任何传输源代码。(当然,您可以将反馈提交给Azure adf团队以获取正式声明)
目前,作为解决方法,您可以使用csv文件作为中介。将数据从本地数据库传输到Azure Blob存储中的csv文件。然后将数据传输到目标Postgresql数据库中。
答案 1 :(得分:0)
与Microsoft的ADF团队进行了讨论,他们启发了我一个事实,即Postgresql对一次可写的元素数量有16位的限制。也就是说,如果(行大小*列大小)> 65536,则会引发此错误。
解决方案是简单地减少“复制数据”活动e.g this image的接收器属性中的“写入批处理大小”