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 加了 RANK、GROUPS 等,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 验证兼容性,再按从库→主库的顺序灰度推进,风险可控,收益明确。