mysql Liquibase如何管理mysql_mysql迁移工具讲解

来源:这里教程网 时间:2026-02-28 20:49:55 作者:

MySQL 迁移为什么不能只靠手动
ALTER TABLE

多人协作时,

ALTER TABLE users ADD COLUMN phone VARCHAR(20)
这种操作在本地跑通,推到测试库可能失败——比如字段已存在、字符集不一致、或加索引时锁表超时。Liquibase 的核心价值不是“多了一个工具”,而是把每次结构变更变成可版本控制、可回滚、可跨环境复现的
changelog
文件。

liquibase.properties
必须显式指定
driver
url
参数

MySQL 8+ 默认使用

caching_sha2_password
认证插件,而旧版 JDBC 驱动(如
mysql-connector-java:5.1.x
)不支持,会导致
Access denied for user
错误。必须同时满足:

mysql-connector-java:8.0.33+
驱动
url
中显式加上
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
driver
设为
com.mysql.cj.jdbc.Driver
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
username: root
password: pass

generate-changelog
初始化已有 MySQL 库要避开主键顺序陷阱

执行

liquibase generate-changelog
会把当前库结构导出为 XML/YAML/JSON 格式的
changelog
,但 MySQL 的
SHOW CREATE TABLE
不保证外键定义顺序,可能导致生成的
<createtable></createtable>
<addforeignkeyconstraint></addforeignkeyconstraint>
在文件中颠倒——Liquibase 执行时报
Unknown table 'xxx'

加参数
--outputFile=init.xml --diffTypes=tables,columns,primaryKeys,foreignKeys
限制只导结构,不导数据和视图
导出后手动检查:所有
<addforeignkeyconstraint></addforeignkeyconstraint>
必须出现在其引用的
<createtable></createtable>
之后
若已有外键依赖未建表,拆成两个 changelog 文件:先建表,再建约束

update
失败后
rollback
不一定安全

Liquibase 的

rollback
依赖 changelog 中是否定义了
<rollback></rollback>
块。MySQL 的某些操作天然不可逆,比如:

DROP COLUMN
—— 没法自动还原丢失的数据
MODIFY COLUMN
缩小长度(
VARCHAR(100) → VARCHAR(10)
)—— 可能截断数据,rollback 不会恢复原值
CHANGE COLUMN
改类型(
INT → VARCHAR
)—— 类型转换逻辑需人工写在
<rollback></rollback>

真正可靠的回滚方式是:用

mysqldump
liquibase update
前备份库,并记录本次
changeset id
;出问题时直接还原 dump,再调整 changelog。

相关推荐