批量bulkload数据到Azure SQL数据库

本文介绍了如何在创建好Azure SQL数据库后

  • 创建sql-server-samples数据库 AdventureWorks
  • 从Azure blob storage中将csv格式数据批量导入到Azure SQL数据库。

1.环境说明

  • Azure SQL Server (Logic) 准备就绪


    Azure SQL Server
  • Azure SQL准备就绪
    使用SSMS 连接Azure SQL database 确保登录成功


    Azure SQL

    SQL Server Management Studio(SSMS) 连接成功


    SSMS
  • Azure storage account 准备就绪
    这里storage account是 public storage account
    如果这里不设置为第一项的话,可能会遇到如下的错误
    在不使用public storage account的情况下,需要额外设置一些属性,具体设置请参见本文第5节

Cannot bulk load because the file "folder/XXX" could not be opened. Operating system error code 5(Access is denied.).
image.png

2.创建数据库和用户 [用admin用户操作,可以暂时忽略这一步]

打开AdventureWorks-oltp-install-script.zip 文件包里面包含

  • instawdb.sql
  • csv格式的按表导出的数据文件

2.1 创建用户

在Azure portal创建的Azure SQL数据库Server admin 是一个全局的admin 用户。
你可以直接用这个全局的admin用户操作。可以暂时跳过这一步。

如果需要给每个数据库创建单独的用户,
可以通过下面的方式创建指定数据库相关权限的用户。
比如下面示例中创建了etluser

  • master中创建 login用户
    ···
    use master
    create login etluser with PASSWORD = 'strongpassword'
    ···

  • 数据库级别用户映射登录用户

use AdventureWorks
CREATE USER [etluser] FOR LOGIN [etluser] with default_schema = dbo;
  • 给用户增加角色
ALTER ROLE [db_datawriter] ADD MEMBER etluser
ALTER ROLE [db_accessadmin] ADD MEMBER etluser
ALTER ROLE [db_datareader] ADD MEMBER etluser
ALTER ROLE [db_ddladmin] ADD MEMBER etluser

下图是Azure SQL数据库中的角色列表


image.png

3. 测试 bulk load数据到Azure SQL数据库

SSMS切换到数据库AndventureWorks

3.1 创建Master Key

Ref: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-master-key-transact-sql?msclkid=6dcae6fcb0a911ec9ca298df2a8f1224&view=sql-server-ver15

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'strongpasswordforsqlserver';

-- 如果存在可以删除 master key
DROP MASTER KEY  

3.2 需要storage account的SHARED ACCESS SIGNATURE

登录Azure portal找到 storage account,获取Shared Access Signature [SAS token]


image.png

3.3 创建database scoped credential

确保3.2步骤中获取的SAS token中的 ? 不要包含在SECRET 中。

 CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = 'sv=2022-11-02XXXXXXX';

3.4 创建外部数据源

确保LOCATION 设置的正确,直接从storage explorer中copy对应blob container的URL


image.png
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
 WITH ( TYPE = BLOB_STORAGE,
       LOCATION = 'https://XXXXXXX.blob.core.windows.net/adnventure',
       CREDENTIAL= MyAzureBlobStorageCredential);

创建成功的话可以在SSMS看到外部数据源


image.png

3.5 bulk insert

From 文件名的地方要注意下
比如我在Azure blob container中有个Address.csv文件完整的 URL

https://XXXXXXX.blob.core.windows.net/adnventure/adventure/AdventureWorks-oltp-install-script/Address.csv

External Data Source Location 信息
'https://XXXXXXX.blob.core.windows.net/adnventure'

BULK INSERT FROM 部分的信息
'adventure/AdventureWorks-oltp-install-script/Address.csv'
CREATE TABLE [Address](
    [AddressID] [int] IDENTITY(1,1) NOT NULL,
    [AddressLine1] [nvarchar](60) NOT NULL,
    [AddressLine2] [nvarchar](60) NULL,
    [City] [nvarchar](30) NOT NULL,
    [StateProvinceID] [int] NOT NULL,
    [PostalCode] [nvarchar](15) NOT NULL,
    [SpatialLocation] [geography] NULL,
    [rowguid] [uniqueidentifier] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL
)

BULK INSERT [Address] FROM 'adventure/AdventureWorks-oltp-install-script/Address.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage',
    CHECK_CONSTRAINTS,
    CODEPAGE='ACP',
    DATAFILETYPE = 'char',
    FIELDTERMINATOR= '\t',
    ROWTERMINATOR = '\n',
    KEEPIDENTITY,
    TABLOCK);

4 修改instawdb.sql

4.1 instawdb.sql 文件说明

  • 行1- 行120 数据库master中操作
    创建database
    如果database存在就删除,否则就创建AdventureWorks

  • 行120 行之后 切换到 AdventureWorks数据库
    创建schema
    创建xml schema
    创建表
    bulk load数据 //这部分需要调整 增加DATA_SOURCE = 'MyAzureBlobStorage'
    给表添加主键信息
    给表添加Index
    给表添加XML index
    Create Full Text catalog and indexes
    Create Foreign key constraints
    Add table triggers.
    创建View
    创建Function
    创建存储过程
    Add Extended Properties
    Drop DDL Trigger for Database

4.2 修改instawdb.sql

主要的修改包括以下几点

  • 由于Azure SQL不支持脚本中的use 切换数据库语法
    将instawdb.sql脚本拆分成两部分
    • 1.sql . 在master中创建数据库AdventureWorks (1-120 行)
    • 3.sql . 在AdventureWorks中创建schema,表,load数据等 (121行以后部分+ 两个环境变量)
      主要修改bulk insert部分
      调整前
BULK INSERT [Person].[Address] FROM '$(SqlSamplesSourceDataPath)Address.csv'
WITH (
    CHECK_CONSTRAINTS,
    CODEPAGE='ACP',
    DATAFILETYPE = 'char',
    FIELDTERMINATOR= '\t',
    ROWTERMINATOR = '\n',
    KEEPIDENTITY,
    TABLOCK
);

调整后 加了 DATA_SOURCE = 'MyAzureBlobStorage'

BULK INSERT [Person].[Address] FROM '$(SqlSamplesSourceDataPath)Address.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage',
    CHECK_CONSTRAINTS,
    CODEPAGE='ACP',
    DATAFILETYPE = 'char',
    FIELDTERMINATOR= '\t',
    ROWTERMINATOR = '\n',
    KEEPIDENTITY,
    TABLOCK
  • 增加脚本处理如下的信息
  • 2.sql 在AndventureWorks中创建external data source
    把blob storage创建为external data source
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='test@123';

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=XXXX'

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
 WITH ( TYPE = BLOB_STORAGE,
       LOCATION = 'https://XXXXX.blob.core.windows.net/adnventure',
       CREDENTIAL= MyAzureBlobStorageCredential);

执行的顺序是, 需要 查询/SQLCMD模式
1.sql
2.sql
3.sql

5 问题及解决

5.1 问题1 Cannot bulk load

Cannot bulk load because the file "folder/XXX" could not be opened. Operating system error code 5(Access is denied.)
  • 检查storage account的network部分的设置


    image.png

5.1.1 Enabled from all networks

如果是选择了这个,那么就要确保本文上面的尤其是步骤4中的都创建而且是正确的。

5.1.2 Enabled from selected virtual networks and IP addresses

image.png
  • 确保 Storage Account/Networking/Exceptions


    image.png
  • 为Azure SQL Server产生了Managed Identity

  • Storage Account ACL Blob container contributor 中加入了Azure SQL Server

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容