⭐ 一、什么是数据库 CI/CD?
很多人做 CI/CD 只会处理:
- 代码打包
- 运行单元测试
- 自动部署应用
但数据库往往被忽略。
⚠ 问题是:数据库不是代码,不能直接覆盖更新!
包括:
- 表结构(schema)
- 索引
- 视图
- 存储过程
- 初始数据、配置数据
所以必须有专门的数据库 CI/CD 方案。
⭐ 二、为什么数据库 CI/CD 必须做?
传统手动改数据库的方式有三个巨大风险:
1. ❌ 线上与测试库结构不一致
造成部署失败、运行异常。
2. ❌ DBA 与开发改重复、遗漏
多环境手工维护,极易出错。
3. ❌ 无法回滚
手动 SQL 修改一旦错了,基本等于事故。
数据库 CI/CD 的核心,就是解决以上全部问题。
⭐ 三、数据库 CI/CD 的核心组成(必须理解!)
一套完整的数据库 CI/CD 包含 4 个部分:
① 版本化管理(Versioning)——必须用工具管理 schema
常用工具:
| 工具 | 支持 DB | 优势 |
|---|---|---|
| Flyway | MySQL/PostgreSQL/Oracle/SQLServer 等 | 轻量级、最易用、用 SQL 脚本 |
| Liquibase | 全平台 | 强大、支持 XML/YAML 变更 |
| Alembic | MySQL/PostgreSQL | Python 项目首选,SQLAlchemy 官方推荐 |
| EF Migration | MSSQL | .NET 内置迁移 |
这是数据库 CI/CD 的基础。
② 脚本审核机制(Review)
推送 SQL/DDL 前必须经过自动审核:
- 表字段类型
- 索引命名规范
- 禁止全表扫描
- 禁止隐式转换
- 禁止 DROP 整张表
- 数据迁移必须分批执行
常用工具:
- SQLFluff(SQL lint)
- PingCAP TiDB Linter
- 阿里云 DMS
- 鲸智 DBA(国产非常成熟)
③ 自动构建/测试(CI)
数据库测试包含:
✔ Schema 单元测试
是否能执行成功?字段类型是否正确?
✔ Migration 冲突检测
多人开发是否写了冲突迁移?
✔ 数据一致性检测
外键是否断裂?索引是否丢失?
✔ 依赖应用测试
迁移后应用是否能正常启动?
在 CI 工具中运行:
- GitHub Actions
- GitLab CI
- Jenkins
- Azure DevOps
④ 自动部署(CD)
将审核通过的 migration 自动执行到:
- 测试库
- 灰度库
- 生产库
需要支持:
- 幂等执行
- 自动备份快照
- 失败自动回滚
- 有序依赖(按版本递增执行)
执行方式:
- Flyway migrate
- Liquibase update
- Alembic upgrade
⭐ 四、数据库 CI/CD 实战流程(强烈建议收藏)
这是最推荐、最常见的一套流程。
🔥 Step 1:开发者创建 Migration(版本脚本)
以 Flyway 为例:
V20251126__add_user_table.sql
示例:
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
提交到代码仓库。
🔥 Step 2:代码提交触发 CI(自动检查 SQL)
CI 执行:
- SQL 语法检查(SQL Lint)
- 检查是否违反约束规则(如禁止 SELECT *)
- 检查是否可能导致锁表、全表扫描
- 执行 migration 到“测试数据库镜像”
常见 CI 配置(GitHub Actions):
name: DB-CI
on:
push:
paths:
- db/migration/**
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Start MySQL
run: docker run -d -p 3306:3306 mysql:8
- name: Run Flyway
run: flyway migrate
🔥 Step 3:自动化测试(集成应用)
- Migration 执行成功
- 应用启动是否正常
- API 能不能正常访问
- 单元测试是否通过
如果不通过 → 直接阻止合并。
🔥 Step 4:自动 CD(部署到多环境)
示例生产部署命令:
flyway -url=jdbc:mysql://prod -user=root -password=xxx migrate
💡可以加入自动备份:
mysqldump > backup_$(date).sql
🔥 Step 5:失败自动回滚(可选)
Flyway 支持:
flyway undo
Liquibase 支持:
liquibase rollbackCount 1
生产事故时非常关键。
⭐ 五、常见数据库 CI/CD 方案(按技术栈给你推荐)
Python 项目(Django / Flask / FastAPI)
最佳方案:Alembic + GitHub Actions/GitLab CI
特点:
- Python 原生
- 自动对比 ORM 和数据库差异
- 生成 migration 非常方便
Java / Spring Boot 项目
最佳方案:Flyway(最轻量) 或 Liquibase(最稳定)
Spring Boot 内置支持:
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
大厂级平台(强需求)
推荐:
- 阿里云 DMS
- WhaleGo(鲸智)
- Archery
- Bytebase(专业数据库 CI/CD 平台)
⭐ 六、数据库 CI/CD 的 5 大最佳实践(实战经验总结)
① Migration 一旦发布,绝不能修改,只能新建一个
遵循:
✔ “向前迁移”
✔ “不可变脚本”
② 大批量数据更新必须分批(Batch)
避免锁表 + IO 风暴。
③ 禁止线上 DROP COLUMN / DROP TABLE
必须通过“弃用标记 → 延迟删除”。
④ 所有表必须有 primary key
没有主键会导致:
- 复制失败
- CDC 无法同步
- 备份恢复困难
⑤ CI 必须有“模拟生产库”环境
用于提前发现问题。
⭐ 七、总结:什么才是“真正会用数据库 CI/CD”?
你必须做到:
✔ 所有 schema 变更都有版本
✔ 所有 SQL 都经过审核
✔ 所有 migration 在 CI 测试过
✔ 所有部署都自动执行
✔ 所有错误均可回滚
这才是真正的数据库 CI/CD,而不仅仅是执行几条 SQL。
如果你需要,我还能为你生成:
📌 数据库 CI/CD PPT(可直接用来做汇报)
📌 针对 MySQL / PostgreSQL / SQLServer 深度版教程
📌 建一个可运行的 GitHub Demo 仓库
📌 为你的项目写一套完整的 CI/CD 脚本(Flyway / Alembic)
需要哪个?