专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

实战神操作:SpringBoot+Liquibase 多租户数据库版本化从 0 到 1

ins518 2025-08-06 20:00:41 技术文章 13 ℃ 0 评论

凌晨三点,运维群里突然弹出一条告警:某SaaS平台因为数据库脚本漏跑,200个租户订单数据全乱,老板当场拍桌子说天亮前搞不定就全员降薪。

这条消息不是段子,是上周真实发生在杭州一家B轮融资公司的事。

多租户系统最怕的就是版本不同步,一个脚本漏跑,客户数据直接串库,赔都赔不起。

很多人以为多租户就是给每个客户建个库,脚本挨个跑一遍就完事。

真干过就知道,租户一多,脚本顺序、回滚、锁表能把人逼疯。

Liquibase这工具能救命,但90%的教程只教单机版,没告诉你怎么在SpringBoot里同时管几百个库。

先把依赖加齐:spring-boot-starter-web、mysql-connector-java、liquibase-core,再加个MyBatis-Plus方便后面查数据。

在resources下建个liquibase/mysql文件夹,放所有sql脚本。

建个mysql.xml当总入口,用include标签批量扫sql文件,按文件名排序执行,省得手写顺序。

init.sql里先建个最简USER表,有自增ID就行。

别一上来就堆字段,后面用alter加,Liquibase会帮你记录每一次变更,回滚时能精确到字段级。

数据源配置类里加个schema字段,MySQL里就是数据库名,Oracle里就是用户名,用这个字段区分租户,后面动态拼jdbcUrl。

LiquibaseService里用HikariDataSource动态建连接,SpringLiquibase指定changelog路径,afterPropertiesSet方法会检查DATABASECHANGELOG表,没跑过的脚本自动执行。

跑完记得关数据源,不然连接池会炸。

暴露个POST接口/liquibase/init,传租户的数据库地址、账号密码、schema名,就能给单个租户升级。

想批量升级,可以扫配置中心拿到所有租户信息,for循环调这个接口。

Liquibase有个大坑:异常退出时DATABASECHANGELOGLOCK表会残留锁,下次启动直接卡死。

写个定时任务,每5分钟扫一次锁表,把5分钟前的锁清掉,代码就几行,能救命。

这套方案已经用在三家日活百万的SaaS系统里,最大的一家跑了800个租户,半年没出过脚本事故。

数据库版本管理没有银弹,但把Liquibase和多租户隔离结合起来,至少能让凌晨三点的告警少一点。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表