MySQL 8.4 变化概览

MySQL 8.0 由于在 2026 年 4 月停止维护, 这导致一些云厂商的 MySQL 服务可能面临强制升级的风险, 比如 aws 的声明 MySQL-VersionMgmt:

备注: aws 的 Extended Support 是额外收费的服务, 并非免费.

MySQL major version Community end of life RDS end of standard support date RDS end of Extended Support date
MySQL 8.4 April 2029 31 July 2029 31 July 2032
MySQL 8.0 April 2026 31 July 2026 31 July 2029
MySQL 5.7+ October 2023 29 February 2024 28 February 2027

鉴于此原因, 本文汇总了 MySQL 8.0 到 MySQL 8.4 之间的主要变化. 而 MySQL 5.7 到 MySQL 8.0 的变化可以参考之前的文章 MySQL 8.0 特性概览.

权限变化

在 MySQL 8.4 中, 已经默认禁止了 mysql_native_password 认证插件, 如果业务需要, 可以显示的指定选项:

mysql_native_password=ON

另外, 旧版本的 SET_USER_ID 权限允许用户对 procedure/trigger/events 指定 DEFINER 用户, 在 8.4 中被拆分为以下两个权限:

SET_ANY_DEFINER
ALLOW_NONEXISTENT_DEFINER

数据类型

自增列(AUTO_INCREMENT) 使用 FLOAT 或 DOUBLE 类型会直接报错.

外键变化

8.0 中外键仅允许关联父表的索引(没有唯一性要求), 但在 8.4 中, 除了仅关联父表的索引, 还必须唯一. 不过唯一性可以由变量 restrict_fk_on_non_standard_key 控制.

InnoDB 变化

主要参数和选项变化

参数及选项 说明
innodb_buffer_pool_in_core_file 默认改为了 OFF, 避免 buffer pool 过大时, 产生特别大的 core 文件.
innodb_adaptive_hash_index 默认改为 OFF. 因为该特性并非适用于所有场景, 可以按需开启.
innodb_doublewrite_pages 默认改为 128, 可以是 1 ~ 512 之间的值. 旧版默认值依赖 innodb_write_io_threads 变量.
innodb_flush_method 默认改为 O_DIRECT(如果系统支持), 以前为 fsync.
innodb_io_capacity 默认值从 200 改到了 10000. 更适配现代化的 SSD/RAID 硬件.
innodb_log_buffer_size buffer size 从默认的 16M 改为了 64M, 用来降低频繁写操作带来的性能影响.
innodb_purge_threads 默认值改为了自适应系统的逻辑 CPU核数, 核数小于 16 的时候为 1, 否则为 4
innodb_change_buffering 默认值从 all 改为了 none.
innodb_numa_interleave 默认值改为了 ON.
innodb_page_cleaners 默认值从 4 改为等于 innodb_buffer_pool_instances.
innodb_read_io_threads 默认值从 4 改为可用核数的一半, 最小值为 4.
source_retry_count 默认值从 60 改到了 10, 减少 failover 或重连时的等待时间.
temptable_max_ram 默认值从 1GB 改到了系统内容的 3%(需在 1GB ~ 4GB 之间), 最大范围可以设置为 2097152 ~ 2^64 -1
master_info_repository 已移除
relay_log_info_repository 已移除
default_authentication_plugin 已移除
expire_logs_days 已移除

主从变化

8.4 中主从的关键字和语法有了变化:

MASTER/SLAVE SOURCE/REPLICA
CHANGE MASTER TO CHANGE REPLICATION SOURCE TO
RESET MASTER RESET BINARY LOGS AND GTIDS
SHOW MASTER STATUS SHOW BINARY LOG STATUS
PURGE MASTER LOGS PURGE BINARY LOGS
SHOW MASTER LOGS SHOW BINARY LOGS
START SLAVE START REPLICA
STOP SLAVE STOP REPLICA
SHOW SLAVE STATUS SHOW REPLICA STATUS
SHOW SLAVE HOSTS SHOW REPLICAS
RESET SLAVE RESET REPLICA
MASTER_AUTO_POSITION SOURCE_AUTO_POSITION
MASTER_HOST SOURCE_HOST
MASTER_PORT SOURCE_PORT
MASTER_USER SOURCE_USER
MASTER_CONNECT_RETRY SOURCE_CONNECT_RETRY
MASTER_RETRY_COUNT SOURCE_RETRY_COUNT
MASTER_LOG_FILE SOURCE_LOG_FILE
MASTER_LOG_POS SOURCE_LOG_POS

主从相关的系统状态变量也有了变化:

Com_slave_start Com_replica_start
Com_slave_stop Com_replica_stop
Com_show_slave_status Com_show_replica_status
Com_show_slave_hosts Com_show_replicas
Com_show_master_status Com_show_binary_log_status
Com_change_master Com_change_replication_source

但是 slave 的权限依旧是:

REPLICATION SALVE
REPLICATION CLIENT

开启 GTID 的选项依旧是:

gtid_mode=ON
enforce-gtid-consistency=ON

CHANGE 语句有了变化, 如下所示:

mysql> CHANGE REPLICATION SOURCE TO
    ->     SOURCE_HOST='source_host_name',
    ->     SOURCE_USER='replication_user_name',
    ->     SOURCE_PASSWORD='replication_password',
    ->     GET_SOURCE_PUBLIC_KEY=1,  -- 如果 master 中的 repl 用户是 caching_sha2_password 验证, 可以设置此选项, 允许获取 source 的 RSA 公钥.
    ->     SOURCE_LOG_FILE='recorded_log_file_name',
    ->     SOURCE_LOG_POS=recorded_log_position;
    
mysql> CHANGE REPLICATION SOURCE TO
     >     SOURCE_HOST = host,
     >     SOURCE_PORT = port,
     >     SOURCE_USER = user,
     >     SOURCE_PASSWORD = password,
     >     GET_SOURCE_PUBLIC_KEY=1,  -- 如果 master 中的 repl 用户是 caching_sha2_password 验证, 可以设置此选项, 允许获取 source 的 RSA 公钥.
     >     SOURCE_AUTO_POSITION = 1;

维护语句也变更为:

STOP REPLICA;
START REPLICA;
SHOW REPLICA STATUS;'

高可用及切换

由于主从语句有变化, 常用的主从管理工具(mha4mysql-managerorchestrator) 已不再维护, 需要自行按需定制修改.

mysqldump 备份

8.4 版本 mysqldump 新增选项 --output-as-version , 在备份 8.4 版本数据库时, 可以生成与旧版本(BEFORE_8_0_23 或 BEFORE_8_2_0)兼容的 SQL 文件. 另外以下几个选项也值得注意:

master-data source-data
dump-slave dump-replica
apply-slave-statements apply-replica-statements

协议交互

直接 telnet 8.4 版本, 可以看到返回的是 caching_sha2_password 认证的头信息,

# telnet 10.1.1.34 3396
Trying 10.1.1.34...
Connected to 10.1.1.34.
Escape character is '^]'.
K
8.4.5-5O-@
        IXy-BOy23F
aching_sha2_password^]
telnet> quit

备注: 8.0 中, 如果没有修改 default_authentication_plugin, telnet 也会是同样的消息.

这种模式下, 如果连接的用户使用的是 mysql_native_password 验证, 会再进行协商选择. 比起以前的方式, connection 阶段会多一些交互. 更多见: mysql-8.4-connection_phase.

多出的这些交互可能会引起一些低版本(支持 <= 8.0 版本 mysql)的库解析协议数据出错, 比如:

 // 解析的数据中 sequence id 对应不上
 2025/08/22 11:59:10 creata.table.error[pkt.read.seq[3]!=pkt.actual.seq[1] (errno 1835) (sqlstate HY000)]
 panic: creata.table.error[pkt.read.seq[3]!=pkt.actual.seq[1] (errno 1835) (sqlstate HY000)]

对应的 MySQL 则返回错误: Got packets out of order. 这种情况下只能通过更新 lib 库来解决.

另外 8.0 版本由于可以直接设置 default_authentication_plugin = mysql_native_password, 这种情况下 connection 阶段没有多余的交互, 低版本的 lib 库不会出错.

其它变化

AHU 功能

8.4 支持 Automatic Histogram Updates(ANALYZE TABLE AUTO UPDATE), 可以自动让统计的状态保持最新, 有利于查询优化.

GTID Tags

允许标记事务组, 用来提升 replication 中的跟踪和审计.

FLUSH_PRIVILEGES 权限

新增 FLUSH_PRIVILEGES 权限, 允许执行对应 FLUSH PRIVILEGES 语句的权限.

FLUSH HOSTS 变化

8.4 中变更为语句 TRUNCATE TABLE performance_schema.host_cache.

Keyring 迁移

8.4 支持将 Keyring 组件迁移到插件中. 更多见: Keyring Components Versus Keyring Plugins.

Performance Schema 变化

1. 表 INFORMATION_SCHEMA.PROCESSLIST

在 8.0.35, 8.2.0 版本已废弃, 未来的版本可能删掉. 8.4 版本则两个系统状态变量来表示 processlist 表的访问状态:

状态变量 说明
Deprecated_use_i_s_processlist_count provides a count of the number of references to the PROCESSLIST table in queries since the server was last started.
Deprecated_use_i_s_processlist_last_timestamp stores the time the PROCESSLIST table was last accessed. This is a timestamp value (number of microseconds since the Unix Epoch

更多见 8.4-processlist-table.

2. 表 INFORMATION_SCHEMA.TABLESPACES

在 8.0.22 中已经废弃, 在 8.4 版本中已经移除.

更多启动/关闭相关的日志消息

8.4 在服务初始化, Innodb 初始化, 崩溃恢复, 插件安装卸载等方面增加了更多的日志消息.

参考

更多见:

What Is New in MySQL 8.4 since MySQL 8.0
What’s New in MySQL 8.4 LTS: Key Enhancements Explained