MySQL 9.7 LTS 正式发布:该认真规划升级了

2026-06-10 24 预计阅读时间: 1 分钟
来源: blogs.oracle.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

MySQL 9.7 LTS(Long-Term Support)已经正式落地,标志着 9.7.x 系列成为新的长期支持分支。对于还在跑 5.7、8.0 甚至更早版本的生产环境来说,这不仅是版本号的更新,更是重新审视数据库基础设施支撑能力的一个节点——5.7 已经停止官方支持,8.0 的创新版也在快速迭代中,LTS 线的存在给了生产系统一个稳定锚点。

LTS 到底意味着什么

Oracle 对 MySQL 的发布模型做了调整:创新版(Innovation Release)每季度迭代,快速引入新特性;LTS 版则从某个创新版中选出,进入长期维护周期,只接收安全补丁和关键修复,不再加新功能。9.7 就是当前这一轮选定的 LTS。

这对生产环境的决策直接影响:

  • 创新版适合尝鲜和开发环境,你能拿到最新特性(比如 9.x 系列的向量搜索、JSON 增强),但每季度都有行为变更的风险。
  • LTS 适合生产部署,行为稳定,补丁周期可预期,运维团队不用每季度跟进兼容性变化。

如果你今天的生产库还在 8.0.x 的某个创新版上,9.7 LTS 提供了一个明确的目标版本——不是追最新,而是追最稳。

从 5.7 或 8.0 升级前必须确认的事

升级不是 mysqldump → restore 就完事的,尤其是跨大版本。几个关键检查点:

1. 字符集和排序规则

MySQL 8.0 起默认字符集从 latin1 变为 utf8mb4,9.x 继续强化这一方向。如果你的 5.7 库用了 latin1 或 utf8(3字节伪 UTF8),迁移后索引长度可能超限——utf8mb4 的索引键长度计算不同,原来能建的索引现在可能报错。

-- 在 5.7 上检查当前字符集分布
SELECT TABLE_SCHEMA, TABLE_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE CHARACTER_SET_NAME NOT IN ('utf8mb4', 'binary')
ORDER BY TABLE_SCHEMA, TABLE_NAME;

-- 检查是否有超过 191 字符的 VARCHAR 上建了索引(utf8mb4 下会超 767 字节 InnoDB 限制)
SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, COLUMN_NAME, SUB_PART
FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_NAME != 'PRIMARY'
  AND SUB_PART IS NOT NULL
  AND SUB_PART > 191;

2. 保留字和 SQL 行为变更

每个大版本都会新增保留字。8.0 加了 RANKGROUPS 等,9.x 又有新增。如果你的表名、列名撞了保留字,升级后直接报语法错误。用反引号包裹是防御手段,但更好的做法是提前排查并重命名。

-- 扫描可能撞保留字的列名(9.x 新增保留字举例)
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('groups', 'rank', 'row_number', 'cube', 'lateral')
  AND TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');

3. 认证插件变更

8.0 默认认证从 mysql_native_password 改为 caching_sha2_password,9.x 继续沿用。老客户端驱动(比如某些版本的 PHP mysqli、旧版 Connector/J)连不上。升级前确认应用驱动版本,或者在过渡期临时设置:

-- 为特定用户保留旧认证方式(过渡期用,不建议长期保留)
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';

实操:原地升级到 9.7 LTS 的最小路径

MySQL 8.0 → 9.7 支持原地升级(in-place upgrade),不需要导出再导入。5.7 → 9.7 则必须先升到 8.0 中间版本。以下是 8.0 原地升级到 9.7 的核心步骤:

# 1. 在当前 8.0 上做完整备份(别跳这步)
mysqldump --single-transaction --routines --triggers --all-databases \
  --set-gtid-purged=OFF > /tmp/full_backup_8_0.sql

# 2. 检查当前版本是否满足原地升级前提
mysql -u root -p -e "SELECT VERSION();"
# 确认是 8.0.40+ 或更高(8.0 的最后几个版本才支持直接升到 9.x)

# 3. 执行升级前检查(MySQL 8.0.16+ 提供的内置工具)
mysql -u root -p -e "CHECK TABLE mysql.user FOR UPGRADE;"
# 更全面的检查:
mysqlcheck -u root -p --check-upgrade --all-databases --process-views

# 4. 停止 MySQL 8.0
systemctl stop mysqld

# 5. 替换为 MySQL 9.7 包(以 yum/dnf 为例)
# 先移除旧包(数据目录不动),再安装新包
dnf remove mysql-community-server mysql-community-client
dnf install mysql-community-server-9.7.* mysql-community-client-9.7.*

# 6. 启动 9.7,MySQL 会自动执行数据字典升级
systemctl start mysqld

# 7. 查看升级日志确认无错误
grep -i "upgrade" /var/log/mysqld.log | tail -20

# 8. 手动执行 mysql_upgrade(9.x 中大部分升级已自动完成,但建议显式跑一次)
mysql_upgrade -u root -p

# 9. 验证版本和关键表结构
mysql -u root -p -e "SELECT VERSION(); SHOW TABLES FROM mysql;"

关键提醒:原地升级前必须确保数据目录 datadir 不被删除,只替换软件包。如果用 Docker 部署,挂载的数据卷同理——换镜像标签,不换卷。

Docker 环境下的快速验证

不想在物理机上直接冒险,可以先用 Docker 跑一个 9.7 实例做兼容性验证:

# 启动 MySQL 9.7 LTS 容器
docker run -d \
  --name mysql97-test \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD=test_root_pw \
  -e MYSQL_DATABASE=app_db \
  mysql:9.7-lts

# 等待容器就绪
docker exec mysql97-test mysql -uroot -ptest_root_pw -e "SELECT VERSION();"

# 把 8.0 的备份导入测试
cat /tmp/full_backup_8_0.sql | docker exec -i mysql97-test \
  mysql -uroot -ptest_root_pw

# 检查导入后有无警告或错误
docker exec mysql97-test mysql -uroot -ptest_root_pw -e \
  "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='app_db';"

这样你可以在隔离环境里跑应用的实际查询,观察有没有保留字冲突、字符集问题、行为差异,再决定生产升级方案。

升级决策清单

在排期之前,过一遍这个清单:

检查项 怎么查 不通过的后果
应用驱动版本兼容 caching_sha2_password 查驱动 release notes 连不上库
表名/列名撞 9.x 新保留字 INFORMATION_SCHEMA.COLUMNS 扫描 SQL 报语法错误
utf8 → utf8mb4 索引长度 检查 VARCHAR(>191) 上的索引 索引创建失败
存储过程/触发器语法兼容 导入测试库后逐个调用 运行时错误
复制拓扑版本一致性 确认主从升级顺序 复制中断
GTID 状态 SHOW MASTER STATUS 升级后复制配置需重建

复制拓扑升级顺序:先升从库,验证复制正常,再逐个升其余从库,最后升主库。不要主从混着升。

稳定锚点的价值

9.7 LTS 的意义不只是"新版本可用"。它给了一个明确的承诺:这个分支会在较长时间内只做安全修复和关键 bug 修复,行为不漂移。对于运维团队来说,这意味着打补丁的节奏可控,不用每季度评估兼容性;对于架构决策来说,这意味着选 MySQL 不再是"追创新版还是停在旧版"的两难——LTS 线给了第三条路:当前、稳定、长期可维护。

如果你的生产库还在 5.7 上裸奔(已经没有官方安全补丁了),或者卡在 8.0 的某个早期创新版,9.7 LTS 是一个值得排进本季度计划的升级目标。先用 Docker 验证兼容性,再按从库→主库的顺序灰度推进,风险可控,收益明确。


相关推荐