MySQL 8.0 由于在 2026 年 4 月停止维护(8.0.46 ), 这导致一些云厂商的 MySQL 服务可能面临强制升级的风险,同样本地部署使用MySQL,的同样应该考虑后续的升级计划,因为和oracle DB一样进入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 |
LTS/Bugfix 版本
LTS/Bugfix 轨道上的每个 MySQL 版本在其 GA 日期后大约一年被弃用,并在弃用日期后大约三个月停止提供。
创新版本创新方案中的每个 MySQL 版本均按以下规则弃用:
- 2025 年 11 月之前发布的版本:在正式发布日期后约三个月被弃用,并在弃用日期后约三个月停止提供。
- 2025 年 11 月或之后发布的版本:在正式发布日期后约五个月弃用,并在弃用日期后约一个月停止提供。
更多参考 https://docs.oracle.com/en-us/iaas/mysql-database/doc/mysql-server-versions.html
下面记录MySQL 8.0 到 MySQL 8.4 之间的主要变化
权限变化
从 MySQL 8.4.0 开始,已弃用的身份 mysql_native_password验证插件不再默认启用。要启用它,请使用 `–enable-password-plugin` 命令启动服务器 --mysql-native-password=ON (MySQL 8.4.0 新增),或者 mysql_native_password=ON在 [mysqld]MySQL 配置文件的 `configure` 部分中添加相应的配置(MySQL 8.4.0 新增)。, 如果业务需要, 可以显示的指定选项:
mysql_native_password=ON
新增了SET_ANY_DEFINER 定义对象创建权限和 ALLOW_NONEXISTENT_DEFINER 孤立对象保护权限。这些权限与已弃用的权限共存 SET_USER_ID。SET_USER_ID 权限。 该SET_USER_ID权限已在 MySQL 8.2.0 中弃用并移除。 GRANT现在在语句中使用该权限会导致语法错误。
数据类型
在 MySQL 8.0 中, 已弃用AUTO_INCREMENT在FLOAT和 语句DOUBLE中 使用修饰符的列;在 MySQL 8.4 中,完全移除了对它的支持,自增列(AUTO_INCREMENT) 使用 FLOAT 或 DOUBLE 类型会直接报错.
分区
在 MySQL 8.0 中,分区表的分区键允许使用带有索引前缀的列,并且在创建、修改或升级分区表时会发出警告,除此之外不会产生其他影响。现在,分区表中不再允许使用此类列,在分区键中使用任何此类列都会导致执行 ` CREATE TABLEOR` ALTER TABLE语句时被拒绝并报错。
外键变化
8.0 中外键仅允许关联父表的索引(没有唯一性要求), 但在 8.4 中, 除了仅关联父表的索引, 还必须唯一. 不过唯一性可以由变量 restrict_fk_on_non_standard_key 控制.
命令行
EXPLAIN FOR SCHEMA。 FOR SCHEMA语句中 添加了一个选项EXPLAIN。语法如下所示,其中 stmt是一个可解释的语句:
EXPLAIN [options] FOR SCHEMA schema_name stmt
这将使其stmt像在指定的模式中一样运行。
FOR DATABASE也可作为同义词使用。
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 | 已移除 |
| innodb_large_prefix | 已移除, 8.0 也已移除. ROW_FORMAT 为 DYNAMIC/COMPRESSED 时最大为 3072 字节, 为 REDUNDANT/COMPACT 时, 最大为 767 字节. |
主从复制变化
MySQL 8.4 不再支持早期 MySQL 版本中已弃用的 MySQL 复制中使用的一些 SQL 语句。尝试使用这些语句将导致语法错误。
| 旧 | 新 |
|---|---|
| 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 |
mysqldump 备份
8.4 版本 --output-as-version 为mysqldump添加了此选项。此选项允许您从 MySQL 8.2 或更高版本的服务器创建与旧版本 MySQL 兼容的转储;其值(此处列出的值之一)决定了转储中使用的复制术语的兼容性:
SERVER获取服务器版本,并使用与该 MySQL 版本兼容的最新复制语句和变量名称。BEFORE_8_2_0输出结果与运行 8.0.23 至 8.1.0 版本的 MySQL 服务器兼容。BEFORE_8_0_23:输出与运行 8.0.23 之前版本的 MySQL 服务器兼容。
另外以下几个选项也值得注意:
| 旧 | 新 |
|---|---|
| master-data | source-data |
| dump-slave | dump-replica |
| apply-slave-statements | apply-replica-statements |
其它变化
8.4 支持 Automatic Histogram Updates(ANALYZE TABLE AUTO UPDATE), 可以自动让统计的状态保持最新, 有利于查询优化.
允许标记事务组, 用来提升 replication 中的跟踪和审计.
新增 FLUSH_PRIVILEGES 权限, 允许执行对应 FLUSH PRIVILEGES 语句的权限.
FLUSH HOSTS 8.4 中变更为语句 TRUNCATE TABLE performance_schema.host_cache.
INFORMATION_SCHEMA.TABLESPACES 在 8.0.22 中已经废弃, 在 8.4 版本中已经移除.
从 8.0.22 开始, unix_timestamp 的结果会根据参数中的表达式字面值来判断, 明显位字符串的返回预期的值, 否则将表达式结果当做 DECIMAL 类型处理, 最终返回包含 6 位小数的结果.
References