评估 MySQL 9.7 LTS:别只看新特性,更要验证升级路径

2026-07-15 27 预计阅读时间: 1 分钟
来源: percona.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.

预计阅读时间:8 分钟

MySQL 9.7 被定位为长期支持(LTS)版本。来源摘要强调,这一版本涉及多个技术领域,并在 MySQL 8.0 结束生命周期之后,将稳定性作为重要目标。不过,摘要没有给出完整的特性清单、默认参数变化或兼容性矩阵,因此工程团队不应仅凭版本标签制定升级计划,而要把候选版本放进真实工作负载中验证。

LTS 的价值不只是“支持时间更长”

数据库 LTS 版本通常更适合作为生产环境的长期基线,因为团队可以围绕固定的大版本维护备份、监控、故障恢复和容量规划流程。真正影响升级收益的,往往不是某一个 SQL 功能,而是整个运行体系能否稳定衔接。

评估 MySQL 9.7 时,建议把问题拆成四组:

  • 兼容性:现有表结构、字符集、排序规则、SQL Mode 和认证插件是否仍然适用。
  • 可运维性:备份工具、监控采集器、代理、中间件和复制拓扑是否支持目标版本。
  • 性能稳定性:执行计划、统计信息、临时表和内存消耗是否出现明显变化。
  • 生命周期:从 MySQL 8.0 迁移时是否允许直接升级,还是必须经过中间版本或逻辑迁移。

这里尤其要避免一个误区:LTS 表示维护策略偏向长期稳定,并不等于应用升级后天然没有回归。数据库默认值、优化器决策和驱动行为的细微变化,都可能放大为生产故障。

先建立版本与配置基线

在测试具体特性之前,应先采集当前 MySQL 8.0 实例的版本、配置和对象规模。下面的命令可以直接运行;执行前将连接参数改为只读巡检账号。命令不会修改数据库。

export MYSQL_HOST="127.0.0.1"
export MYSQL_PORT="3306"
export MYSQL_USER="audit_user"
export MYSQL_PWD="replace-with-password"

mysql \
  --host="$MYSQL_HOST" \
  --port="$MYSQL_PORT" \
  --user="$MYSQL_USER" \
  --batch --raw <<'SQL'
SELECT VERSION() AS mysql_version;
SELECT @@version_comment AS distribution;
SELECT @@sql_mode AS sql_mode;
SELECT @@character_set_server AS server_charset;
SELECT @@collation_server AS server_collation;

SELECT ENGINE, COUNT(*) AS table_count
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
GROUP BY ENGINE
ORDER BY table_count DESC;

SELECT TABLE_SCHEMA, COUNT(*) AS table_count,
       ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
GROUP BY TABLE_SCHEMA
ORDER BY size_mb DESC;
SQL

对 MySQL 8.0 和 MySQL 9.7 候选环境分别执行该脚本,并保存输出。重点检查 sql_mode、默认字符集、排序规则和存储引擎,而不是只比较版本号。

还应使用目标版本官方提供的升级检查能力验证元数据兼容性。具体命令取决于最终发行包和工具版本,不能仅根据摘要假设参数保持不变;执行前需要核对 MySQL Shell 或对应升级工具的 9.7 文档。

用真实查询检查执行计划

新版本的实际价值必须落到业务 SQL 上。可以从慢查询日志、APM 或 Performance Schema 中选择高频、高延迟和高扫描量查询,组成一套固定回归集。

以下示例创建了一个最小测试表,可用于比较两个实例上的索引选择和执行计划。它是通用验证方法,不代表 MySQL 9.7 引入了某个特定优化器特性。

CREATE DATABASE IF NOT EXISTS upgrade_lab;
USE upgrade_lab;

DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    customer_id BIGINT UNSIGNED NOT NULL,
    status VARCHAR(20) NOT NULL,
    created_at DATETIME NOT NULL,
    amount DECIMAL(12, 2) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_customer_created (customer_id, created_at),
    KEY idx_status_created (status, created_at)
) ENGINE=InnoDB;

INSERT INTO orders (customer_id, status, created_at, amount) VALUES
(1001, 'paid',    '2025-01-03 10:00:00', 128.50),
(1001, 'shipped', '2025-01-04 11:30:00', 128.50),
(1002, 'pending', '2025-01-05 09:20:00',  89.00),
(1001, 'paid',    '2025-02-01 16:40:00', 320.00);

EXPLAIN FORMAT=JSON
SELECT id, status, created_at, amount
FROM orders
WHERE customer_id = 1001
  AND created_at >= '2025-01-01'
ORDER BY created_at DESC
LIMIT 20;

生产验证时不要只比较耗时。还要记录访问类型、候选索引、实际使用索引、估算行数以及临时表和排序行为。如果目标版本支持并允许在测试环境执行 EXPLAIN ANALYZE,可以进一步比较估算行数与实际行数,但不要对带副作用的语句直接使用。

把升级设计成可回退的发布

从已结束生命周期的版本迁移,会带来安全修复和生态兼容方面的时间压力,但这不构成跳过演练的理由。更稳妥的流程是先建立独立目标实例,通过备份恢复或受支持的复制方式导入数据,再运行完整回归测试。

建议至少完成这些检查:

  1. 确认官方支持的升级路径,以及是否允许从 MySQL 8.0 直接迁移到 9.7。
  2. 在脱敏生产数据上验证 DDL、存储过程、触发器、事件和分区表。
  3. 检查应用驱动、连接池、ORM、CDC、代理和备份软件的版本支持声明。
  4. 对核心查询进行冷缓存与热缓存测试,并比较 P95、P99 延迟和资源消耗。
  5. 执行一次完整恢复演练,确认备份不仅能生成,而且能在目标时间内恢复。
  6. 设计流量切换和回退方案;不要假设新版本写入的数据目录能够由旧版本直接打开。

MySQL 9.7 LTS 是否值得采用,最终取决于稳定性目标、工具链成熟度和业务验证结果。来源摘要指出它面向 MySQL 8.0 EOL 之后的长期稳定需求,但在完整发布说明、兼容性文档和实测数据齐备之前,团队应把所有具体新能力视为待验证项。先升级测试体系,再升级数据库,通常能显著降低真正的迁移风险。


相关推荐