如果超过6列,则Azure数据工厂复制管道将失败

时间:2019-10-17 14:26:37

标签: postgresql azure azure-data-factory npgsql azure-postgresql

我试图将数据从内部PostgeSQL或MSSQL中的视图复制到Azure PostgreSQL中的表。当我从源到接收器映射超过6列时,似乎无法成功复制此内容。

我怀疑问题所在是源列之一,所以映射的列各有不同,但是如果总共复制少于6个,则所有列都将成功。 然后,我尝试了不同的源表和接收器表,它们产生相同的结果。

如果我复制到一个中间csv文件,则可以成功导入/导出无限制的列。

ADF控制台中始终显示的错误输出是: “对目标Copy_7dp的操作失败:Type = Npgsql.PostgresException,Message = 08P01:无效的消息格式,Source = Npgsql,'”

2 个答案:

答案 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的接收器属性中的“写入批处理大小”