96SEO 2026-06-15 11:35 1
spring: datasource: url: jdbc:mysql://localhost:/liquibase_demo?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8 username: root password: driver-class-name: com.mysql.cj.jdbc.Driver liquibase: enabled: true change-log: classpath:db/changelog/db.changelog-master.yaml contexts: dev
你说啊,项目里改表结构,那是常有的事儿。

可是一不小心,生产库多了几个字段,测试库少了几张表。
这时候谁来负责?谁来解释?
别慌,LiquiBase 就是帮你把这些“历史脚印”全记录下来。
哈哈,一句话概括:让数据库像代码一样,可回滚、可审计。
Liquibase 基本概念速递Zui核心的东西叫 changeSet。
每个 changeSet 必须有唯一的 id + author 组合。
它就像一条小命令,执行一次后会在内部表里打上标记。
下次启动,Liquibase 会去查 DATABASECHANGELOG 表,kan哪些Yi经跑过哪些还没跑。
于是只会执行未执行的那部分,省得重复跑 SQL。
怎么把 changeSet 写进项目Zui常见的Zuo法是用 YAML 或 XML,甚至Ke以直接写 formatted SQL。
下面给你一个Zui基础的例子:
databaseChangeLog:
- changeSet:
id: -create-users-table
author: feng
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: bigint
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: username
type: varchar
constraints:
nullable: false
- column:
name: email
type: varchar
constraints:
nullable: false
- addUniqueConstraint:
tableName: users
columnNames: email
constraintName: uk_users_email
rollback:
- dropTable:
tableName: users
这个 changeSet Zuo了两件事:建表 + 加唯一索引。
还有回滚逻辑:删表。
环境隔离:context & label实际项目里你肯定有 dev、test、prod 三套环境。
context 就是帮你过滤——只在匹配的环境里跑对应的 changeSet。
changeSet:
id: init-dev-data
author: feng
context: dev,test # 只在 dev 和 test 环境执行
changes:
- insert:
tableName: users
columns:
- column:{name:"username",value:"张三"}
- column:{name:"email",value:""}
- column:{name:"age",valueNumeric:"28"}
- column:{name:"created_at",valueDate:"2024-01-01T10::00"}
Ru果想按业务模块划分,就Ke以用 tag/label,比如 tag=order-module.
Maven 项目里加上插件配置,一键搞定:
org.liquibase
liquibase-maven-plugin
${liquibase.version}
src/main/resources/db/changelog/db.changelog-master.yaml
${jdbc.url}
${jdbc.username}
${jdbc.password}
${jdbc.driver}
Maven 命令随便敲:
mvn liquibase:update
mvn liquibase:updateSQL
mvn liquibase:rollback -Dliquibase.rollbackCount=1
CICD 流水线里直接跑同样的 Maven 命令,让每次发布dou自动同步数据库结构。
回滚策略—别等到线上出锅才慌乱AWS 那边我曾经遇到过一次“字段太长导致插入失败”。
B站朋友也碰到过“误删列”。
Liquibase 的好处就是你提前写好 rollback 脚本,出问题只要执行一次回滚命令就Neng恢复到前一个版本。
changeSet:
id: add-user-phone-column
author: feng
changes:
- addColumn:
tableName: users
columns:
- column:{name:"phone",type:"varchar",defaultValue:"",constraints:{nullable:false}}
rollback:
- dropColumn:
tableName: users
columnName: phone
"为什么百度不收录"这件事儿——顺便聊聊 SEO 小插曲吧 😆
有人问:“我把 Liquibase 文档放在公司博客上,百度竟然不收录?”
# 不对不对,这其实跟内容本身关系大。
#1 内容重复度高:Baidu 喜欢原创、唯一的文字。Ru果你直接复制官方文档,那搜索引擎会认为没有价值,自然不收录。
#2 缺少有效外链:Baidu 抓取页面时会参考外部链接权重,Ru果页面孤立无援,也容易被忽略。
#3 没Zuo好 Meta 信息:
#4 页面加载慢:Baidu 爬虫对超时敏感,大段 JS 或慢查询dou会让它直接放弃。
P.S. 想让百度收录?写点自己的实践经验、加点案例截图、别忘了标题和描述,这些douNeng提升抓取概率啦!哈哈~你懂的~
Sprint Boot 中集成 Liquibase 的细节坑点
- 把 spring.liquibase.enabled 设置成 true,否则默认关闭。
- 确保数据库账号有创建表和插入数据的权限,否则启动报错。
- Ru果使用 JPA 的 ddl-auto=update,要改成 none,否则两套机制会抢戏。
spring:
jpa:
hibernate:
ddl-auto: none # 防止 JPA 自动建表冲突
liquibase:
enabled:true # 开启 Liquibase 自动执行变geng日志
contexts:test # 在 test 环境才跑特定脚本
change-log=classpath:/db/changelog/db.changelog-master.yaml
MULTI‑INSTANCE 场景下锁表处理
Liquibase 会在 DATABASECHANGELOGLOCK 表里打锁,只允许一个实例执行迁移。
If 锁没及时释放,会导致后面的实例一直卡在那里报 “LockException”。解决办法hen简单:手动清理锁表或在异常捕获里调用 “releaseLock”。哈哈,这招救了我好几次!
Pitfalls & Best Practices 🚀
- 每个 changeSet 保持原子性:一个文件只干一件事儿,便于审计和回滚。
- 用 preConditions 检查前置条件,比如 “tableExists”,防止重复建表导致错误。
- 给重要变geng加上 checksum 注释,一旦修改需要手动 updateSQL 并重新生成 checksum。
changeSet:
id:-add-index-to-orders-status
author:feng
preConditions:
- onFail:MATCH
- not:
indexExists:{tableName:"orders", indexName:"idx_orders_status"}
changes:
- createIndex:{tableName:"orders", indexName:"idx_orders_status", columns:}
rollback:{dropIndex:{tableName:"orders", indexName:"idx_orders_status"}}
"说实话",我Zui爱用 YAML 而不是 XML,因为它kan着geng干净、geng像配置文件嘛 😎.
Epilogue——把数据库当代码来对待,你才不会被意外吓到! 🎉.
把 Liquibase 当成你的“数据库版本控制系统”。每次改动dou写进 changelog,每次发布dou让 CI 自动跑 update 或者 updateSQL;出现问题再跑 rollback;所有人douNeng在 Git 上kan到历史记录;审计也省心。
Ciao~祝你玩得开心,别忘了给代码和 DB dou贴上标签,好追溯呀!哈哈哈~懂得~.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback