从 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 opened
和 specified 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 存储批量插入时出现 ERRORFILE 问题
如何在 Azure Blob 存储中备份和还原 Azure SQL 表,反之亦然
Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)