MySQL 9.0来了,生产环境千万别急着升级:一个站长的8.4 LTS避坑实录

号脉1小时前更新 微小脉
2 00

文章开始前,先问一个直击灵魂的问题:你还在用 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 SupportExtended Support定位
MySQL 8.02018年4月2025年4月结束2026年4月结束过渡主力
MySQL 8.4 LTS2024年4月至2029年4月至2032年4月生产首选
MySQL 9.0 Innovation2024年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_LENGTHCHAR_LENGTHHEXLENGTHTO_BASE64)和加密函数(AES_ENCRYPTCOMPRESSSHA2
  • 仅支持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语句的WHEREHAVINGORDER 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 EVENTALTER EVENTDROP EVENT支持Prepared Statements
  • Performance Schema新增variables_metadataglobal_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+
PyMySQL1.0.0+
mysql-connector-python8.0.0+
PHP PDO MySQLPHP 7.4+

如果你的应用依赖旧版驱动,升级数据库之前必须先升级驱动,否则连不上。

3.2 废弃参数与特性正式移除

以下参数在9.0中彻底消失,如果my.cnf中还有残留,MySQL会直接拒绝启动:

旧参数(8.0及之前)新参数(8.4/9.0)说明
innodb_log_file_size + innodb_log_files_in_groupinnodb_redo_log_capacityRedo Log动态管理
slave_parallel_workersreplica_parallel_workers复制术语标准化
slave_net_timeoutreplica_net_timeout复制术语标准化
query_cache_type / query_cache_size / query_cache_limit查询缓存已移除
FLUSH HOSTSTRUNCATE TABLE performance_schema.host_cache主机缓存清理方式变更

企小脉建议:在升级前用mysqlcheck扫描配置文件,并用mysqlsh -- util check-for-server-upgrade生成完整的不兼容项报告。

3.3 默认值变更带来的隐性风险

即使你没有修改过配置文件,升级后系统行为也可能发生变化:

参数8.0默认值8.4/9.0默认值影响
binlog_transaction_dependency_trackingCOMMIT_ORDERWRITESET复制并行度提升,但可能改变事务依赖判断逻辑
replica_parallel_workers04多线程复制默认开启,复制架构行为改变
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类型,隔离风险
快速原型/MVP8.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项检查清单(企小脉实际项目经验)

企小脉将过去一年在多个项目中总结的升级流程整理为以下清单,建议按顺序执行:

  1. 运行Upgrade Checkermysqlsh -- util check-for-server-upgrade,这是Oracle官方提供的自动化检查工具,能识别绝大多数不兼容项
  2. 检查认证方式SELECT user, host, plugin FROM mysql.user;,确保没有遗留的mysql_native_password
  3. 审查配置文件:删除所有已废弃的参数(query_cache_*innodb_log_file_sizeslave_*等),确认默认值变更是否会影响业务
  4. 测试应用兼容性:确认ORM框架(如MyBatis、SQLAlchemy、Prisma)和连接驱动的版本支持caching_sha2_password
  5. 备份策略:使用Percona XtraBackup做物理热备,同时使用mysqldump做逻辑备份,双保险
  6. 测试环境先行:从生产环境拉取快照,在隔离的测试环境中完整走一遍升级流程,跑完全量回归测试
  7. 复制架构验证:如果使用了主从复制,评估replica_parallel_workers=4对复制延迟监控和故障切换逻辑的影响
  8. 监控告警调整:Redo Log动态调整后,原有的监控阈值可能不再适用,需要重新设定基线
  9. 回滚方案准备:确保在升级窗口期内,能够快速回退到原版本。物理备份+配置文件快照是基本要求
  10. 选择业务低峰期执行:建议在凌晨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,不是保守,而是对自己业务负责。

现在,你该知道升级的方向了。如果这篇文章救了你一次服务器崩溃,记得回来给我点个赞。

© 版权声明

相关文章

秒哒,0代码一句话做应用

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...