MySQL 8 正式发布


MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能,其特点如下:
1.Hash Join 不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。
2.EXPLAIN ANALYZE 将运行查询,然后生成 EXPLAIN 输出,以及有关优化程序估计如何与实际执行相匹配的其他信息。
3.创建用户时可以随机生成密码
为 CREATE USER, ALTER USER和 SET PASSWORD语句添加了语法,以生成强随机密码,并将其作为结果返回给客户端。添加的语法是:
CREATE USER user IDENTIFIED BY RANDOM PASSWORD,
ALTER USER user IDENTIFIED BY RANDOM PASSWORD,
SET PASSWORD [FOR user] TO RANDOM
4.群组复制
group_replication_exit_state_action 增加了 OFFLINE_MODE 模式,用于指定当服务器无意离开群组时群组复制的行为。
OFFLINE_MODE 行为将关闭所有连接,并禁止非 CONNECTION_ADMIN 或 SUPER 权限的用户建立新连接,否则它的行为类似于现有 READ_ONLY 模式。
5.innodb 增加一个空闲状态下控制写入 IOPs 的选项
该选项在 InnoDB 空闲时控制写 IOP。目的是减少写 IO,以延长闪存的寿命。
此外还有很多内部细节的改进,详细请访问这里。
改进审计日志:对于JSON格式的日志文件,MySQL企业审计支持使用audit_log_read()用户定义函数进行日志读取操作。之前,只有通过向audit_log_read()传递一个参数才能指定开始读取的位置,为了更加灵活现在可以命名一个以时间戳的开始说明符,以便从该时间戳或之后的第一个事件开始读取。MySQL企业版现在包含一个keyring_oci插件,它使用Oracle Cloud Infrastructure Vault作为密钥环存储的后端。密钥信息不会永久存储在MySQL服务器本地存储中。
优化器部分:
prepared语句现在只在执行PREPARE时准备一次,而不是在每次执行时准备一次。此外,存储过程里面的语句也仅在初次执行时准备一次。
filesort算法现在支持对多个表上的联接进行排序,而不仅仅是对单个表进行排序。
在MySQL 8.0.22中,服务器在内部将所有右连接实例处理为左连接,消除了一些在解析时没有执行完整转换的特殊情况。
增加了支持SELECT INTO DUMPFILE 和 SELECT INTO OUTFILE 在写入文件时定期同步。
MySQL现在为符合条件的查询实现派生条件下推,将外部where条件推入派生表。
SQL语法:支持对YEAR数据类型进行转换,支持TIMESTAMP使用UTC,并且支持通过JSON_VALUE()返回JSON值。
功能和函数方面:
使用MySQL服务器的新的异步连接故障转移机制,在从副本到源的现有连接失败后,自动建立到新源的异步(源到副本)复制连接。
通过新的变量innodb_extend_and_initialize,允许在Linux上配置InnoDB如何分配空间给每个表的文件和一般表空间。
允许在MySQL授权表上进行DML和DDL的读取操作,之前需要取得行锁,现在采取了非锁定操作。
group_replication_ip_whitelist变量降级使用,将采用新的变量group_replication_ip_allowlist名称。
START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTS 及 RESET SLAVE降级使用,使用REPLICA来替代。
ALTER DATABASE 语句支持 READ ONLY选项,控制是否允许修改数据库和其中的对象。
以上内容为 8.0.22 版本的简介,更为详尽的内容访问 Release Notes 或发行公告。
MySQL 8.0.24 现已于2021年4月中旬发布。这是一个维护版本,修复了 219 个 Bug。其中有两位中国人的贡献(Yuxiang Jiang 和 Zhai Weixiang),他们发现 Bug 并贡献了修复的补丁程序。关于修复的具体内容,请参阅发行一览。除此之外,在下面所列的功能点进行了更新:
MySQL Enterprise Audit 现在支持对审计日志进行删减。
服务器通过在关闭连接之前将原因写入连接的方法,使得客户端收到一个包含客户端超时内容的错误消息,解决了以往服务器关闭连接而客户端无法获得正确原因的问题。
客户端连接失败消息里添加了端口号信息。
MySQL Keyring 功能从插件过渡到服务器组件,包括一款社区版/企业版组件及两款企业版组件。
升级使用curl 7.74.0。
Performance Schema增加了一些新的性能指标,包括:memory/sql/dd::infrastructure,memory/sql/dd::object。并对一些已有的指标进行改进和重命名。
为认证插件增加了系统变量,允许配置caching_sha2_password插件运行哈希次数。
空间地理信息方面增加了新的函数 ST_LineInterpolatePoint()、ST_LineInterpolatePoints()、ST_PointAtDistance()和ST_Collect()。此外CAST() 和 CONVERT() 增加了对地理空间数据的支持扩展。
InnoDB的 AUTOEXTEND_SIZE最大值从64M 增至4GB。
clone_donor_timeout_after_network_failure配置的超时时间由之前的固定值5分钟扩展到最大30分钟,用以提供更多的时常去解决网络问题。
向MGR的allowlist里面增加新成员不再需要停止/再启动MGR。
使用--skip-slave-start启动从服务器不在需要登录数据库服务器的主机。
更多详情可查看官方发行说明。
注意:从 MySQL 5.7 升级到 MySQL 8.0 仅支持通过使用 in-place 方式进行升级,并且不支持从 MySQL 8.0 降级到 MySQL 5.7(或从某个 MySQL 8.0 版本降级到任意一个更早的 MySQL 8.0 版本)。唯一受支持的替代方案是在升级之前对数据进行备份。下面简要介绍 MySQL 8 中值得关注的新特性和改进。
1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。
2. NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。
3. 窗口函数(Window Functions):从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。
4. 隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
5. 降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。
6. 通用表表达式(Common Table Expressions CTE):在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。
7. UTF-8 编码:从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。
8. JSON:MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
9. 可靠性:InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。
10. 高可用性(High Availability):InnoDB 集群为您的数据库提供集成的原生 HA 解决方案。
11. 安全性:对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。
8.0 对比于 5.7 的性能提升及优化
一、其中一些方面的比较:
1.1 JSON 处理
8.0 对 JSON 数据类型的支持更加完善。可以直接在 JSON 数据中进行搜索、排序和过滤,并且支持 JSON 表达式索引,大大提高了处理 JSON 数据的效率和性能。
1.2 更好的性能和可扩展性
8.0 在性能和可扩展性方面都有很大的提升。引入了新的多线程架构,可以更好地利用多核处理器,同时也提高了并发读写的能力。此外还支持更多的存储引擎,包括 InnoDB、MyISAM、Memory、CSV、Blackhole、Archive 等等。
1.3 更丰富的数据类型
8.0 支持更丰富的数据类型,包括 YEAR(4)、GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION 等等。这些数据类型的支持可以更好地满足不同应用场景的需求。
1.4 更好的安全性
8.0 在安全性方面也有很大的提升。引入了新的密码验证插件,使用更加安全的加密算法,提高了密码的安全性。此外还支持更多的安全特性,包括增强的 SSL/TLS 支持、更加严格的密码策略、更加灵活的用户管理等等。
1.5 小结
8.0 在多方面都有很大的改进,包括 JSON 处理、性能和可扩展性、数据类型、安全性等等;这些改进使其更加适合处理大规模的数据和高并发的请求,同时也提高了数据的处理效率和安全性。
二、两者在配置上的不同之处和优化建议:
2.1 缓存配置
8.0 的默认缓存大小比 5.7 要小,因此需要根据实际情况进行调整。可以通过修改 innodb_buffer_pool_size 参数来调整缓存大小,建议将其设置为系统可用内存的 70% 到 80%。
2.2 日志配置
8.0 相比 5.7 的日志配置有所不同。8.0 引入了新的 redo log 架构,可以提高写入性能。建议将 innodb_log_file_size 参数设置为 1GB 到 2GB,同时将 innodb_log_files_in_group 参数设置为 4 到 8 个。
2.3 表空间配置
8.0 支持更大的表空间,可以更好地处理大规模数据。建议将 innodb_page_size 参数设置为 16KB、32KB 或 64KB,根据实际情况进行调整。同时,建议将 innodb_file_per_table 参数设置为 ON,以避免单个表空间过大导致性能下降的问题。
2.4 安全配置
8.0 相比 5.7 在安全性方面有所提升。建议将 default_authentication_plugin 参数设置为 caching_sha2_password,使用更加安全的加密算法。同时建议开启 SSL/TLS 加密传输,使用更加安全的数据传输方式。
2.5 备份配置
8.0 相比 5.7 在备份方面有所改进。建议使用新的备份工具 mysqlpump,可以更好地处理大规模数据的备份和恢复。
2.6 小结
对于 8.0 的配置优化建议包括:调整缓存大小、修改日志配置、调整表空间大小、加强安全配置、使用新的备份工具等等。这些优化建议可以提高其性能和安全性,同时也提高了处理大规模数据的能力。
详细更新说明
官方发行说明
MySQL 8 正式版的新增功能
Facebook 分享迁移到 MySQL 8.0 的经验
2021年7月消息,Facebook 在一篇博客中分享了该公司在某种程度上艰难的大规模跨越式迁移到 MySQL 8.0 版本的经验,此前其一直使用的是 MySQL 5.6 版本。开源的MySQL多年来为 Facebook 的一些最重要的工作负载提供支持,Facebook 方面称其每个新主要版本都需要其花费大量时间和精力来迁移工作负载。其中挑战包括有:
将其自定义功能移植到新版本
确保复制在主要版本之间兼容
最小化现有应用程序查询所需的更改
修复阻止服务器支持其工作负载的性能回归
根据透露,Facebook 上次升级到 MySQL 5.6 花了一年多的时间;而此向 MySQL 8.0 的升级也花了好几年的时间。在 5.7 版本发布的时候,Facebook 仍在开发 5.6 版上的 LSM-Tree 存储引擎 MyRocks。鉴于在构建新存储引擎的同时升级到 5.7 会显着减缓 MyRocks 的进度,因此该团队选择继续使用 5.6 直到 MyRocks 完成。而 MySQL 8.0 则刚好是在 MyRocks 完成时发布的,所以 Facebook 选择升级以改进其存储引擎。Facebook 指出,迁移到 8.0 明显比迁移到 5.6 要更困难。他们有 1700 个代码补丁要从其定制的 MySQL 5.6 分支迁移到 8.0。由于 Facebook 的 MySQL 新功能和不断添加到 5.6 代码库中的修复,使得这项工作变得非常复杂。因为从 5.6 到 8.0 的升级完全跳过了 5.7,一些在 5.6 中活跃的 API 要么被弃用、要么被完全删除;这也就意味着任何使用旧 API 的应用程序都需要更新。且 Facebook 的一些功能也与 8.0 中的类似功能不向前兼容,需要弃用和向前迁移。还有自定义代码文档参差不齐的问题。Facebook 称,它的大多数自定义代码都有良好的注释和文档。但其他的代码没有很好的文档,Facebook 需要挖掘旧的文件、帖子和代码注释来了解历史。最终,Facebook 方面评估了 2300 多个补丁并将其中的 1500 个移植到了 MySQL 8.0。“我们已将许多 InnoDB 副本集转换为完全在 8.0 上运行。其余的大多数都处于迁移路径的不同阶段。现在我们的大部分自定义功能都已移植到 8.0,更新到 Oracle 的次要版本相对容易,我们计划跟上最新版本的步伐。”
“尽管我们在迁移的道路上遇到了种种障碍,但我们已经看到了运行8.0的好处。总的来说,新版本大大扩展了我们在 MySQL @ Facebook 上所能做的事情。”
MySQL 8.0.31 现已于2022年10月中旬正式发布,一些改进内容包括:
审计插件:审计插件的日志轮换函数 audit_log_rotate (),简化了日志轮换的工作,用户无需手动更改日志名称,也无需设置 audit_log_flush = ON。
组件服务:启用了新的组件服务,支持服务器组件和要在本地服务器中查询的插件。新的 MySQL 命令服务类似于 C API 函数 libmysql。
OCI 密钥存储组件:component_keyring_oci 替代之前用于 OCI 的 Keyring 插件,用以支持在 Oracle Cloud 上进行密钥存储。
优化器改进:优化器的内部管理操作进行了一组改进,包括如下:
带括号的查询表达式可以使用 UNION 进行嵌套,例如:
(
(SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
) ORDER BY c LIMIT 1;
当使用多组括号时,仍遵循现有的语义标准,更高的外部限制不能覆盖括号内部较低的限制,例如:
(SELECT ... LIMIT 3) LIMIT 5
最多返回三行数据。
UNION DISTINCT 和 UNION ALL 可以进行任意嵌套。
SQL 语法:SQL 不再支持使用 full 和 FULL 为对象命名,如果继续使用 full 或 FULL 作为表、视图、字段、存储过程等名称,将会被警告。SQL 支持使用 INTERSECT 和 EXCEPT。
查询重写插件优化:MySQL 支持查询重写插件,这些插件可以在服务器执行之前检查并可能修改服务器接收到的 SQL 语句,之前,无论用户权限如何所有的查询都需要重写,甚至包括执行的内部系统查询。在这一版本加入了新的权限 SKIP_QUERY_REWRITE,通过新的系统变量 rewriter_enabled_for_threads_without_privilege_checks 进行控制是否忽略对某些线程执行的语句进行改写。
OpenSSL:在内置 OpenSSL 的平台上,MySQL 使用的 OpenSSL 库升级至 1.1.1q。
监视缓冲池调整容量:InnoDB 提供了两个新的状态变量 Innodb_buffer_pool_resize_status_code 和 Innodb_buffer_pool_resize_status_progress 用以监视缓冲池在线调整的过程。
并行创建索引:InnoDB 现在支持并行索引构建,改进索引构建性能。
复制过滤优化:复制开启过滤时,副本不再引发复制错误相关的权限检查和 require_row_format 验证,副本将在全部的复制过滤应用后进行检查。
监视资源组:增加了状态变量 Resource_group_supported,用以监视服务器是否支持资源组。
二进制包优化:二进制包中包含了 curl,不再链接系统的 curl 库
资源争用优化:新的系统变量 thread_pool_transaction_delay,允许在工作线程执行新的事务前指定延迟,适用于由于资源争用引发的并行事务对其他操作带来的性能影响。
调整查询线程数量:新的系统变量 thread_pool_query_threads_per_group,使得用户可以增加线程组内的查询线程数量。
新的线程池插件:MySQL Database Service 中使用的线程池插件,在 MySQL 企业版中提供。
以上内容是 8.0.31 的一个速览,更为详细的功能改进和错误修复,可访问官网。
8.1 及 8.0.34 正式发布
MySQL 8.1 及 8.0.34 现已于2023年7月下旬正式发布。至此将开启创新版和稳定版同时发行的阶段。8.1 是 MySQL 的首个创新版,该版本主要增加了如下功能:
1.捕捉 EXPLAIN FORMAT=JSON 输出, 为 EXPLAIN FORMAT=JSON 增加 INTO 选项,可以将 JSON 格式的输出保存在一个用户变量中。
2.保留客户端注释,8.1 保留 mysql 客户端的注释,如果需要使用之前的行为,需要使用 --skip-comments 选项
3.MySQL Replication 更改 SOURCE_RETRY_COUNT,CHANGE REPLICATION SOURCE TO 语句中 SOURCE_RETRY_COUNT 的默认值改为 10,这意味着,使用此选项和 SOURCE_CONNECT_RETRY (60) 的默认值,副本在重新连接尝试之间等待 60 秒,并在超时和故障转移之前以此速率尝试重新连接 10 分钟。
4.group_replication_set_as_primary () 及 DDL 语句,在选择一个新的主节点之前,group_replication_set_as_primary () 函数需要等待所有事务完成前正在进行的 DDL 语句。
5.版本特定注释中使用的 MySQL 版本号现在支持由一个或两个数字组成的主版本,这意味着整个版本现在可以是五位数或六位数长。
6.强化关闭服务器过程的日志,随着 MySQL 服务器、插件和组件的启动和关闭消息的增加,强化关闭过程的日志,附加功能应该有助于故障排除和调试问题,特别是在服务器需要很长时间才能关闭的情况下。
7.增加了 SHOW PARSE_TREE语句,该语句显示了 select 语句的 json 格式解析树。此语句仅用于测试和开发,而不是用于生产。它仅用于调试版本中
8.增加了 tls-certificates- enforsed - validation 系统变量,允许 DBA 在服务器启动时或使用 ALTER INSTANCE RELOAD TLS 语句在运行时重新加载证书时强制执行证书验证。启用强制后,发现证书无效时将在启动时停止服务器调用,防止在运行时加载无效证书,并发出警告。
9.添加了一些特定于组复制插件的状态变量,这些变量可以改进对网络不稳定的诊断和故障排除,为每个组成员提供有关网络使用情况、控制消息和数据消息的统计信息。
10.添加了服务器系统变量,用来控制使用 LDAP 可插拔身份验证连接到 MySQL 服务器的 MySQL 帐户在 LDAP 服务器关闭或无响应时必须等待的时间。对于以下简单且基于 sasl 的 LDAP 身份验证变量,新的默认超时为 30 秒,连接和响应超时只能通过 Linux 平台上的系统变量进行配置。有关更多信息,请参见设置 LDAP 可插拔身份验证的超时时间。
除了新增功能外,还做了以下调整,这部分内容基本上与 MySQL8.0.34 一致。用户管理方面,增加了一个系统变量 “validate_password.changed_characters_percentage” 用于密码验证。该变量用于配置用户在更改密码时必须修改的字符数量,数量以当前密码的字符数百分比计算。假设该变量值设为 50,则新密码中至少有一半的字符需要修改。
MySQL 审计方面,增加新的功能,在安装审计插件时,可以指定用户存储日志过滤条件的数据库。例如:
$> mysql -u root -D database_name -p < audit_log_filter_linux_install.sql
此外,MySQL 审计增加了使用调度器组件来配置和执行循环任务,刷新内存缓存的新功能。
二进制日志方面,在 libmysqlclient.so 库中增加了新的函数 mysql_binlog_open (),mysql_binlog_fetch (),及 mysql_binlog_close (),使得开发者能够访 MySQL 服务器的二进制日志。
兼容性方面,改进了 Windows 的 MSVC_CPPCHECK 支持,并检查类似的 MSVC 警告 “维护” 模式。
Windows 编译方面,改善了 WIN_DEBUG_NO_INLINE=1 的支持,使用量将超过库的 65535 个对象的限制。
此外,对 robin-hood-hashing、ICU 文件及 ZSTD 的版本等进行了升级。
由于 MySQL 提供了 mysql shell 和 mysqldump 用于备份,因此,mysqlpump 将进行降级处理,使用时将有警告提示,未来将弃用该产品。
用于复制的服务器变量 “sync_relay_log_info”、“binlog_format”,在此版本中降级处理,未来将弃用该变量。因此,与其关联的 “log_bin_trust_function_creators” 和 “log_statements_unsafe_for_binlog” 也将降级使用,最终弃用。需要注意,“binlog_format” 弃用后,MySQL 的二进制日志格式仅支持 “row-based”。
用于组复制的服务器变量 “group_replication_recovery_complete_at”,及 “mysql_native_password” 认证插件降级使用,未来将弃用。
此外,包括审计日志的传统过滤模式、mysql_ssl_rsa_setup 程序,及密钥环文件插件等也进行降级处理,未来将弃用。
用户需要注意,以往的特定与版本的注释方式 “/*!80034KEY_BLOCK_SIZE=1024*/ 或 /*!80034 KEY_BLOCK_SIZE=1024*/” 不考虑版本号后面的空格,但未来版本的该行为可能会发生变化。因此从此版本开始,请用户在版本号后面加入空格使用,SQL 语法方面,此版本支持使用 CURRENT_USER () 、SESSION_USER ()、USER (),SYSTEM_USER () 在建表语句或更改表语句中作为 Varchar 或 TEXT 类型字段的默认值。
除了上述提到的更改和弃用,MySQL 8.1 及 8.0.34 版本做了大量的错误修复,使得 8.0 进入一个稳定的状态。详细的变更内容可访问 MySQL 官网。
MySQL 8.2.0 于 2023 年 10 月 25 日发行,该版本的一些主要变化包括:
审计日志
添加了新的 “audit_log_filter_uninstall.sql” 脚本,简化删除 “MySQL Enterprise Audit” 的过程。认证 * “mysql_native_password” 插件已弃用,用户可以在服务器启动时将其禁用。如果服务器端 “mysql_native_password” 认证方法被禁用,使用该方法的旧的客户端插件将无法连接服务器,并在错误日志中写入 “Access denied” 消息。
MySQL 企业版现在支持 MySQL 服务器使用智能卡、安全设备等方法进行身份验证。该身份验证方法基于 FIDO 和 FIDO2 标准。它使用服务器端的 “authentication_webauthn” 和客户端的 “authentication_webauthn_client” 实现 C API。
客户端库现在支持使用查询预处理语句的属性,并引入一个新的 C API 声明函数 “mysql_stmt_bind_named_param ()”,用以替换现已弃用的 “mysql_stmt_bind_param ()” 函数。与 “mysql_stmt_bind_param () ” 不同,“mysql_stmt_bind_named_param ()” 允许绑定预处理语句的未命名和命名参数。
mysql_ssl_set () C API 函数已弃用,并且在未来的 MySQL 版本中删除。与其等效的函数为 “mysql_options ()” TLS 选项。
弃用和删除
兼容性的变化:“WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS ()” SQL 函数,在 MySQL 8.0 中已弃用,现已被删除。用户可以使用 “WAIT_FOR_EXECUTED_GTID_SET ()” 替代。
复制:“binlog_transaction_dependency_tracking” 服务器系统变量现已弃用,并将在 MySQL 的未来版本中删除。设置或检索该变量的值会触发警告。
“expire_logs_days” 服务器系统变量,在 MySQL 8.0 中已弃用,现已删除。用户可以使用 “binlog_expire_logs_seconds” 替代。
在 MySQL 8.0 中已弃用的服务器启动选项 “--abort-slave-event-count” 和 “--disconnect-slave-event-count”,现已删除。
服务器系统变量 “old” 和 “new” 现在已弃用,将在 MySQL 的未来版本中删除。
“--character-set-client-handshake” 服务器选项,现已弃用,并将在 MySQL 的未来版本中删除。
使用字符 “%” 和 “_” 作为通配符,对数据库进行授权功能现已弃用,未来将删除通配符功能。另外,服务器将 “%” 视为 “localhost” 的同义词,检查权限时(即授予 'myuser'@'%' 的权限也予 'myuser'@'localhost') 也从 MySQL 8.2.0 开始被弃用,未来版本删除。
“INFORMATION_SCHEMA.PROCESSLIST” 已弃用,未来版本删除。因此使用该表实现的 “SHOW PROCESSLIST” 也已弃用。推荐使用 Performance_schema。
SET_USER_ID 权限已弃用,未来版本删除。它现在已被这些新的权限替代: SET_ANY_DEFINER 用于创建定义者对象。 ALLOW_NONEXISTENT_DEFINER 用于孤立对象 保护。
“TLS_AES_128_CCM_8_SHA256” 密码套件已弃用,未来版本删除。
防火墙
MySQL Enterprise Firewall 允许其内存缓存定期重新加载防火墙中存储的数据表。以往仅在服务器启动时或服务器端插件启动时重新加载缓存。新的 “mysql_firewall_reload_interval_seconds” 系统变量可以设置用于重新加载表数据的日程表。其以往仅能在 mysql 系统数据库中存储所需的表、函数和存储过程。新的 “mysql_firewall_database” 服务器系统变量允许用户在服务器启动时,指定自定义的库。此外,新的脚本 “uninstall_firewall.sql” 简化了删除防火墙的工作。
SQL 语法
复制:此版本继续发布与 MySQL 复制相关功能中使用的术语 。MySQL 8.2 弃用了一些 SQL 语句,包括 “RESET MASTER”(使用 “RESET BINARY LOGS AND GTIDS” 代替),“SHOW MASTER STATUS”(“使用 SHOW BINARY LOG STATUS”),“SHOW MASTER LOGS”(使用 “SHOW BINARY LOGS”)和 “PURGE MASTER LOGS”(使用 “BINARY LOGS”)。
此外,“DISABLE ON SLAVE” 选项在 “CREATE EVENT” 和 “ALTER EVENT” 上已弃用。相关变更包括以下内容:
mysqldump 添加了一个选项 “--output-as-version” 定义转储中使用的术语级别对于与副本和事件相关的声明,使得创建转储成为可能与以前版本的 MySQL 兼容,仅接受现已弃用的术语。此选项的有效值为 “SERVER”、 “BEFORE_8_0_23” 和 “BEFORE_8_2_0” 。默认是 “SERVER”,这会令 “mysqldump” 获取服务器版本并输出命令与该版本兼容。
“terminology_use_previous” 服务器系统变量添加了一个新值 “BEFORE_8_2_0”。
SLAVESIDE_DISABLED 现已弃用。
Com_show_master_status 系统状态变量重新命名为 “Com_show_binary_log_status”。以前的名称已弃用,但仍支持向后兼容性。
EXPLAIN 现在支持 “FOR SCHEMA” 或 “FOR DATABASE” 选项。该选项将假设语句已经已在选项指定的数据库中运行。
添加或更改的功能
非兼容更改:升级绑定的 libfido2 v1.13.0 库。该 libfido2 版本需要 OpenSSL 1.1.1 或更高版本。
重要更改:适用于支持绑定 OpenSSL 的平台,用于 MySQL 服务器链接的 OpenSSL 库已更新至版本 3.0.10。
重要更改:添加了对 Debian 12、Fedora 39、 macOS 14 和 Ubuntu 23.10 的支持。
mysqldump:添加了 “--ignore-views” 选项以跳过 生成的转储文件中的表视图。* mysqldump:添加了 “--init-command” 和 “--init-command-add” 选项以允许连接或重新连接 MySQL 后执行 SQL 语句。
mysql:添加了 “--init-command-add” 选项,该选项添加连接或重新连接到 MySQL 服务器后要执行的附加 SQL 语句。它类似于 “--init” 命令选项。
添加了新的 “--no-login-paths” 命令行选项,禁止处理登录路径。已添加至每个具有 “--login-path” 选项的 MySQL 客户端。
以上内容是 8.2.0 版本的一个快速浏览,更多详细信息可访问 MySQL 官网。
8.3.0于2024年1月1日正式发行,该版本的一些主要变化包括:
1.企业版的数据屏蔽和脱敏功能中增加了在副本(次要成员)服务器的的内存中刷新数据的能力。可以通过 “masking_dictionaries_flush ()” 函数进行手动刷新,也可以通过调度组件使用新的变量 “componet_masking.dictionaries_flush_interval_seconds” 配置为定时刷新。
2.企业版支持使用 “component_telemetry” 组件,收集服务器 OpenTelemetry 格式的度量数据。(仅支持 Linux 平台)
3.删除 --innodb 和 --skip-innodb 服务器选项。从 MySQL 5.6 版本起,innoDB 作为默认的存储引擎,--innodb 和 --skip-innodb 服务器选项已经失去存在的意义,在此版本正式删除
4.删除 InnoDB memcached 插件。该插件在 8.0.22 中降级使用,在此版本中正式删除
5.删除 MySQL 复制中部分服务器选项和变量。这些变量在之前的版本进行了降级使用,在此版本中正式删除,包括:
--slave-rows-search-algorithms
log_bin_use_v1_events
--relay-log-info-file
--relay-log-info-repository
--master-info-file
--master-info-repository
transaction_write_set_extraction
group_replication_ip_whitelist
group_replication_primary_member
6.禁止使用非空的 “IGNORE_SERVER_IDS” 列表。从此版本起,当开启基于 GTID 进行复制时,将不再允许 “CHANGE REPLICATION SOURCE TO” 指向一个非空的 “IGNORE_SERVER_IDS” 列表,(由于 “IGNORE_SERVER_IDS” 与 GTID 模式不兼容,在 8.0 中已经降级处理),同理,如果一个已经存在的复制通道,在创建时使用了忽略服务器的列表,当其开启 GTID 模式时,也将报错。用户可以使用 “CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();” 清空忽略的服务器列表。
7.GTID 扩展格式。基于 GTID 的复制扩展了 GTID 的格式,用户可以为 GTID 打上标签,方便对一组事务进行识别管理。新的格式为 “UUID:<TAG>:NUMBER”,“<TAG>” 是任意字符串,可以通过 “SET gtid_next” 进行设置,并在当前会话中持久有效。
8.自动化升级。在 Windows 上,MySQL Configurator 可以执行原地升级。例如 “MySQL Server” 8.3.0 可以取代现有的 MySQL Server 8.2.0 安装,包括更新和重命名数据目录。
9.增加了 “explain_json_format_version” 系统变量,用于 “EXPLAIN FORMAT=JSON” 语句。1 为默认值,与之前的格式一致,2 是基于访问路径的,目的为未来的优化器提供更好的兼容性。
以上内容是 8.3.0 版本的一个快速浏览,更多详细信息可访问 MySQL 官网。 其于2024年1月释出,主要更新有:用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。
新特性
带标记 GTID 的复制
8.3 中的一个突出功能是在 MySQL 复制和组复制中引入了标记的全局事务标识符(GTID)。此增强功能允许对事务进行分组和轻松识别。新的 GTID 格式 "UUID:TAG:NUMBER" 可以为链接到特定事务组的 GTID 提供唯一命名。这样,用户可以通过 GTID 比较来区分数据和管理操作,从而提高复制效率和组织性。
有鉴于此,该版本引入了设置 GTID 值所需的新权限 "TRANSACTION_GTID_TAG" ,允许数据库管理员控制谁可以分配 GTID,进一步细化事务管理。
EXPLAIN 中的 JSON 格式版本控制
8.3 引入了一个服务器系统变量 "explain_json_format_version" ,允许用户在 "EXPLAIN FORMAT=JSON" 语句中在两个版本的 JSON 输出格式之间进行选择。此功能可确保与未来版本的 MySQL 优化器更好的兼容性,从而增强长期可用性。
线程池插件增强功能
线程池插件现在包含 MySQL 性能架构中的附加信息。新的表和列提供了对线程池连接和状态的全面洞察,有助于更好的性能分析。
其他显着变化
"binlog_transaction_dependency_tracking" 系统变量的默认值已更改为 "WRITESET" ,表明该功能将逐步淘汰。该版本还引入了 CMake 选项 "WITH_LD" ,允许用户指定他们选择的链接器以及 MySQL Enterprise Data Masking 和 De-Identification 的增强功能。最后,MySQL 性能模式丰富了详细的线程池连接信息,这是性能调整的宝贵资源。
删除的功能特性
MySQL 8.3 还删除了一些特性和功能,强调向更高效和现代的数据库转变。关键 C API 函数(如 mysql_kill()、mysql_list_fields() 和其他函数)已被删除,建议使用替代方法来执行类似的操作。此外,以前不推荐使用的用于清除主机名内部缓存的 "FLUSH HOSTS" 语句现已被删除。用户被指导使用替代方法来清除主机缓存。
各种复制和服务器选项,例如 "–slave-rows-search-algorithms" 和 "–log_bin_use_v1_events" 也已被删除,引导用户采用更高效和现代的实践。v8.3 将用于冲突检查的写入集的使用限制为基于行的日志记录,这表明二进制日志事务依赖性跟踪的改进方法。
MySQL 8.3 是最新版本引入了许多新的功能和改进,包括:
性能提升:大幅提高查询性能和吞吐量
安全性增强:新的安全功能可帮助保护您的数据
扩展性增强:支持更大的数据库和更多并发用户
易用性改进:简化的语法和新的管理工具
MySQL 8.3 中文手册旨在帮助充分利用其所有新功能和优势。它包含以下内容:
详细的安装和配置说明
完整的数据库管理指南
对所有 SQL 语句和函数的全面参考
针对常见问题的故障排除技巧
最新的 MySQL 8.3 功能概述
无论是数据库新手还是经验丰富的专业人士,MySQL 中文手册都是您不可或缺的资源。访问存在码在线 MySQL 中文手册的免费版本获取更多文档支持。
MySQL 的第一个长期支持版 8.4 GA
MySQL 8.4 GA 于2024年5月上旬发布,一些具体变更内容如下:
认证插件:默认情况下,“mysql_native_password” 认证插件被禁用,如果用户需要兼容旧的应用程序,需要在启动 MySQL 服务器时,启用该插件 “--mysql-native-password=on”
克隆插件:克隆插件对于版本的要求放宽,允许在同一个大版本内进行克隆,不再要求小版本必须一致。例如,可以从 8.4.0 克隆至 8.4.14。
支持在 Windows 上使用基于 SASL 的 LDAP 认证,Windows 的客户端可以使用 GSSAP/Kerberos 和 “authentication_ldap_sasl_client” 插件进行认证。
主从复制中 “SOURCE_RETRY_COUNT” 选项值变更为 10,默认情况下,主从复制将在 10 分钟内,每 60 秒尝试一次重新连接。
主从复制中的 “START REPLICA” 的 “SQL_AFTER_GTIDS ” 选项支持多线程回放(MTA)。
主从复制中使用的大量 “MASTER”/”SLAVE” 被删除,用户需要使用 “SOURCE”/“REPLICA” 替代。
“mysqldump” 中增加 “--output-as-version” 选项,支持从 8.2 以后版本的 MySQL 服务器兼容旧的 MySQL 服务器。该选项值为 “SERVER”,“BEFORE_8_2_0”,和 “BEFORE_8_0_23”。
组复制的 “group_replication_set_as_primary()” 函数在选择新的主要成员时,将等待正在进行的 DDL 结束。
“group_replication_consistency” 系统变量的默认值从 “EVENTUAL” 改为 “BEFORE_ON_PRIMARY_FAILOVER”。“group_replication_exit_state_action ” 系统变量的默认值改为 “OFFLINE_MODE”。
增加自动更新直方图功能。当启用该功能后,无论是否执行 “ANALYZE TABLE”,都将自动更新直方图。
在 “Performance_Schema” 中增加线程池的连接信息,并增加 “tp_connections” 表,用以显示每个线程池的连接。
除了上面的部分增加内容,在该版本中还对一部分功能进行了删除和降级,包括去除了大量的 “MASTER/SLAVE” 等等,想要了解详细内容,可访问 MySQL 官网。
1.Hash Join 不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。
2.EXPLAIN ANALYZE 将运行查询,然后生成 EXPLAIN 输出,以及有关优化程序估计如何与实际执行相匹配的其他信息。
3.创建用户时可以随机生成密码
为 CREATE USER, ALTER USER和 SET PASSWORD语句添加了语法,以生成强随机密码,并将其作为结果返回给客户端。添加的语法是:
CREATE USER user IDENTIFIED BY RANDOM PASSWORD,
ALTER USER user IDENTIFIED BY RANDOM PASSWORD,
SET PASSWORD [FOR user] TO RANDOM
4.群组复制
group_replication_exit_state_action 增加了 OFFLINE_MODE 模式,用于指定当服务器无意离开群组时群组复制的行为。
OFFLINE_MODE 行为将关闭所有连接,并禁止非 CONNECTION_ADMIN 或 SUPER 权限的用户建立新连接,否则它的行为类似于现有 READ_ONLY 模式。
5.innodb 增加一个空闲状态下控制写入 IOPs 的选项
该选项在 InnoDB 空闲时控制写 IOP。目的是减少写 IO,以延长闪存的寿命。
此外还有很多内部细节的改进,详细请访问这里。
改进审计日志:对于JSON格式的日志文件,MySQL企业审计支持使用audit_log_read()用户定义函数进行日志读取操作。之前,只有通过向audit_log_read()传递一个参数才能指定开始读取的位置,为了更加灵活现在可以命名一个以时间戳的开始说明符,以便从该时间戳或之后的第一个事件开始读取。MySQL企业版现在包含一个keyring_oci插件,它使用Oracle Cloud Infrastructure Vault作为密钥环存储的后端。密钥信息不会永久存储在MySQL服务器本地存储中。
优化器部分:
prepared语句现在只在执行PREPARE时准备一次,而不是在每次执行时准备一次。此外,存储过程里面的语句也仅在初次执行时准备一次。
filesort算法现在支持对多个表上的联接进行排序,而不仅仅是对单个表进行排序。
在MySQL 8.0.22中,服务器在内部将所有右连接实例处理为左连接,消除了一些在解析时没有执行完整转换的特殊情况。
增加了支持SELECT INTO DUMPFILE 和 SELECT INTO OUTFILE 在写入文件时定期同步。
MySQL现在为符合条件的查询实现派生条件下推,将外部where条件推入派生表。
SQL语法:支持对YEAR数据类型进行转换,支持TIMESTAMP使用UTC,并且支持通过JSON_VALUE()返回JSON值。
功能和函数方面:
使用MySQL服务器的新的异步连接故障转移机制,在从副本到源的现有连接失败后,自动建立到新源的异步(源到副本)复制连接。
通过新的变量innodb_extend_and_initialize,允许在Linux上配置InnoDB如何分配空间给每个表的文件和一般表空间。
允许在MySQL授权表上进行DML和DDL的读取操作,之前需要取得行锁,现在采取了非锁定操作。
group_replication_ip_whitelist变量降级使用,将采用新的变量group_replication_ip_allowlist名称。
START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTS 及 RESET SLAVE降级使用,使用REPLICA来替代。
ALTER DATABASE 语句支持 READ ONLY选项,控制是否允许修改数据库和其中的对象。
以上内容为 8.0.22 版本的简介,更为详尽的内容访问 Release Notes 或发行公告。
MySQL 8.0.24 现已于2021年4月中旬发布。这是一个维护版本,修复了 219 个 Bug。其中有两位中国人的贡献(Yuxiang Jiang 和 Zhai Weixiang),他们发现 Bug 并贡献了修复的补丁程序。关于修复的具体内容,请参阅发行一览。除此之外,在下面所列的功能点进行了更新:
MySQL Enterprise Audit 现在支持对审计日志进行删减。
服务器通过在关闭连接之前将原因写入连接的方法,使得客户端收到一个包含客户端超时内容的错误消息,解决了以往服务器关闭连接而客户端无法获得正确原因的问题。
客户端连接失败消息里添加了端口号信息。
MySQL Keyring 功能从插件过渡到服务器组件,包括一款社区版/企业版组件及两款企业版组件。
升级使用curl 7.74.0。
Performance Schema增加了一些新的性能指标,包括:memory/sql/dd::infrastructure,memory/sql/dd::object。并对一些已有的指标进行改进和重命名。
为认证插件增加了系统变量,允许配置caching_sha2_password插件运行哈希次数。
空间地理信息方面增加了新的函数 ST_LineInterpolatePoint()、ST_LineInterpolatePoints()、ST_PointAtDistance()和ST_Collect()。此外CAST() 和 CONVERT() 增加了对地理空间数据的支持扩展。
InnoDB的 AUTOEXTEND_SIZE最大值从64M 增至4GB。
clone_donor_timeout_after_network_failure配置的超时时间由之前的固定值5分钟扩展到最大30分钟,用以提供更多的时常去解决网络问题。
向MGR的allowlist里面增加新成员不再需要停止/再启动MGR。
使用--skip-slave-start启动从服务器不在需要登录数据库服务器的主机。
更多详情可查看官方发行说明。
注意:从 MySQL 5.7 升级到 MySQL 8.0 仅支持通过使用 in-place 方式进行升级,并且不支持从 MySQL 8.0 降级到 MySQL 5.7(或从某个 MySQL 8.0 版本降级到任意一个更早的 MySQL 8.0 版本)。唯一受支持的替代方案是在升级之前对数据进行备份。下面简要介绍 MySQL 8 中值得关注的新特性和改进。
1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。
2. NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。
3. 窗口函数(Window Functions):从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。
4. 隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
5. 降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。
6. 通用表表达式(Common Table Expressions CTE):在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。
7. UTF-8 编码:从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。
8. JSON:MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
9. 可靠性:InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。
10. 高可用性(High Availability):InnoDB 集群为您的数据库提供集成的原生 HA 解决方案。
11. 安全性:对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。
8.0 对比于 5.7 的性能提升及优化
一、其中一些方面的比较:
1.1 JSON 处理
8.0 对 JSON 数据类型的支持更加完善。可以直接在 JSON 数据中进行搜索、排序和过滤,并且支持 JSON 表达式索引,大大提高了处理 JSON 数据的效率和性能。
1.2 更好的性能和可扩展性
8.0 在性能和可扩展性方面都有很大的提升。引入了新的多线程架构,可以更好地利用多核处理器,同时也提高了并发读写的能力。此外还支持更多的存储引擎,包括 InnoDB、MyISAM、Memory、CSV、Blackhole、Archive 等等。
1.3 更丰富的数据类型
8.0 支持更丰富的数据类型,包括 YEAR(4)、GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION 等等。这些数据类型的支持可以更好地满足不同应用场景的需求。
1.4 更好的安全性
8.0 在安全性方面也有很大的提升。引入了新的密码验证插件,使用更加安全的加密算法,提高了密码的安全性。此外还支持更多的安全特性,包括增强的 SSL/TLS 支持、更加严格的密码策略、更加灵活的用户管理等等。
1.5 小结
8.0 在多方面都有很大的改进,包括 JSON 处理、性能和可扩展性、数据类型、安全性等等;这些改进使其更加适合处理大规模的数据和高并发的请求,同时也提高了数据的处理效率和安全性。
二、两者在配置上的不同之处和优化建议:
2.1 缓存配置
8.0 的默认缓存大小比 5.7 要小,因此需要根据实际情况进行调整。可以通过修改 innodb_buffer_pool_size 参数来调整缓存大小,建议将其设置为系统可用内存的 70% 到 80%。
2.2 日志配置
8.0 相比 5.7 的日志配置有所不同。8.0 引入了新的 redo log 架构,可以提高写入性能。建议将 innodb_log_file_size 参数设置为 1GB 到 2GB,同时将 innodb_log_files_in_group 参数设置为 4 到 8 个。
2.3 表空间配置
8.0 支持更大的表空间,可以更好地处理大规模数据。建议将 innodb_page_size 参数设置为 16KB、32KB 或 64KB,根据实际情况进行调整。同时,建议将 innodb_file_per_table 参数设置为 ON,以避免单个表空间过大导致性能下降的问题。
2.4 安全配置
8.0 相比 5.7 在安全性方面有所提升。建议将 default_authentication_plugin 参数设置为 caching_sha2_password,使用更加安全的加密算法。同时建议开启 SSL/TLS 加密传输,使用更加安全的数据传输方式。
2.5 备份配置
8.0 相比 5.7 在备份方面有所改进。建议使用新的备份工具 mysqlpump,可以更好地处理大规模数据的备份和恢复。
2.6 小结
对于 8.0 的配置优化建议包括:调整缓存大小、修改日志配置、调整表空间大小、加强安全配置、使用新的备份工具等等。这些优化建议可以提高其性能和安全性,同时也提高了处理大规模数据的能力。
详细更新说明
官方发行说明
MySQL 8 正式版的新增功能
Facebook 分享迁移到 MySQL 8.0 的经验
2021年7月消息,Facebook 在一篇博客中分享了该公司在某种程度上艰难的大规模跨越式迁移到 MySQL 8.0 版本的经验,此前其一直使用的是 MySQL 5.6 版本。开源的MySQL多年来为 Facebook 的一些最重要的工作负载提供支持,Facebook 方面称其每个新主要版本都需要其花费大量时间和精力来迁移工作负载。其中挑战包括有:
将其自定义功能移植到新版本
确保复制在主要版本之间兼容
最小化现有应用程序查询所需的更改
修复阻止服务器支持其工作负载的性能回归
根据透露,Facebook 上次升级到 MySQL 5.6 花了一年多的时间;而此向 MySQL 8.0 的升级也花了好几年的时间。在 5.7 版本发布的时候,Facebook 仍在开发 5.6 版上的 LSM-Tree 存储引擎 MyRocks。鉴于在构建新存储引擎的同时升级到 5.7 会显着减缓 MyRocks 的进度,因此该团队选择继续使用 5.6 直到 MyRocks 完成。而 MySQL 8.0 则刚好是在 MyRocks 完成时发布的,所以 Facebook 选择升级以改进其存储引擎。Facebook 指出,迁移到 8.0 明显比迁移到 5.6 要更困难。他们有 1700 个代码补丁要从其定制的 MySQL 5.6 分支迁移到 8.0。由于 Facebook 的 MySQL 新功能和不断添加到 5.6 代码库中的修复,使得这项工作变得非常复杂。因为从 5.6 到 8.0 的升级完全跳过了 5.7,一些在 5.6 中活跃的 API 要么被弃用、要么被完全删除;这也就意味着任何使用旧 API 的应用程序都需要更新。且 Facebook 的一些功能也与 8.0 中的类似功能不向前兼容,需要弃用和向前迁移。还有自定义代码文档参差不齐的问题。Facebook 称,它的大多数自定义代码都有良好的注释和文档。但其他的代码没有很好的文档,Facebook 需要挖掘旧的文件、帖子和代码注释来了解历史。最终,Facebook 方面评估了 2300 多个补丁并将其中的 1500 个移植到了 MySQL 8.0。“我们已将许多 InnoDB 副本集转换为完全在 8.0 上运行。其余的大多数都处于迁移路径的不同阶段。现在我们的大部分自定义功能都已移植到 8.0,更新到 Oracle 的次要版本相对容易,我们计划跟上最新版本的步伐。”
“尽管我们在迁移的道路上遇到了种种障碍,但我们已经看到了运行8.0的好处。总的来说,新版本大大扩展了我们在 MySQL @ Facebook 上所能做的事情。”
MySQL 8.0.31 现已于2022年10月中旬正式发布,一些改进内容包括:
审计插件:审计插件的日志轮换函数 audit_log_rotate (),简化了日志轮换的工作,用户无需手动更改日志名称,也无需设置 audit_log_flush = ON。
组件服务:启用了新的组件服务,支持服务器组件和要在本地服务器中查询的插件。新的 MySQL 命令服务类似于 C API 函数 libmysql。
OCI 密钥存储组件:component_keyring_oci 替代之前用于 OCI 的 Keyring 插件,用以支持在 Oracle Cloud 上进行密钥存储。
优化器改进:优化器的内部管理操作进行了一组改进,包括如下:
带括号的查询表达式可以使用 UNION 进行嵌套,例如:
(
(SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
) ORDER BY c LIMIT 1;
当使用多组括号时,仍遵循现有的语义标准,更高的外部限制不能覆盖括号内部较低的限制,例如:
(SELECT ... LIMIT 3) LIMIT 5
最多返回三行数据。
UNION DISTINCT 和 UNION ALL 可以进行任意嵌套。
SQL 语法:SQL 不再支持使用 full 和 FULL 为对象命名,如果继续使用 full 或 FULL 作为表、视图、字段、存储过程等名称,将会被警告。SQL 支持使用 INTERSECT 和 EXCEPT。
查询重写插件优化:MySQL 支持查询重写插件,这些插件可以在服务器执行之前检查并可能修改服务器接收到的 SQL 语句,之前,无论用户权限如何所有的查询都需要重写,甚至包括执行的内部系统查询。在这一版本加入了新的权限 SKIP_QUERY_REWRITE,通过新的系统变量 rewriter_enabled_for_threads_without_privilege_checks 进行控制是否忽略对某些线程执行的语句进行改写。
OpenSSL:在内置 OpenSSL 的平台上,MySQL 使用的 OpenSSL 库升级至 1.1.1q。
监视缓冲池调整容量:InnoDB 提供了两个新的状态变量 Innodb_buffer_pool_resize_status_code 和 Innodb_buffer_pool_resize_status_progress 用以监视缓冲池在线调整的过程。
并行创建索引:InnoDB 现在支持并行索引构建,改进索引构建性能。
复制过滤优化:复制开启过滤时,副本不再引发复制错误相关的权限检查和 require_row_format 验证,副本将在全部的复制过滤应用后进行检查。
监视资源组:增加了状态变量 Resource_group_supported,用以监视服务器是否支持资源组。
二进制包优化:二进制包中包含了 curl,不再链接系统的 curl 库
资源争用优化:新的系统变量 thread_pool_transaction_delay,允许在工作线程执行新的事务前指定延迟,适用于由于资源争用引发的并行事务对其他操作带来的性能影响。
调整查询线程数量:新的系统变量 thread_pool_query_threads_per_group,使得用户可以增加线程组内的查询线程数量。
新的线程池插件:MySQL Database Service 中使用的线程池插件,在 MySQL 企业版中提供。
以上内容是 8.0.31 的一个速览,更为详细的功能改进和错误修复,可访问官网。
8.1 及 8.0.34 正式发布
MySQL 8.1 及 8.0.34 现已于2023年7月下旬正式发布。至此将开启创新版和稳定版同时发行的阶段。8.1 是 MySQL 的首个创新版,该版本主要增加了如下功能:
1.捕捉 EXPLAIN FORMAT=JSON 输出, 为 EXPLAIN FORMAT=JSON 增加 INTO 选项,可以将 JSON 格式的输出保存在一个用户变量中。
2.保留客户端注释,8.1 保留 mysql 客户端的注释,如果需要使用之前的行为,需要使用 --skip-comments 选项
3.MySQL Replication 更改 SOURCE_RETRY_COUNT,CHANGE REPLICATION SOURCE TO 语句中 SOURCE_RETRY_COUNT 的默认值改为 10,这意味着,使用此选项和 SOURCE_CONNECT_RETRY (60) 的默认值,副本在重新连接尝试之间等待 60 秒,并在超时和故障转移之前以此速率尝试重新连接 10 分钟。
4.group_replication_set_as_primary () 及 DDL 语句,在选择一个新的主节点之前,group_replication_set_as_primary () 函数需要等待所有事务完成前正在进行的 DDL 语句。
5.版本特定注释中使用的 MySQL 版本号现在支持由一个或两个数字组成的主版本,这意味着整个版本现在可以是五位数或六位数长。
6.强化关闭服务器过程的日志,随着 MySQL 服务器、插件和组件的启动和关闭消息的增加,强化关闭过程的日志,附加功能应该有助于故障排除和调试问题,特别是在服务器需要很长时间才能关闭的情况下。
7.增加了 SHOW PARSE_TREE语句,该语句显示了 select 语句的 json 格式解析树。此语句仅用于测试和开发,而不是用于生产。它仅用于调试版本中
8.增加了 tls-certificates- enforsed - validation 系统变量,允许 DBA 在服务器启动时或使用 ALTER INSTANCE RELOAD TLS 语句在运行时重新加载证书时强制执行证书验证。启用强制后,发现证书无效时将在启动时停止服务器调用,防止在运行时加载无效证书,并发出警告。
9.添加了一些特定于组复制插件的状态变量,这些变量可以改进对网络不稳定的诊断和故障排除,为每个组成员提供有关网络使用情况、控制消息和数据消息的统计信息。
10.添加了服务器系统变量,用来控制使用 LDAP 可插拔身份验证连接到 MySQL 服务器的 MySQL 帐户在 LDAP 服务器关闭或无响应时必须等待的时间。对于以下简单且基于 sasl 的 LDAP 身份验证变量,新的默认超时为 30 秒,连接和响应超时只能通过 Linux 平台上的系统变量进行配置。有关更多信息,请参见设置 LDAP 可插拔身份验证的超时时间。
除了新增功能外,还做了以下调整,这部分内容基本上与 MySQL8.0.34 一致。用户管理方面,增加了一个系统变量 “validate_password.changed_characters_percentage” 用于密码验证。该变量用于配置用户在更改密码时必须修改的字符数量,数量以当前密码的字符数百分比计算。假设该变量值设为 50,则新密码中至少有一半的字符需要修改。
MySQL 审计方面,增加新的功能,在安装审计插件时,可以指定用户存储日志过滤条件的数据库。例如:
$> mysql -u root -D database_name -p < audit_log_filter_linux_install.sql
此外,MySQL 审计增加了使用调度器组件来配置和执行循环任务,刷新内存缓存的新功能。
二进制日志方面,在 libmysqlclient.so 库中增加了新的函数 mysql_binlog_open (),mysql_binlog_fetch (),及 mysql_binlog_close (),使得开发者能够访 MySQL 服务器的二进制日志。
兼容性方面,改进了 Windows 的 MSVC_CPPCHECK 支持,并检查类似的 MSVC 警告 “维护” 模式。
Windows 编译方面,改善了 WIN_DEBUG_NO_INLINE=1 的支持,使用量将超过库的 65535 个对象的限制。
此外,对 robin-hood-hashing、ICU 文件及 ZSTD 的版本等进行了升级。
由于 MySQL 提供了 mysql shell 和 mysqldump 用于备份,因此,mysqlpump 将进行降级处理,使用时将有警告提示,未来将弃用该产品。
用于复制的服务器变量 “sync_relay_log_info”、“binlog_format”,在此版本中降级处理,未来将弃用该变量。因此,与其关联的 “log_bin_trust_function_creators” 和 “log_statements_unsafe_for_binlog” 也将降级使用,最终弃用。需要注意,“binlog_format” 弃用后,MySQL 的二进制日志格式仅支持 “row-based”。
用于组复制的服务器变量 “group_replication_recovery_complete_at”,及 “mysql_native_password” 认证插件降级使用,未来将弃用。
此外,包括审计日志的传统过滤模式、mysql_ssl_rsa_setup 程序,及密钥环文件插件等也进行降级处理,未来将弃用。
用户需要注意,以往的特定与版本的注释方式 “/*!80034KEY_BLOCK_SIZE=1024*/ 或 /*!80034 KEY_BLOCK_SIZE=1024*/” 不考虑版本号后面的空格,但未来版本的该行为可能会发生变化。因此从此版本开始,请用户在版本号后面加入空格使用,SQL 语法方面,此版本支持使用 CURRENT_USER () 、SESSION_USER ()、USER (),SYSTEM_USER () 在建表语句或更改表语句中作为 Varchar 或 TEXT 类型字段的默认值。
除了上述提到的更改和弃用,MySQL 8.1 及 8.0.34 版本做了大量的错误修复,使得 8.0 进入一个稳定的状态。详细的变更内容可访问 MySQL 官网。
MySQL 8.2.0 于 2023 年 10 月 25 日发行,该版本的一些主要变化包括:
审计日志
添加了新的 “audit_log_filter_uninstall.sql” 脚本,简化删除 “MySQL Enterprise Audit” 的过程。认证 * “mysql_native_password” 插件已弃用,用户可以在服务器启动时将其禁用。如果服务器端 “mysql_native_password” 认证方法被禁用,使用该方法的旧的客户端插件将无法连接服务器,并在错误日志中写入 “Access denied” 消息。
MySQL 企业版现在支持 MySQL 服务器使用智能卡、安全设备等方法进行身份验证。该身份验证方法基于 FIDO 和 FIDO2 标准。它使用服务器端的 “authentication_webauthn” 和客户端的 “authentication_webauthn_client” 实现 C API。
客户端库现在支持使用查询预处理语句的属性,并引入一个新的 C API 声明函数 “mysql_stmt_bind_named_param ()”,用以替换现已弃用的 “mysql_stmt_bind_param ()” 函数。与 “mysql_stmt_bind_param () ” 不同,“mysql_stmt_bind_named_param ()” 允许绑定预处理语句的未命名和命名参数。
mysql_ssl_set () C API 函数已弃用,并且在未来的 MySQL 版本中删除。与其等效的函数为 “mysql_options ()” TLS 选项。
弃用和删除
兼容性的变化:“WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS ()” SQL 函数,在 MySQL 8.0 中已弃用,现已被删除。用户可以使用 “WAIT_FOR_EXECUTED_GTID_SET ()” 替代。
复制:“binlog_transaction_dependency_tracking” 服务器系统变量现已弃用,并将在 MySQL 的未来版本中删除。设置或检索该变量的值会触发警告。
“expire_logs_days” 服务器系统变量,在 MySQL 8.0 中已弃用,现已删除。用户可以使用 “binlog_expire_logs_seconds” 替代。
在 MySQL 8.0 中已弃用的服务器启动选项 “--abort-slave-event-count” 和 “--disconnect-slave-event-count”,现已删除。
服务器系统变量 “old” 和 “new” 现在已弃用,将在 MySQL 的未来版本中删除。
“--character-set-client-handshake” 服务器选项,现已弃用,并将在 MySQL 的未来版本中删除。
使用字符 “%” 和 “_” 作为通配符,对数据库进行授权功能现已弃用,未来将删除通配符功能。另外,服务器将 “%” 视为 “localhost” 的同义词,检查权限时(即授予 'myuser'@'%' 的权限也予 'myuser'@'localhost') 也从 MySQL 8.2.0 开始被弃用,未来版本删除。
“INFORMATION_SCHEMA.PROCESSLIST” 已弃用,未来版本删除。因此使用该表实现的 “SHOW PROCESSLIST” 也已弃用。推荐使用 Performance_schema。
SET_USER_ID 权限已弃用,未来版本删除。它现在已被这些新的权限替代: SET_ANY_DEFINER 用于创建定义者对象。 ALLOW_NONEXISTENT_DEFINER 用于孤立对象 保护。
“TLS_AES_128_CCM_8_SHA256” 密码套件已弃用,未来版本删除。
防火墙
MySQL Enterprise Firewall 允许其内存缓存定期重新加载防火墙中存储的数据表。以往仅在服务器启动时或服务器端插件启动时重新加载缓存。新的 “mysql_firewall_reload_interval_seconds” 系统变量可以设置用于重新加载表数据的日程表。其以往仅能在 mysql 系统数据库中存储所需的表、函数和存储过程。新的 “mysql_firewall_database” 服务器系统变量允许用户在服务器启动时,指定自定义的库。此外,新的脚本 “uninstall_firewall.sql” 简化了删除防火墙的工作。
SQL 语法
复制:此版本继续发布与 MySQL 复制相关功能中使用的术语 。MySQL 8.2 弃用了一些 SQL 语句,包括 “RESET MASTER”(使用 “RESET BINARY LOGS AND GTIDS” 代替),“SHOW MASTER STATUS”(“使用 SHOW BINARY LOG STATUS”),“SHOW MASTER LOGS”(使用 “SHOW BINARY LOGS”)和 “PURGE MASTER LOGS”(使用 “BINARY LOGS”)。
此外,“DISABLE ON SLAVE” 选项在 “CREATE EVENT” 和 “ALTER EVENT” 上已弃用。相关变更包括以下内容:
mysqldump 添加了一个选项 “--output-as-version” 定义转储中使用的术语级别对于与副本和事件相关的声明,使得创建转储成为可能与以前版本的 MySQL 兼容,仅接受现已弃用的术语。此选项的有效值为 “SERVER”、 “BEFORE_8_0_23” 和 “BEFORE_8_2_0” 。默认是 “SERVER”,这会令 “mysqldump” 获取服务器版本并输出命令与该版本兼容。
“terminology_use_previous” 服务器系统变量添加了一个新值 “BEFORE_8_2_0”。
SLAVESIDE_DISABLED 现已弃用。
Com_show_master_status 系统状态变量重新命名为 “Com_show_binary_log_status”。以前的名称已弃用,但仍支持向后兼容性。
EXPLAIN 现在支持 “FOR SCHEMA” 或 “FOR DATABASE” 选项。该选项将假设语句已经已在选项指定的数据库中运行。
添加或更改的功能
非兼容更改:升级绑定的 libfido2 v1.13.0 库。该 libfido2 版本需要 OpenSSL 1.1.1 或更高版本。
重要更改:适用于支持绑定 OpenSSL 的平台,用于 MySQL 服务器链接的 OpenSSL 库已更新至版本 3.0.10。
重要更改:添加了对 Debian 12、Fedora 39、 macOS 14 和 Ubuntu 23.10 的支持。
mysqldump:添加了 “--ignore-views” 选项以跳过 生成的转储文件中的表视图。* mysqldump:添加了 “--init-command” 和 “--init-command-add” 选项以允许连接或重新连接 MySQL 后执行 SQL 语句。
mysql:添加了 “--init-command-add” 选项,该选项添加连接或重新连接到 MySQL 服务器后要执行的附加 SQL 语句。它类似于 “--init” 命令选项。
添加了新的 “--no-login-paths” 命令行选项,禁止处理登录路径。已添加至每个具有 “--login-path” 选项的 MySQL 客户端。
以上内容是 8.2.0 版本的一个快速浏览,更多详细信息可访问 MySQL 官网。
8.3.0于2024年1月1日正式发行,该版本的一些主要变化包括:
1.企业版的数据屏蔽和脱敏功能中增加了在副本(次要成员)服务器的的内存中刷新数据的能力。可以通过 “masking_dictionaries_flush ()” 函数进行手动刷新,也可以通过调度组件使用新的变量 “componet_masking.dictionaries_flush_interval_seconds” 配置为定时刷新。
2.企业版支持使用 “component_telemetry” 组件,收集服务器 OpenTelemetry 格式的度量数据。(仅支持 Linux 平台)
3.删除 --innodb 和 --skip-innodb 服务器选项。从 MySQL 5.6 版本起,innoDB 作为默认的存储引擎,--innodb 和 --skip-innodb 服务器选项已经失去存在的意义,在此版本正式删除
4.删除 InnoDB memcached 插件。该插件在 8.0.22 中降级使用,在此版本中正式删除
5.删除 MySQL 复制中部分服务器选项和变量。这些变量在之前的版本进行了降级使用,在此版本中正式删除,包括:
--slave-rows-search-algorithms
log_bin_use_v1_events
--relay-log-info-file
--relay-log-info-repository
--master-info-file
--master-info-repository
transaction_write_set_extraction
group_replication_ip_whitelist
group_replication_primary_member
6.禁止使用非空的 “IGNORE_SERVER_IDS” 列表。从此版本起,当开启基于 GTID 进行复制时,将不再允许 “CHANGE REPLICATION SOURCE TO” 指向一个非空的 “IGNORE_SERVER_IDS” 列表,(由于 “IGNORE_SERVER_IDS” 与 GTID 模式不兼容,在 8.0 中已经降级处理),同理,如果一个已经存在的复制通道,在创建时使用了忽略服务器的列表,当其开启 GTID 模式时,也将报错。用户可以使用 “CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();” 清空忽略的服务器列表。
7.GTID 扩展格式。基于 GTID 的复制扩展了 GTID 的格式,用户可以为 GTID 打上标签,方便对一组事务进行识别管理。新的格式为 “UUID:<TAG>:NUMBER”,“<TAG>” 是任意字符串,可以通过 “SET gtid_next” 进行设置,并在当前会话中持久有效。
8.自动化升级。在 Windows 上,MySQL Configurator 可以执行原地升级。例如 “MySQL Server” 8.3.0 可以取代现有的 MySQL Server 8.2.0 安装,包括更新和重命名数据目录。
9.增加了 “explain_json_format_version” 系统变量,用于 “EXPLAIN FORMAT=JSON” 语句。1 为默认值,与之前的格式一致,2 是基于访问路径的,目的为未来的优化器提供更好的兼容性。
以上内容是 8.3.0 版本的一个快速浏览,更多详细信息可访问 MySQL 官网。 其于2024年1月释出,主要更新有:用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。
新特性
带标记 GTID 的复制
8.3 中的一个突出功能是在 MySQL 复制和组复制中引入了标记的全局事务标识符(GTID)。此增强功能允许对事务进行分组和轻松识别。新的 GTID 格式 "UUID:TAG:NUMBER" 可以为链接到特定事务组的 GTID 提供唯一命名。这样,用户可以通过 GTID 比较来区分数据和管理操作,从而提高复制效率和组织性。
有鉴于此,该版本引入了设置 GTID 值所需的新权限 "TRANSACTION_GTID_TAG" ,允许数据库管理员控制谁可以分配 GTID,进一步细化事务管理。
EXPLAIN 中的 JSON 格式版本控制
8.3 引入了一个服务器系统变量 "explain_json_format_version" ,允许用户在 "EXPLAIN FORMAT=JSON" 语句中在两个版本的 JSON 输出格式之间进行选择。此功能可确保与未来版本的 MySQL 优化器更好的兼容性,从而增强长期可用性。
线程池插件增强功能
线程池插件现在包含 MySQL 性能架构中的附加信息。新的表和列提供了对线程池连接和状态的全面洞察,有助于更好的性能分析。
其他显着变化
"binlog_transaction_dependency_tracking" 系统变量的默认值已更改为 "WRITESET" ,表明该功能将逐步淘汰。该版本还引入了 CMake 选项 "WITH_LD" ,允许用户指定他们选择的链接器以及 MySQL Enterprise Data Masking 和 De-Identification 的增强功能。最后,MySQL 性能模式丰富了详细的线程池连接信息,这是性能调整的宝贵资源。
删除的功能特性
MySQL 8.3 还删除了一些特性和功能,强调向更高效和现代的数据库转变。关键 C API 函数(如 mysql_kill()、mysql_list_fields() 和其他函数)已被删除,建议使用替代方法来执行类似的操作。此外,以前不推荐使用的用于清除主机名内部缓存的 "FLUSH HOSTS" 语句现已被删除。用户被指导使用替代方法来清除主机缓存。
各种复制和服务器选项,例如 "–slave-rows-search-algorithms" 和 "–log_bin_use_v1_events" 也已被删除,引导用户采用更高效和现代的实践。v8.3 将用于冲突检查的写入集的使用限制为基于行的日志记录,这表明二进制日志事务依赖性跟踪的改进方法。
MySQL 8.3 是最新版本引入了许多新的功能和改进,包括:
性能提升:大幅提高查询性能和吞吐量
安全性增强:新的安全功能可帮助保护您的数据
扩展性增强:支持更大的数据库和更多并发用户
易用性改进:简化的语法和新的管理工具
MySQL 8.3 中文手册旨在帮助充分利用其所有新功能和优势。它包含以下内容:
详细的安装和配置说明
完整的数据库管理指南
对所有 SQL 语句和函数的全面参考
针对常见问题的故障排除技巧
最新的 MySQL 8.3 功能概述
无论是数据库新手还是经验丰富的专业人士,MySQL 中文手册都是您不可或缺的资源。访问存在码在线 MySQL 中文手册的免费版本获取更多文档支持。
MySQL 的第一个长期支持版 8.4 GA
MySQL 8.4 GA 于2024年5月上旬发布,一些具体变更内容如下:
认证插件:默认情况下,“mysql_native_password” 认证插件被禁用,如果用户需要兼容旧的应用程序,需要在启动 MySQL 服务器时,启用该插件 “--mysql-native-password=on”
克隆插件:克隆插件对于版本的要求放宽,允许在同一个大版本内进行克隆,不再要求小版本必须一致。例如,可以从 8.4.0 克隆至 8.4.14。
支持在 Windows 上使用基于 SASL 的 LDAP 认证,Windows 的客户端可以使用 GSSAP/Kerberos 和 “authentication_ldap_sasl_client” 插件进行认证。
主从复制中 “SOURCE_RETRY_COUNT” 选项值变更为 10,默认情况下,主从复制将在 10 分钟内,每 60 秒尝试一次重新连接。
主从复制中的 “START REPLICA” 的 “SQL_AFTER_GTIDS ” 选项支持多线程回放(MTA)。
主从复制中使用的大量 “MASTER”/”SLAVE” 被删除,用户需要使用 “SOURCE”/“REPLICA” 替代。
“mysqldump” 中增加 “--output-as-version” 选项,支持从 8.2 以后版本的 MySQL 服务器兼容旧的 MySQL 服务器。该选项值为 “SERVER”,“BEFORE_8_2_0”,和 “BEFORE_8_0_23”。
组复制的 “group_replication_set_as_primary()” 函数在选择新的主要成员时,将等待正在进行的 DDL 结束。
“group_replication_consistency” 系统变量的默认值从 “EVENTUAL” 改为 “BEFORE_ON_PRIMARY_FAILOVER”。“group_replication_exit_state_action ” 系统变量的默认值改为 “OFFLINE_MODE”。
增加自动更新直方图功能。当启用该功能后,无论是否执行 “ANALYZE TABLE”,都将自动更新直方图。
在 “Performance_Schema” 中增加线程池的连接信息,并增加 “tp_connections” 表,用以显示每个线程池的连接。
除了上面的部分增加内容,在该版本中还对一部分功能进行了删除和降级,包括去除了大量的 “MASTER/SLAVE” 等等,想要了解详细内容,可访问 MySQL 官网。