我有一个COPY INTO将 csv.gz 文件从 Blob 存储帐户加载到 Azure Synapse 实例的语句在几乎整整一小时 (01:00:08) 后重复失败,并显示以下错误消息;
Error occurred while decoding 'https://somestorageaccount.blob.core.windows.net/container/file.csv.gz' using GZIP codec. Codec error code: -5. Codec error message: <unknown>
我使用服务主体作为凭据来执行脚本 ( followed this guide ),如下所示;
COPY INTO [Schema].[tbTable]
FROM 'https://somestorageaccount.blob.core.windows.net/container/file.csv.gz'
WITH (
CREDENTIAL = (IDENTITY= 'xxx-123-abc@https://login.microsoftonline.com/abc-xxx-123/oauth2/token', SECRET='123-secretvalue-xxx'),
FILE_TYPE = 'CSV',
COMPRESSION = 'GZIP',
FIELDTERMINATOR = ',',
FIELDQUOTE = '"',
ENCODING = 'UTF8',
FIRSTROW = 2
);
我已使用设置为存储帐户 key 的凭据测试了此脚本,但没有遇到相同的问题。我希望设置一个服务主体来执行脚本。
我怀疑脚本在一小时后重复失败(超时?)。这可能是服务主体权限问题吗?我找不到任何表明使用此身份发出的进程超时的信息。
最佳答案
我最终从 Microsoft Azure Synapse Analytics 支持升级工程师那里得到了答案。响应是应用程序 token 的 TTL 为 1 小时,因此这就是我的脚本失败的原因。
下面是微软工程师的回复;
下面是我们合作的案例摘要,以便您可以保存以供将来引用。
- 症状:将 csv.gz 文件从 Blob 存储帐户加载到 SQL DW 实例的 COPY INTO 语句在几乎一小时 (01:00:08) 后重复失败,并出现错误下面留言;
- 对 SQL Server 执行失败。 SQL错误号:13820。错误
消息:解码时发生错误 'https://somestorageaccount.blob.core.windows.net/container/file.csv.gz' 使用 GZIP 编解码器。编解码器错误代码:-5。编解码器错误消息:未知
- 对 SQL Server 执行失败。 SQL错误号:13820。错误
- 原因:与 AAD 的人员同步后,我们确认应用 token 的 TTL 为 1 小时。内部 MS 租户(如我们用来测试的租户)配置了自定义 24 小时 TTL。这种不一致就是造成困惑的原因。不幸的是,DW(openrowset 后端)中的 native 代码路径不支持 token 刷新,因此 1 小时是一个硬限制。这方面的积压工作有所改善。
cx 的几个选项:
- 如果可能,请使用其他身份验证方法,例如 MSI。根据 AAD 人员的说法,MSI token 的 TTL 均为 24 小时,无论是内部还是外部。
- AAD 租户管理员,可以配置 token 生命周期。 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-configurable-token-lifetimes#configurable-token-lifetime-properties-after-the-retirement
关于azure - 使用 GZIP 编解码器在 Azure Synapse Analytics 中针对 csv.gz 文件执行 COPY 语句时收到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66529734/