飞架构变更管理
作者 : Kamalendu Biswas, 高级解决方案架构师 @ Databricks
数据库版本管理是什么?数据库版本管理是现代软件开发中的关键实践,允许团队追踪、管理和控制数据库架构和数据随时间的变化情况。它涉及为不同数据库状态分配唯一的版本号或标签,使开发人员能够有效协作,如有需要可以回滚更改,并在各种环境中保持一致性。数据库版本管理工具通常使用迁移脚本或变更日志来记录修改,允许精确追踪谁进行了修改、何时以及为何进行修改。这种方法使部署更加顺畅,故障排除更为方便,并且在处理复杂的数据库系统时可以更好地协调团队成员。通过实施数据库版本管理,组织可以降低与数据库更改相关的风险,改进开发工作流程,并最终交付更可靠和高效的数据库驱动应用。
数据库版本管理工具:FlywayFlyway 是一个广受欢迎的数据库迁移工具,帮助管理和跟踪数据库模式的变更。
Flyway简介Flyway 是一个基于 Java 的工具,使用 SQL 脚本来进行数据库模式的迁移。主要功能有:
- 数据库模式的版本控制功能
- 支持多种数据库类型,并提供Databricks社区支持
- 使用带有版本号的SQL迁移脚本
- 与构建工具和框架(如Maven、Gradle和Spring)无缝集成
- 提供命令行界面和Java API
Flyway 数据库迁移引擎是一个命令行工具,允许你自动化部署数据库更新,同时保持对数据库版本的严格控制。它通过执行一系列版本化的迁移脚本,将数据库从一个版本迁移到另一个版本。当这些迁移应用到数据库时,新的版本号会被记录在唯一的模式版本历史表中。
架构迁移
每个迁移脚本的文件名中都包含目标版本号以及描述。在这个例子中,存在四个迁移脚本,对应版本 V1.01 到 V1.0.3(使用 主版本.小版本.修订版本 的语义化版本系统,例如:主版本.小版本.修订版本)。当前数据库版本在模式版本历史表中记录为 V1.0.1,这意味着 V1.0.0 和 V1.0.1 的脚本已经应用。确认这些脚本自应用后未被修改后,Flyway 会自动运行 V1.0.2 和 V1.0.3 的脚本,将数据库升级到最新版本。
与Databricks集成 前提条件(注:此处新增的换行是为了匹配英文原文的间距,并在"前提条件"后添加了冒号以匹配原文的标点符号。)
# 前提条件:
- 在开始使用Flyway进行数据库版本控制之前,首先要对它的核心概念和方法有一个基本的理解。第一步是查阅Flyway的“入门指南”文档。
- 已启用的Databricks统一目录能够使工作区访问Databricks SQL仓库。
-
确定项目的目录和模式。在这种情况下,我们将使用:
-
默认目录名称 : flyway_demo ; 这将会设置在JDBC URL中。
-
默认模式名称 : default ; Flyway将用来维护历史表。
- 模式 : bronze , silver , gold ; 不同的模式用于维护不同的数据库对象。
在你的 Databricks 工作区中建立默认目录和模式架构。
如果不存在 flyway_demo 数据库,则创建 flyway_demo 数据库;
如果不存在 flyway_demo.bronze 数据库,则创建 flyway_demo.bronze 数据库;
如果不存在 flyway_demo.silver 数据库,则创建 flyway_demo.silver 数据库;
如果不存在 flyway_demo.gold 数据库,则创建 flyway_demo.gold 数据库;
DDL 目录信息和创建模式的结果
2. 为您的 Databricks 工作区创建一个个人访问令牌(PAT)。
3. 获取你的 Databricks SQL 仓库的 JDBC URL 并设置默认数据库目录。
一个示例 JDBC URL
如下:
jdbc:databricks://<host-name>:443/<default-schema>;transportMode=http;ssl=1;AuthMech=3;httpPath=<warehouse-http-path>;ConnCatalog=<default-catalog>;EnableArrow=0;
注意:如果未提供任何值,连接将默认使用“default”模式名。请确保默认模式名已存在,或者根据需要在JDBC URL中进行相应的修改。
Flyway 配置或者,如果你用的是 Mac,你可以通过 Homebrew(一个包管理器)来下载它。
使用brew安装flyway数据库迁移工具
brew install flyway
2. 创建您的项目或克隆这个仓库 - databricks-flyway-demo
3. 配置 /flyway/conf/flyway.toml:。一些最重要的配置如下:
[environments.dev]
url = "<jdbc-url>;ConnCatalog=<default-catalog>;EnableArrow=0;"
user = "token"
password = "<token>"
schemas = [ "bronze", "silver", "gold" ]
[flyway]
environment="dev"
locations = [ "filesystem:./flyway/sql" ]
mixed = true
outOfOrder = true
validateMigrationNaming = true
defaultSchema = "默认架构"
baselineOnMigrate = "基线迁移启动"
注意:JDBC URL 尝试连接到名为“default”的数据库模式。确保您的目录中有此数据库模式,或者在 URL 中将“default”替换为现有的模式名。
- locations 是指向你项目中包含迁移脚本的 sql 文件夹的路径,例如
locations
。 - baselineOnMigrate = true 对现有数据库进行基线操作,排除所有到 baselineVersion 包括基线版本在内的迁移。更多细节请参阅 基线。
- 查看所有 配置参数,并根据需要进行相应的调整。
- 通过运行以下命令来验证设置,以确保一切配置正确无误。
运行迁移命令,配置文件路径为:/databricks-flyway-demo/flyway/conf/flyway.toml
flyway migrate -configFiles="/databricks-flyway-demo/flyway/conf/flyway.toml"
Flyway OSS 版本 10.17.3,由 Redgate 开发
请参阅发布说明:https://rd.gt/416ObMi
Databricks 是一个由社区贡献的数据库,详情请参阅:https://rd.gt/3SXtLDt
数据库:jdbc:databricks://adb-<workspace-id>.11.azuredatabricks.net:443/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/d1184b8c2a8a87eb;ConnCatalog=flyway_demo;EnableArrow=0; (SparkSQL 3.1)
成功验证了 4 项迁移(耗时 00:02.918s)
迁移配置
- 在 /sql 目录中创建第一个迁移,并确保其命名唯一。如前所述,Flyway 建议使用 主版本、次版本和修订 的命名语义。可以在文件名中添加 UNIX 纪元时间以确保其唯一性。
运行以下命令来获取当前时间的Unix时间戳:`date +"%s"`。输出结果为:1725742173。1725742173对应的是2025年1月1日 00:00:01。
迁移文件名:V001_1725742173_创建原始表格.sql
--原始客户表
CREATE TABLE IF NOT EXISTS bronze.raw_customers (
customer_id INT,
customer_name STRING,
phone_number STRING,
email_address STRING,
address STRING,
post_code STRING,
city STRING,
country STRING,
platinum_flag INT,
record_created_at TIMESTAMP
)
;
--原始订单表
CREATE TABLE IF NOT EXISTS bronze.raw_orders (
order_id INT,
order_date DATE,
customer_name STRING,
product_id INT,
product_name STRING,
quantity DECIMAL,
total_amount DECIMAL,
record_created_at TIMESTAMP
)
;
2. 可以使用以下命令来执行第一个迁移:
# 原始命令应在此处替换
(将 # 原始命令应在此处替换
删除,以符合原文的准确性和流畅性要求。)
最终修正如下:
2. 可以使用以下命令来执行第一个迁移:
(直接展示命令,不包含替换提示。)
flyway migrate -configFiles="/databricks-flyway-demo/flyway/conf/flyway.toml"` # 这条命令用于迁移数据库配置文件
2.a Flyway将在defaultSchema中创建flyway_schema_history表来记录所有更改。
2.b 迁移脚本中的 SQL 语句将会在 Databricks SQL 中运行。
2.c Flyway 会更新 flyway_schema_history 表包含迁移详情。
模式升级查询历史
历史记录
这是来自flyway迁移的表DDL更新
- 创建第二个迁移脚本来加载原始数据。这包括一次性加载、手动更新或任何必要的DML操作。
迁移文件名:V002_1725742215__插入原始数据.sql
4. 再次运行 flyway migrate 命令,并等待数据插入操作完成。数据插入完成后,你将在 flyway_schema_history 表中看到一条新的迁移记录。
5. 创建一个新的迁移文件 V003_1725742392__create_silver_tables.sql,用于在银色架构中创建两个暂存表 stg_customer 和 stg_order,并执行 flyway 迁移。
请注意,这些表中没有主键。我们将创建一个新的迁移文件,为这些表添加主键。
6. 创建一个新的迁移文件 V004_1725753080__add_pk_silver_tables.sql ,以将主键添加到这些暂存表中,然后运行 flyway 迁移。
ALTER TABLE silver.stg_customer ADD CONSTRAINT stg_customer_pk PRIMARY KEY(customer_id);
ALTER TABLE silver.stg_order ADD CONSTRAINT stg_order_pk PRIMARY KEY(order_id);
很遗憾的是,迁移失败了,因为主键字段需要设置为 NOT NULL,而我们在创建表时忘记设置了这一点。请注意,迁移的历史记录已经更新为 false;我们需要修复这个问题。所以,我们来修复这个迁移问题吧。
无效 — NOT NULL
迁移失败的日志
7. 修改迁移文件 V004_1725753080__add_pk_silver_tables.sql:将所需的列设置为 NOT NULL。
ALTER TABLE silver.stg_customer ALTER COLUMN customer_id SET NOT NULL; -- 设置customer_id为非空
ALTER TABLE silver.stg_order ALTER COLUMN order_id SET NOT NULL; -- 设置order_id为非空
ALTER TABLE silver.stg_customer ADD CONSTRAINT stg_customer_pk PRIMARY KEY(customer_id); -- 为customer_id添加主键约束
ALTER TABLE silver.stg_order ADD CONSTRAINT stg_order_pk PRIMARY KEY(order_id); -- 为order_id添加主键约束
8., 运行 flyway migrate 命令以重新运行迁移过程。哎呀!我们出了点问题;我们忘了修复 flyway 的历史记录。
9. 运行 flyway repair 命令来修复历史记录。
运行修复命令:flyway repair -configFiles="/databricks-flyway-demo/flyway/conf/flyway.toml"
10. 再次运行 flyway migrate 命令以重新运行修正后的迁移。此时你将看到 ALTER 语句在 Databricks SQL 上运行。flyway_schema_history 表也会被更新为最新状态。
正在运行的ALTER命令
成功迁移记录
11. 银色的 PK 舞台表已经更新了 PKs。
更新了表格啦!
- 最后,我们进行了几次迁移以测试对Databricks功能(如液体聚类、删除向量、预测性优化、流表、物化视图等)的支持。
V005_1725864865__create_liquid_table.sql
V006_1725865484__alter_table_properties.sql
V007_1725866341__create_streaming_table.sql
V008_1725866372__创建物化视图.sql
CI/CD为了简单起见,我们可以使用官方的Redgate Flyway GitHub Action来展示如何使用数据库迁移设置持续集成(CI)流程。值得注意的是,这个GitHub Action还没有提供所有配置选项的完全列表。不过,您可以使用官方的Flyway Docker镜像来自定义持续集成(CI)流程,以满足您的具体需求。
Flyway社区关于Github Actions限制的讨论在这里阅读。
结论:在这篇博客里,我们成功创建并展示了一个项目,演示如何在 Databricks 中使用 Flyway 社区版有效地管理数据库版本。值得注意的是,这种集成是由社区管理和维护的,依赖于开发人员和用户的支持来增强其功能并解决可能出现的问题。
我们也简要探讨了该项目的CI/CD方面,重点是利用GitHub Actions来自动化和简化数据库版本管理流程。我们还可以将这些更改推进到更高层级的环境,例如QA或生产。