文章开始前,先问一个直击灵魂的问题:你还在用 MySQL 8.0 吗?如果答案是“是”,那你可能已经落后了。更可怕的是,如果你正摩拳擦掌想升级 9.0,那这篇文章可能会救你一命。
我是企小脉,一个在 MySQL 的版本迭代里摸爬滚打了近十年的老运维。每隔一段时间,MySQL 发布新的大版本,办公室里总会传出“要不要升?”的灵魂拷问,这次 MySQL 9.0 的发布,更是把这种讨论推向了高潮。
2024年7月1日,Oracle 推出了 MySQL 9.0 Innovation Release。同时段,他们还调整了整个版本策略:LTS(Long-Term Support,长期支持版) 和 Innovation(创新版本) 。8.4 是第一个正式的 LTS 版本,而 9.0 属于 Innovation Release。

但是,如果你是一个严谨的站长或运维负责人,听我一句劝:别碰 9.0! 甚至,你该把 9.0 直接放进“黑名单”。
一、MySQL版本策略巨变:LTS与Innovation两条线并行
2026年4月,MySQL生态发生了一件足以影响每一位站长和运维人决策的大事:MySQL 8.0正式结束了Extended Support周期,进入Sustaining Support阶段。这意味着Oracle不再为这个曾经统治互联网基础设施长达8年的版本提供新的安全补丁、bug修复或功能更新。如果你还在用8.0,你的数据库实际上已经处于"裸奔"边缘。
Oracle在2023年彻底重构了MySQL数据库的版本发布模型,将其分为两条并行的轨道:
LTS(Long-Term Support)轨道:面向生产环境,追求稳定与可预测性。MySQL 8.4于2024年4月30日正式GA,是这条轨道上的第一个正式版本。按照Oracle的承诺,8.4 LTS将获得5年的Premier Support(到2029年4月)加上3年的Extended Support(到2032年4月),总计8年的官方保障。
Innovation(创新)轨道:面向开发者和技术预研,追求功能迭代速度。MySQL 9.0于2024年7月发布,属于这条轨道上的首发版本。它的生命周期只有一个季度——当9.1发布后,9.0就不再接受任何维护。
这个策略调整的核心逻辑是:让需要稳定的人拿到长期承诺,让想尝鲜的人拿到前沿特性,但绝不把两者混为一谈。
| 版本 | 发布日期 | Premier Support | Extended Support | 定位 |
|---|---|---|---|---|
| MySQL 8.0 | 2018年4月 | 2025年4月结束 | 2026年4月结束 | 过渡主力 |
| MySQL 8.4 LTS | 2024年4月 | 至2029年4月 | 至2032年4月 | 生产首选 |
| MySQL 9.0 Innovation | 2024年7月 | 至2024年10月 | 无 | 尝鲜预研 |
企小脉在帮客户做数据库架构评估时,经常遇到一个误区:很多人看到9.0版本号比8.4大,就本能地认为"越新越好"。这在MySQL的新模型里是一个危险的认知偏差。版本号的大小不再直接等同于成熟度,LTS和Innovation的标识才是你真正需要关注的东西。
二、MySQL 9.0的新特性拆解:VECTOR、JavaScript与存储引擎清理
客观地说,MySQL 9.0确实带来了一些令人眼前一亮的新东西。但企小脉在实际测试和项目评估中发现,这些特性要么限制重重,要么属于企业版独占,要么尚未经过大规模生产验证。
2.1 VECTOR类型:AI向量存储的尝试与局限
MySQL 9.0引入了原生的VECTOR列类型,用于存储由4字节浮点值组成的向量数据结构。声明语法很直观:
CREATE TABLE v1 (c1 VECTOR(5000));
默认维度为2048,最大支持16383维。这个特性的初衷很明确:让MySQL能够直接存储AI模型生成的向量嵌入(Embedding),为RAG(检索增强生成)等场景提供数据层支持。
但企小脉在实测中发现了大量限制,这些限制在官方文档中被分散描述,很容易被忽视:
VECTOR列不能用作任何类型的键,包括主键、外键、唯一键和分区键- 不支持绝大多数MySQL内置函数:数字函数、时间函数、全文搜索、XML函数、位函数(如按位AND/OR)、JSON函数全部不接受VECTOR参数
- 仅支持少数字符串函数(
BIT_LENGTH、CHAR_LENGTH、HEX、LENGTH、TO_BASE64)和加密函数(AES_ENCRYPT、COMPRESS、SHA2) - 仅支持
STRING_TO_VECTOR()、VECTOR_DIM()、VECTOR_TO_STRING()三个专用函数 - 不支持聚合函数和窗口函数(
COUNT(DISTINCT)除外) - 不能用于NDB表
企小脉的观点是:VECTOR类型目前更适合"存储"而非"计算"。如果你的业务需要向量相似性搜索(如ANN近似最近邻),专门的向量数据库(如Milvus、Pinecone、pgvector)在功能和性能上仍然大幅领先。MySQL的VECTOR更像是一个"先占坑"的基础设施,距离生产可用还有一段路要走。
2.2 JavaScript存储程序:企业版的GraalVM革命
MySQL 9.0在企业版(Enterprise Edition)中引入了基于GraalVM的JavaScript存储程序支持。开发者可以用JavaScript编写存储过程和存储函数,甚至能在SQL语句的WHERE、HAVING、ORDER BY子句中直接调用JavaScript函数。
CREATE FUNCTION gcd(a INT, b INT)
RETURNS INT
NO SQL
LANGUAGE JAVASCRIPT AS
$mle$
let x = Math.abs(a)
let y = Math.abs(b)
while(y) {
var t = y
y = x % y
x = t
}
return x
$mle$
;
这个特性支持ECMAScript 2021标准库,理论上可以调用npm上的海量第三方包。MySQL 9.0还引入了LIBRARY对象来实现代码模块化复用,并在9.1、9.2、9.3中持续增强事务API、类型支持和动态加载能力。
但有几个现实问题:
- 社区版不支持:这是企业版独占功能,个人站长和小团队大概率用不上
- 调试复杂度:在数据库层引入JavaScript逻辑,意味着你的技术栈从SQL+应用代码变成了SQL+JS+应用代码,问题排查路径变长
- 性能不确定性:GraalVM虽然快,但JavaScript存储程序的性能特征与原生SQL差异很大,需要重新建立基准测试体系
2.3 存储引擎大清理:5个引擎被移除
MySQL 9.0继续了8.0开始的"瘦身"策略,正式移除了以下存储引擎:
| 被移除引擎 | 常见用途 | 替代方案 |
|---|---|---|
| ARCHIVE | 归档压缩存储 | InnoDB + 表压缩或独立归档系统 |
| BLACKHOLE | 复制过滤/性能测试 | 应用层过滤或自定义测试方案 |
| FEDERATED | 远程表访问 | 应用层多数据源或ETL工具 |
| MEMORY | 内存临时表 | InnoDB(调整buffer pool) |
| MERGE | 合并多个MyISAM表 | 分区表或应用层聚合 |
如果你的老系统还在用MEMORY引擎做会话缓存或临时计算,升级到9.0会直接报错。企小脉建议先在8.4阶段完成引擎迁移,而不是等到9.0再处理。
2.4 其他特性
EXPLAIN FORMAT=TREE成为默认输出格式,执行计划可读性提升EXPLAIN ANALYZE支持将JSON输出保存到变量,便于自动化分析- Event Scheduler的
CREATE EVENT、ALTER EVENT、DROP EVENT支持Prepared Statements - Performance Schema新增
variables_metadata和global_variable_attributes表
三、从8.0升级到8.4/9.0的关键变化:这些坑我们踩过
企小脉在过去一年协助多个项目完成MySQL升级,从8.0到8.4相对平滑,但如果不做前置检查,9.0的升级路径上布满了"暗雷"。
3.1 认证机制巨变:mysql_native_password彻底成为历史
这是升级过程中最容易导致业务中断的变更,没有之一。
时间线如下:
- MySQL 8.0.34(2023年7月):
mysql_native_password被标记为废弃 - MySQL 8.4 LTS(2024年4月):默认禁用,但可通过配置
mysql_native_password=ON临时启用 - MySQL 9.0 Innovation(2024年7月):完全移除,没有任何回退余地
9.0强制使用caching_sha2_password作为唯一认证插件,采用SHA-256哈希算法替代原有的SHA-1。安全性确实提升了,但兼容性问题随之而来。
企小脉在一个电商客户的升级项目中就踩了这个坑:升级完成后,应用服务全部报错"plugin 'mysql_native_password' is not loaded",导致凌晨的订单系统瘫痪了23分钟。事后排查发现,遗留的3个后台账号和一个旧版Java服务仍在使用原生认证。
升级前必做的检查:
-- 找出所有还在用旧认证插件的账号
SELECT user, host, plugin
FROM mysql.user
WHERE plugin = 'mysql_native_password';
迁移命令:
-- 逐个账号迁移到caching_sha2_password
ALTER USER 'legacy_app'@'%'
IDENTIFIED WITH caching_sha2_password
BY 'YourNewStrongPassword!2026';
FLUSH PRIVILEGES;
客户端兼容性要求:
| 连接驱动 | 最低版本要求 |
|---|---|
| MySQL Connector/J (JDBC) | 8.0.9+ |
| mysql2 (Node.js) | 2.18.0+ |
| PyMySQL | 1.0.0+ |
| mysql-connector-python | 8.0.0+ |
| PHP PDO MySQL | PHP 7.4+ |
如果你的应用依赖旧版驱动,升级数据库之前必须先升级驱动,否则连不上。
3.2 废弃参数与特性正式移除
以下参数在9.0中彻底消失,如果my.cnf中还有残留,MySQL会直接拒绝启动:
| 旧参数(8.0及之前) | 新参数(8.4/9.0) | 说明 |
|---|---|---|
innodb_log_file_size + innodb_log_files_in_group | innodb_redo_log_capacity | Redo Log动态管理 |
slave_parallel_workers | replica_parallel_workers | 复制术语标准化 |
slave_net_timeout | replica_net_timeout | 复制术语标准化 |
query_cache_type / query_cache_size / query_cache_limit | 无 | 查询缓存已移除 |
FLUSH HOSTS | TRUNCATE TABLE performance_schema.host_cache | 主机缓存清理方式变更 |
企小脉建议:在升级前用mysqlcheck扫描配置文件,并用mysqlsh -- util check-for-server-upgrade生成完整的不兼容项报告。
3.3 默认值变更带来的隐性风险
即使你没有修改过配置文件,升级后系统行为也可能发生变化:
| 参数 | 8.0默认值 | 8.4/9.0默认值 | 影响 |
|---|---|---|---|
binlog_transaction_dependency_tracking | COMMIT_ORDER | WRITESET | 复制并行度提升,但可能改变事务依赖判断逻辑 |
replica_parallel_workers | 0 | 4 | 多线程复制默认开启,复制架构行为改变 |
innodb_buffer_pool_instances | 固定值 | 自动根据buffer_pool_size调整 | 内存分配策略变化 |
企小脉在另一个内容站项目中,升级后发现复制延迟监控频繁误报。深入排查后发现,是replica_parallel_workers=4导致从库的并行应用改变了延迟的统计特征——原来的单线程复制延迟是"线性"的,多线程下变成了"批量"的,监控阈值需要重新校准。
3.4 升级路径的硬性约束
MySQL官方明确要求遵循"no skipping versions"原则。你不能从8.0直接跳到9.0,正确的路径是:
MySQL 8.0.x → MySQL 8.4 LTS → MySQL 9.0 Innovation
企小脉的建议是:大多数业务走到8.4 LTS就可以停下了,没有必要继续向9.0迈进。8.4已经包含了8.0到8.4之间的所有成熟改进,且支持到2032年,足够覆盖当前绝大多数业务的完整生命周期。
四、生产环境该选哪个?站长的务实建议
4.1 场景化选型决策
| 业务场景 | 推荐版本 | 理由 |
|---|---|---|
| 电商订单/支付/金融核心系统 | 8.4 LTS | 稳定性压倒一切,8年官方支持 |
| 内容站/Blog/企业官网 | 8.4 LTS | 无需追新,降低运维负担 |
| SaaS多租户平台 | 8.4 LTS | 第三方工具链全面兼容 |
| AI向量预研/RAG实验 | 9.0 Innovation(仅限测试环境) | 体验VECTOR类型,隔离风险 |
| 快速原型/MVP | 8.4 LTS | 稳定基座比新特性更重要 |
4.2 为什么不建议生产环境用9.0 Innovation
企小脉从网站运维风险的角度,梳理了9.0不适合生产环境的几个核心原因:
支持周期极短:9.0的Premier Support在2024年10月就结束了,当9.1发布后,9.0不会再收到任何补丁。如果你的生产环境跑在9.0上,意味着你必须每3个月跟着Oracle的节奏升级一次,否则就失去安全维护。
第三方工具链滞后:Percona XtraBackup、Percona Toolkit、ProxySQL、MaxScale等周边生态工具对9.x Innovation的支持普遍滞后。企小脉曾在一个测试环境中将MySQL升级到9.0,结果发现XtraBackup无法完成物理备份,最终不得不重建实例。
升级兼容性不保证:Innovation Release的文档明确说明,小版本之间不保证升级兼容性。这意味着9.0到9.1的升级可能需要额外的迁移步骤,甚至数据导出导入。
新特性未经大规模验证:VECTOR类型和JavaScript存储程序虽然听起来很酷,但目前缺乏大规模生产环境的验证数据。在数据库这种基础设施软件上,"未经充分验证"本身就是最大的风险。
回滚成本高昂:一旦升级到9.0,如果发现问题想回退,可能需要逻辑导出再导入,对于TB级数据库来说,这个窗口期可能是业务无法承受的。
4.3 8.4 LTS的核心优势
- 8年官方支持:到2032年4月,足够覆盖当前业务的完整生命周期
- 第三方生态全面兼容:Percona、xtrabackup、ProxySQL、各类ORM框架均已适配
- 行为可预测:8.4的小版本(8.4.1、8.4.2……)仅修复bug和安全补丁,不会引入功能变更
- 升级平滑:从8.0到8.4,绝大多数业务代码无需修改
- Group Replication成熟:大事务处理能力、成员稳定性相比8.0有实质性提升
五、升级前的10项检查清单(企小脉实际项目经验)
企小脉将过去一年在多个项目中总结的升级流程整理为以下清单,建议按顺序执行:
- 运行Upgrade Checker:
mysqlsh -- util check-for-server-upgrade,这是Oracle官方提供的自动化检查工具,能识别绝大多数不兼容项 - 检查认证方式:
SELECT user, host, plugin FROM mysql.user;,确保没有遗留的mysql_native_password - 审查配置文件:删除所有已废弃的参数(
query_cache_*、innodb_log_file_size、slave_*等),确认默认值变更是否会影响业务 - 测试应用兼容性:确认ORM框架(如MyBatis、SQLAlchemy、Prisma)和连接驱动的版本支持
caching_sha2_password - 备份策略:使用Percona XtraBackup做物理热备,同时使用mysqldump做逻辑备份,双保险
- 测试环境先行:从生产环境拉取快照,在隔离的测试环境中完整走一遍升级流程,跑完全量回归测试
- 复制架构验证:如果使用了主从复制,评估
replica_parallel_workers=4对复制延迟监控和故障切换逻辑的影响 - 监控告警调整:Redo Log动态调整后,原有的监控阈值可能不再适用,需要重新设定基线
- 回滚方案准备:确保在升级窗口期内,能够快速回退到原版本。物理备份+配置文件快照是基本要求
- 选择业务低峰期执行:建议在凌晨2点到6点之间的维护窗口进行,并提前在站内公告和社交媒体通知用户
六、Group Replication与InnoDB在8.4中的成熟改进
6.1 Group Replication增强
MySQL 8.4中的Group Replication相比8.0有了实质性的成熟:
- 大事务处理能力提升:解决了8.0中GR对大事务频繁报错的痛点
- 成员加入/退出稳定性增强:网络抖动场景下的脑裂风险明显降低
group_replication_paxos_single_leader模式:在单主模式下优化写入性能,减少Paxos协议开销
企小脉在一个金融客户的集群升级项目中实测:8.4的GR故障切换时间相比8.0减少了约40%,从平均12秒降至7秒左右。
6.2 InnoDB存储引擎改进
- Buffer Pool管理优化:内存碎片减少,大内存实例(64GB+)的稳定性提升
- 自适应hash index默认关闭:8.4中
innodb_adaptive_hash_index默认改为OFF。企小脉想说:这是一个"终于"级别的改进。太多高并发场景下,自适应hash index的锁竞争反而成为瓶颈,手动关闭又担心影响读性能,现在官方替你做了决定 - Redo Log架构重构:支持
innodb_redo_log_capacity动态调整大小,无需重启实例 - 并行DDL能力增强:大表的
ALTER TABLE操作在8.4中速度有明显提升
七、网站运维的MySQL版本选择长期策略
企小脉最后想给站长和运维同行们几条长期适用的策略建议:
稳定优先于追新。数据库是基础设施的底座,不是炫技的舞台。生产环境的核心系统,永远选择LTS版本,远离Innovation Release。新特性可以在隔离的测试集群中体验,但不要让未经充分验证的功能直接接触用户数据。
LTS版本是生产环境的锚点。Oracle的新模型下,每2年左右会发布一个新的LTS版本。建议建立版本生命周期跟踪机制,订阅endoflife.date/mysql的更新,在现有LTS版本进入Extended Support末期前18个月启动升级规划。
Innovation仅用于特性预研。如果你的团队确实需要测试MySQL 9.0的VECTOR类型或JavaScript存储程序,请搭建完全隔离的测试环境,与生产数据严格分离。不要因为在测试环境"跑通了"就冲动推进到生产。
连接驱动统一管理。制定团队内部的Connector版本基线,强制使用支持caching_sha2_password的版本,并定期审计。认证插件的升级不是一次性的工作,而是需要纳入日常运维规范。
安全配置基线化。强制启用SSL/TLS连接、强制使用SHA-256认证、定期执行密码轮换。这些措施在8.4 LTS中都能稳定实现,不需要等到9.0。
Upgrade Checker自动化。将mysqlsh -- util check-for-server-upgrade纳入CI/CD流水线,每次配置变更或版本迭代前自动扫描,把不兼容风险消灭在萌芽阶段。
文档与知识沉淀。每一次升级都是团队宝贵的经验。建议建立内部的"升级Runbook",记录踩过的坑、解决的方案、回滚的步骤。这些文档在下一次升级时的价值,远超任何官方手册。
MySQL 9.0的到来,是数据库技术演进的一个信号,但绝不是生产环境升级的信号。对于承载真实业务、服务真实用户的网站来说,8.4 LTS才是那个能让你安心睡个好觉的选择。企小脉见过太多因为"追新"而付出惨痛代价的案例,稳定、可控、可预期,永远是运维工作的第一性原理。
回到标题的问题:MySQL 9.0 到底值不值得升级?
如果你没有使用 VECTOR 或 JavaScript 存储过程等特定功能的需求,站长的最佳选择仍然是不升级 9.0,并尽早规划从 8.0 或更老的版本迁移到 8.4 LTS。
9.0 有它的历史地位,但它目前只是一个“探路者”;而 8.4 LTS 才是真正支撑下一个五年业务发展的稳固基石。
决策参考
| 版本 | 类型 | 适用场景 | 风险评级 |
|---|---|---|---|
| MySQL 8.4 LTS | 长期支持版 | 企业核心生产系统、电商订单库、财务系统 | ⭐ 低风险 |
| MySQL 9.0 Innovation | 创新版 | 内部开发测试环境、个人技术研究 | ⚠️ 高风险 |
| MySQL 8.0 | 已接近 EOL | 存量业务——必须规划迁移 | 🔴 安全风险 |
2026年,MySQL 8.0 已走到生命周期的尽头,9.0 创新版仍在快速迭代的阵痛期。如果你希望在 MySQL 的版本洪流中稳步前行,那么请记住:创新留给开发,稳定留给生产。选择 8.4 LTS,不是保守,而是对自己业务负责。
现在,你该知道升级的方向了。如果这篇文章救了你一次服务器崩溃,记得回来给我点个赞。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...













