2

我正在尝试将数据从本地 PostgeSQL 或 MSSQL 中的视图复制到 Azure PostgreSQL 中的表。当我将超过 6 列从源映射到接收器时,我似乎无法成功复制它。

我怀疑其中一个源列是问题,因此映射了哪些列,但如果总共复制少于 6 个列,所有列都会成功。然后我尝试了不同的源表和汇表,它们产生了相同的结果。

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

ADF 控制台中始终显示的错误输出为:“目标 Copy_7dp 上的操作失败:Type=Npgsql.PostgresException,Message=08P01: invalid message format,Source=Npgsql,'”

4

2 回答 2

2

在与 Microsoft 的 ADF 团队讨论后,他们让我了解到 Postgresql 对一次可以写入的元素数量有 16 位限制。即如果(行大小 * 列大小)> 65536 它将引发此错误。

解决方案是简单地减少复制数据活动的接收器属性中的“写入批量大小”,例如此图像

于 2019-10-25T12:41:00.597 回答
1

ADF 控制台中始终显示的错误输出为:“目标 Copy_7dp 上的操作失败:Type=Npgsql.PostgresException,Message=08P01: invalid message format,Source=Npgsql,'”

您可能会在这个旧案例中找到一些线索,类似于您的错误跟踪。请参阅上面链接中的解决方案:https ://github.com/npgsql/npgsql/issues/189#issuecomment-67001166

基本上,如果我们尝试使用 Npgsql 持久化的字符串值是从 MemoryStream.GetBuffer() 派生的,它会爆炸,但如果它来自 MemoryStream.ToArray() 它会正常工作。

官方文档中有解释:

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 会在内存中创建数据的副本。

但是,我怀疑这是 ADF Postgresql 连接器的缺陷,我们无法在使用级别调整任何传输源代码。(当然,您可以向 azure adf 团队提交反馈以获得官方声明)

目前,作为解决方法,您可以使用 csv 文件作为中介。将数据从本地数据库传输到 Azure Blob 存储中的 csv 文件。然后将数据传输到目标 postgresql 数据库。

于 2019-10-18T09:52:01.097 回答