Azure Data Factory实现MariaDB到Azure SQL的历史数据保留式更新
需求场景说明
我正尝试将数据从MariaDB迁移至Azure SQL数据库,具体场景如下:
Azure SQL目标表现有数据
| id | state | insert time | updated value |
|---|---|---|---|
| 1 | 100 | 2022-01-01 14:30:00 | yes |
| 2 | 100 | 2022-01-01 14:30:00 | yes |
| 10 | 200 | 2022-01-01 14:30:00 | yes |
MariaDB新查询结果
| id | state | insert time | updated value |
|---|---|---|---|
| 1 | 300 | 2022-01-01 15:30:00 | yes |
| 2 | 200 | 2022-01-01 15:30:00 | yes |
| 12 | 100 | 2022-01-01 15:30:00 | yes |
核心需求
检查MariaDB返回结果中的id是否已存在于Azure SQL表中:
- 若存在,将Azure SQL表中对应旧数据的
updated value列更新为NO - 随后插入MariaDB的新查询结果
最终目标表数据如下:
| id | state | insert time | updated value |
|---|---|---|---|
| 1 | 100 | 2022-01-01 14:30:00 | NO |
| 2 | 100 | 2022-01-01 14:30:00 | NO |
| 10 | 200 | 2022-01-01 14:30:00 | yes |
| 1 | 300 | 2022-01-01 15:30:00 | yes |
| 2 | 200 | 2022-01-01 15:30:00 | yes |
| 12 | 100 | 2022-01-01 15:30:00 | yes |
由于需要保留旧数据用于不同时间点的状态分析,不适用常规Upsert方案,请问如何在Azure Data Factory中实现该需求?
实现方案(Azure Data Factory)
通过串联三个核心活动即可实现需求,具体步骤如下:
1. 暂存MariaDB新数据
使用复制数据活动,将MariaDB的查询结果写入Azure SQL的临时表(例如temp_mariadb_sync_data),结构需与目标表完全一致;也可选择Azure Blob Storage/ADLS Gen2作为中转存储。临时存储仅用于暂存本次同步的新数据。
2. 更新目标表旧数据状态
使用存储过程活动,调用Azure SQL中预先创建的自定义存储过程,完成旧数据状态更新:
- 从临时表中提取所有待匹配的
id - 将目标表中
id匹配且updated value为yes的记录,批量更新为NO
示例存储过程代码:
CREATE PROCEDURE Sync_UpdateOldRecords AS BEGIN UPDATE target_table SET [updated value] = 'NO' FROM target_table t INNER JOIN temp_mariadb_sync_data tm ON t.id = tm.id WHERE t.[updated value] = 'yes'; END
3. 插入新数据至目标表
再次使用复制数据活动,将临时存储中的新数据插入到Azure SQL目标表中。若使用Blob/ADLS作为中转,则直接从存储位置复制到目标表即可。
4. 清理临时数据(可选)
添加存储过程活动或脚本活动,清空临时表或删除中转存储中的文件,避免占用不必要的资源。
管道执行顺序
确保活动按以下顺序执行:复制数据(MariaDB→临时存储) → 存储过程(更新旧记录) → 复制数据(临时存储→目标表) → 清理临时数据(可选)
内容的提问来源于stack exchange,提问作者Alfaisal Albakri
相关产品推荐
相关产品推荐

