从 BLOB 批量插入 Azure SQL 说文件无法打开

Posted

技术标签:

【中文标题】从 BLOB 批量插入 Azure SQL 说文件无法打开【英文标题】:Bulk INSERT into Azure SQL from BLOB saying file could not be opened 【发布时间】:2021-10-14 12:56:32 【问题描述】:

我正在尝试将 BLOB 容器中的 bulk_insert 插入 Azure SQL。

这是我的 StorageAccount:SanStore 容器:SanContainer

这是脚本

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://sanstore.blob.core.windows.net/sancontainer'
);

BULK INSERT ado_workitem
FROM 'WorkItemsComplete_Till_august_10.csv'
WITH (  DATA_SOURCE = 'SanStore',
        FIELDTERMINATOR=',',
        ROWTERMINATOR='\n',
        FIRSTROW=2,
        BATCHSIZE=10000);

该文件已经在我验证的 blob 容器中。但是在执行命令时它会触发

Msg 4861, Level 16, State 1, Line 23
Cannot bulk load because the file "WorkItemsComplete_Till_august_10.csv" could not be opened. Operating system error code 161(The specified path is invalid.).

请注意,我正在本地管理工作室尝试此脚本,并使用身份验证登录 SQL 服务器。

我错过了另一点。文件大小约为 300MB。这有什么问题吗。我听说有人使用 1 GB 文件玩批量插入

【问题讨论】:

create external data source 命令是否应该包含credential 参数? ref 我相信凭据仅支持 SAS 令牌。考虑到您的组织中禁止使用访问密钥,您可以尝试创建user delegation SAS吗? 【参考方案1】:

确保您使用 SAS 密钥访问存储。 Azure AD 标识和托管标识为currently not supported。

还要确保您从中读取数据的 blob 存储是公共的。目前不支持用于 Blob 存储和服务端点的专用 IP。

因为我可以错误地看到 file cannot be openedspecified path is invalid.

尝试复制以下内容以防万一排除语法问题:

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://sanstore.blob.core.windows.net/sancontainer/folder'
);

BULK INSERT ado_workitem
FROM 'WorkItemsComplete_Till_august_10.csv'
WITH (  DATA_SOURCE = 'SanStore',
        FIELDTERMINATOR=",",
        ROWTERMINATOR="\n",
        FIRSTROW=2,
        BATCHSIZE=10000);

进一步你可以参考:Troubleshooting BULK INSERT and OPENROWSET issues on Azure SQL Database

【讨论】:

不幸的是,由于安全限制,我们的环境中禁用了 SAS 密钥。仅启用 Azure AD 身份验证 不幸的是,根据Known issues,您只能使用 SAS Key。由于用户委托 SAS 仅适用于 Blob 存储,因此您可以尝试说服他们考虑类型 User delegation SAS。使用 (Azure AD) 凭据以及为 SAS 指定的权限进行保护。

以上是关于从 BLOB 批量插入 Azure SQL 说文件无法打开的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从本地 Azure Blob 存储批量插入?

从 Azure Blob 存储批量插入时出现 ERRORFILE 问题

如何在 Azure Blob 存储中备份和还原 Azure SQL 表,反之亦然

Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)

使用服务帐户从 Azure Blob 存储中批量删除文件

将数据从 Azure Blob 存储导入 AzureSQL PaaS 的方法