有关升级、降级、平台支持等的一般信息,请访问https://mysql.net.cn/doc/relnotes/mysql/8.0/en/。
这是一个里程碑版本,使用风险自负。不支持里程碑版本之间的升级(或从里程碑版本升级到 GA 版本)。重大的开发变更发生在里程碑版本中,您可能会遇到兼容性问题,例如除了运行mysql_upgrade的常规过程之外还需要注意的数据格式更改。例如,您可能会发现有必要在升级前使用mysqldump转储数据并 在升级后重新加载。(无论如何,在升级之前进行备份是一种谨慎的预防措施。)
-
不兼容的更改:
mysql
系统数据库中 的授权表现在InnoDB
(事务性)表。以前,这些是MyISAM
(非事务性)表。此更改适用于这些表:user
,db
,tables_priv
,columns_priv
,procs_priv
,proxies_priv
。授权表存储引擎的变化是伴随账户管理报表行为变化的基础。以前,命名多个用户的帐户管理语句可能对某些用户成功而对其他用户失败。现在,每个语句都是事务性的,并且要么对所有指定用户成功,要么回滚,如果发生任何错误则无效。语句成功则写入二进制日志,失败则不写入;在这种情况下,将发生回滚并且不进行任何更改。前面的行为适用于这些语句:
ALTER USER
,CREATE ROLE
,CREATE USER
,DROP ROLE
,DROP USER
,GRANT
,RENAME USER
,REVOKE
。(SET PASSWORD
未列出,因为它最多适用于一个用户并且已经有效地进行了交易。)此行为更改的副作用是,当在 MySQL 8.0 从属服务器上复制时,MySQL 5.7 主服务器上部分完成的帐户管理语句失败。有关详细信息,请参阅 原子数据定义语句支持。如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到
mysql
系统数据库中。笔记如果 MySQL 从旧版本升级,但授权表尚未从 升级
MyISAM
到InnoDB
,则服务器认为它们是只读的,并且帐户管理语句会产生错误。由于存储引擎从 更改
MyISAM
为InnoDB
,SELECT
没有ORDER BY
授权表可以产生与以前不同的行顺序。如果查询结果必须具有特定的行排序特征,请包含一个ORDER BY
子句。 -
MySQL 现在支持角色,即命名的权限集合。角色允许将权限集分配给帐户,并提供一种方便的替代方法来授予个人权限,既可以概念化所需的权限分配,也可以实现它们:
可以创建和删除角色。
角色可以拥有授予和撤销的特权。
可以向用户帐户授予和撤销角色。
一个帐户的活动角色可以从授予该帐户的角色中选择,并且可以在该帐户的会话期间更改。
有关详细信息,请参阅使用角色。
笔记ROLE
now 是一个保留字,不能在没有标识符引用的情况下用作标识符。
-
Unicode 字符集
utf8mb4
有一个名为utf8mb4_0900_ai_ci
.utf8mb4
也有几个新的特定于语言的归类,其特征类似于utf8mb4_0900_ai_ci
除了特定于语言的规则在适用的情况下优先。特定于语言的归类由归类名称中的 ISO 639-1 语言代码指示,如下表所示。在两种情况下,语言代码有一个附加项表示变体(德语电话簿顺序,繁体西班牙语)。表 5 utf8mb4 UCA 9.0.0 语言特定的排序规则
语 校对 克罗地亚语 utf8mb4_hr_0900_ai_ci
捷克语 utf8mb4_cs_0900_ai_ci
丹麦语 utf8mb4_da_0900_ai_ci
世界语 utf8mb4_eo_0900_ai_ci
爱沙尼亚语 utf8mb4_et_0900_ai_ci
德国电话簿订单 utf8mb4_de_pb_0900_ai_ci
匈牙利 utf8mb4_hu_0900_ai_ci
冰岛的 utf8mb4_is_0900_ai_ci
拉脱维亚语 utf8mb4_lv_0900_ai_ci
立陶宛语 utf8mb4_lt_0900_ai_ci
抛光 utf8mb4_pl_0900_ai_ci
古典拉丁语 utf8mb4_la_0900_ai_ci
罗马尼亚语 utf8mb4_ro_0900_ai_ci
斯洛伐克语 utf8mb4_sk_0900_ai_ci
斯洛文尼亚语 utf8mb4_sl_0900_ai_ci
现代西班牙语 utf8mb4_es_0900_ai_ci
传统的西班牙语 utf8mb4_es_trad_0900_ai_ci
瑞典 utf8mb4_sv_0900_ai_ci
土耳其 utf8mb4_tr_0900_ai_ci
越南语 utf8mb4_vi_0900_ai_ci
utf8mb4_0900_ai_ci
也可用作下表中语言的不区分重音、不区分大小写的排序规则。表6 utf8mb4_0900_ai_ci适用的语言
语言名称 语言代码 德语(字典顺序) 德 英语 恩 加拿大法语(语言环境 fr_CA) fr 爱尔兰盖尔语 嘎 印度尼西亚 ID 意大利语 它 卢森堡语 磅 马来语 小姐 荷兰语 荷兰 葡萄牙语 点 斯瓦希里语 开关 祖鲁语 祖 utf8mb4_da_0900_ai_ci
也可用作下表中语言的不区分重音、不区分大小写的排序规则。非语言特定
utf8mb4_0900_ai_ci
和语言特定的 Unicode 排序规则各自具有以下特征:utf8mb4_
LANG
_0900_ai_ci归类基于 Unicode 归类算法 (UCA) 9.0.0 和通用语言环境数据存储库 (CLDR) v30,不区分重音和大小写。这些特征在归类名称中由
_0900
、_ai
和表示。_ci
例外:utf8mb4_la_0900_ai_ci
不是基于 CLDR,因为 CLDR 中没有定义古典拉丁语。该排序规则适用于 [U+0, U+10FFFF] 范围内的所有字符。
如果排序规则不是特定于语言的,它会按默认顺序(如下所述)对所有字符(包括补充字符)进行排序。如果排序规则是特定于语言的,它会根据特定于语言的规则正确地对语言中的字符进行排序,并且按照默认顺序对不属于该语言的字符进行排序。
默认情况下,归类根据表中分配的权重值对具有 DUCET 表(默认 Unicode 归类元素表)中列出的代码点的字符进行排序。排序规则使用隐式权重值对 DUCET 表中没有列出代码点的字符进行排序,该权重值是根据 UCA 构造的。
对于非特定语言的归类,收缩序列中的字符被视为单独的字符。对于特定于语言的归类,缩写可能会更改字符排序顺序。
有关详细信息,请参阅 Unicode 字符集。
Microsoft Windows: 为了在 Windows 上构建 MySQL,工具链现在尽可能首选 64 位工具(以前是 32 位)。这会加快链接速度并避免与 32 位链接器的地址空间有限相关的问题。(缺陷 #80675,缺陷 #22900585)
如果可用且未明确禁用, CMake现在会导致构建过程与 GNU gold链接器链接。要禁用此链接器,请指定CMake选项。(缺陷 #23759968,缺陷 #82163)
-DUSE_LD_GOLD=OFF
WITH_EXTRA_CHARSETS
CMake选项已被删除 。MySQL 构建现在默认配置了所有字符集。想要更少字符集的用户可以cmake/character_sets.cmake
直接编辑并重新编译服务器。(缺陷 #80005,缺陷 #22552125)服务器构建的 Boost 库的最低版本现在是 1.60.0。(缺陷 #79380,缺陷 #22253921)
已完成清理源代码库的工作,包括: 删除不需要的CMake检查;从源文件中删除未使用的宏;重组头文件以减少依赖项的数量并使它们更加模块化,删除没有定义的函数声明,用行业标准库中的等效函数替换本地编写的函数。
-
MySQL 源代码现在允许并使用 C++11 功能。为了在所有支持的平台上实现良好的 C++11 支持,现在适用以下最低编译器版本:
海湾合作委员会:4.8 或更高
Clang:3.4 或更高版本(OS X 上的 Xcode 7)
Solaris Studio:12.4 或更高版本(仅限 Solaris 客户端构建)
视觉工作室:2015
CMake:在 Windows 上,所需的 Visual Studio 版本导致所需的 CMake 版本为 3.2.3 或更高版本
在 Solaris 上,
stlport
不再使用该库。这使得SUNPRO_CXX_LIBRARY
CMake选项已过时,因此已将其删除。
-
MySQL Server 现在包含一个基于组件的基础架构,用于提高服务器的可扩展性:
组件提供服务器和其他组件可用的服务。(就服务使用而言,服务器是一个组件,与其他组件是平等的。)组件之间仅通过它们提供的服务进行交互。
INSTALL COMPONENT
and 语句为运行时 的UNINSTALL COMPONENT
组件操作提供了一个 SQL 接口。加载程序服务在
mysql.component
系统表中注册已安装的组件,并在后续服务器重新启动的启动序列期间安装已注册的组件。
有关组件基础结构及其 SQL 级接口的一般信息,请参阅MySQL 组件。有关组件内部实现的信息,请参阅 MySQL Server Doxygen 文档,网址为 https://mysql.net.cn/doc/index-other.html。
不相容的变化;InnoDB: 以前,启用 存储
innodb_read_only
创建和删除表InnoDB
从 MySQL 8.0 开始。启用innodb_read_only
会阻止所有存储引擎的这些操作。表创建和删除操作修改mysql
系统数据库中的数据字典表,但这些表使用 启用InnoDB
时不能修改innodb_read_only
同样的原则适用于其他需要修改数据字典表的表操作,以及修改mysql
数据库中使用InnoDB
存储引擎的其他表的操作,例如授权表和func
和plugin
桌子。(漏洞 #21611899)内存映射事务协调器的 8KB 硬编码内存页面大小对于 ARM64 和 PowerPC 等页面大小要大得多的平台来说太小了。服务器现在调用系统调用来获取当前平台的页面大小,而不是使用硬编码值。该
--log-tc-size
选项的结果是最小值和默认值现在是页面大小的 6 倍。此外,该值必须是页面大小的倍数。感谢 Alexey Kopytov 提供的补丁。(错误#23014086、错误#80818、错误#26931470、错误#87995)-
MySQL 现在支持语句语法的
SET PERSIST
变体SET
,用于在运行时进行配置更改,这些更改在服务器重新启动时也会持续存在。像SET GLOBAL
,SET PERSIST
允许用于任何动态的全局系统变量(可在运行时设置)。该语句更改运行时变量值,但还将变量设置写入mysqld-auto.cnf
数据目录中命名的选项文件。启动时,服务器会在所有其他选项文件之后处理此文件。有关详细信息,请参阅 持久化系统变量。为了提供显示每个系统变量最近如何设置的信息,Performance Schema 现在有一个
variables_info
表,其中列出了每个系统变量及其获取值的来源。请参阅性能模式 variables_info 表。如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将此更改合并到性能模式中。
-
不兼容的更改: MySQL 服务器现在合并了一个全局数据字典,其中包含有关事务表中数据库对象的信息。在以前的 MySQL 版本中,字典数据存储在元数据文件和非事务性系统表中。
重要的与没有数据字典的服务器相比,启用数据字典的服务器需要一些一般操作差异;请参阅 数据字典用法差异。此外,对于升级到 MySQL 8.0,升级过程与以前的 MySQL 版本有些不同,需要您通过检查特定的先决条件来验证安装的升级准备情况。有关详细信息,请参阅 升级 MySQL,特别是 准备安装以进行升级。
InnoDB
在 MySQL 8.0.0 版本中继续使用自己的数据字典。以下列表简要描述了此更改的主要影响:
-
以前与基表和视图关联的
.frm
元数据文件不再存在。以前存储在.frm
文件中的元数据现在存储在数据字典表中。.TRG
同样,以前存储在和文件中的 触发器元数据存储.TRN
在数据字典表中,这些文件不再存在。 随着文件的删除,文件结构
.frm
强加的 64KB 表定义大小限制.frm
被删除。随着
.frm
文件的删除,该 字段现在报告硬编码值,这是 MySQL 5.7 中使用的最后一个 文件版本。INFORMATION_SCHEMA.TABLES
VERSION
10
.frm
随着
.frm
文件的删除,sync_frm
系统变量也被删除。为 MySQL 数据字典提供服务的新字典对象缓存将以前访问的数据字典对象存储在内存中,以实现对象重用并最大限度地减少磁盘 I/O。基于 LRU 的逐出策略用于从内存中逐出最近最少使用的对象。缓存包含多个存储不同对象类型的分区。有关详细信息,请参阅 字典对象缓存。
-
新的内部数据字典 API 使服务器、内部存储引擎和插件能够访问和存储 MySQL 数据字典中的数据。引入了内部数据字典 API 来处理模式、表空间、表空间文件、表、分区表、表分区数据、触发器、存储例程、事件、表对象、视图、字符集和排序规则。
通过此更改,数据字典更新和二进制日志写入
CREATE TRIGGER
和DROP TRIGGER
操作被组合到一个单一的原子事务中。 -
数据字典表是不可见的,但大多数情况下有对应的
INFORMATION_SCHEMA
表可以代替查询。这使得底层数据字典表能够随着服务器开发的进行而改变,同时保持INFORMATION_SCHEMA
应用程序使用的稳定接口。一些
INFORMATION_SCHEMA
表已完全重新实现为数据字典表的视图:CHARACTER_SETS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY COLUMNS KEY_COLUMN_USAGE SCHEMATA STATISTICS TABLES TABLE_CONSTRAINTS VIEWS
现在对这些表的查询更加高效,因为它们从数据字典表中获取信息,而不是通过其他更慢的方式。特别是,对于
INFORMATION_SCHEMA
作为数据字典表视图的每个表:服务器不再必须为表的每个查询创建一个临时
INFORMATION_SCHEMA
表。当底层数据字典表存储以前通过目录扫描(例如,枚举数据库名称或数据库中的表名称)或文件打开操作(例如,从
.frm
文件中读取信息)获得的值时,INFORMATION_SCHEMA
对这些值的查询现在使用表查找代替。(此外,即使对于非视图INFORMATION_SCHEMA
表,数据库和表名等值也是通过从数据字典中查找来检索的,不需要目录或文件扫描。)基础数据字典表上的索引允许优化器构建高效的查询执行计划,这对于以前的
INFORMATION_SCHEMA
每个查询使用临时表处理表的实现来说是不正确的。
上述改进也适用于
SHOW
显示与作为INFORMATION_SCHEMA
数据字典表视图的表相对应的信息的语句。例如, 显示与表格SHOW DATABASES
相同的信息 。SCHEMATA
对于
INFORMATION_SCHEMA
检索表统计信息的查询,服务器现在可以使用缓存在INFORMATION_SCHEMA
表中的统计信息,或者直接从存储引擎获取最新的统计信息。系统information_schema_stats
变量控制服务器使用哪个统计源。当
information_schema_stats
是CACHED
(默认)时,服务器使用存储在STATISTICS
和TABLES
表中的缓存统计信息。-
时
information_schema_stats
,LATEST
服务器直接从存储引擎获取统计信息。在这种情况下,服务器将对 和 的查询视为STATISTICS
对 和 表TABLES
中存储的最新统计信息的查询 。STATISTICS_DYNAMIC
TABLES_DYNAMIC
受影响
INFORMATION_SCHEMA
的表统计列包括:STATISTICS.CARDINALITY TABLES.AUTO_INCREMENT TABLES.AVG_ROW_LENGTH TABLES.CHECKSUM TABLES.CHECK_TIME TABLES.CREATE_TIME TABLES.DATA_FREE TABLES.DATA_LENGTH TABLES.INDEX_LENGTH TABLES.MAX_DATA_LENGTH TABLES.TABLE_ROWS TABLES.UPDATE_TIME
有关详细信息,请参阅 优化 INFORMATION_SCHEMA 查询。
-
foreign_keys
和 表现 在foreign_key_column_usage
存储外键信息。SQL获取外键信息的标准方式是使用INFORMATION_SCHEMA
REFERENTIAL_CONSTRAINTS
andKEY_COLUMN_USAGE
表;这些表现在作为 、 和其他数据字典表的视图来foreign_keys
实现foreign_key_column_usage
。对于某些外键错误,服务器现在会生成更合适且信息更丰富的错误消息。
笔记不兼容: 以前,MySQL 支持长度超过 64 个字符的外键名称。根据 SQL 标准,存储在
foreign_keys
和foreign_key_column_usage
表中的外键名称最多为 64 个字符,因此不再允许使用更长的外键名称。 因为数据字典提供了有关数据库对象的信息,所以服务器不再检查数据目录中的目录名称来查找数据库。因此,
--ignore-db-dir
选项和ignore_db_dirs
系统变量是无关的并且已被删除。相应地更新系统配置和应用程序。以前,通过使用
CREATE TEMPORARY TABLE
不存在的数据库名称限定表名,可以使用它在不存在的数据库中创建表。这不再被允许。-
系统表变化:
许多系统表已从
MyISAM
(非事务)表转换为InnoDB
(事务)表。例如,正如这些发行说明中其他地方所讨论的,授权表现在是InnoDB
表。其他示例如下。-
现在系统数据库
func
中存储可加载函数信息的表 是一个 (事务)表。以前,它是一个 (非事务性)表。mysql
InnoDB
MyISAM
由于此更改,
CREATE FUNCTION
andDROP FUNCTION
语句会导致隐式提交,即使用于可加载函数时也是如此(请参阅导致隐式提交的语句)。以前,它们在用于存储函数时会导致隐式提交,但不会用于可加载函数。 -
以前,有关存储例程和事件的信息存储在系统数据库的表
proc
和event
表中 。mysql
这些表不再使用。相反,有关存储例程和事件的信息存储在 系统数据库的routines
、events
和parameters
数据字典表中。mysql
旧表使用MyISAM
(非事务性)存储引擎。新表使用InnoDB
(事务)引擎。以前,创建包含非法字符的存储例程会产生警告。现在这是一个错误。
为了将对系统表(例如,时区或日志表)的访问与对非系统表的访问区分开来,服务器使用
Locking system tables
和Opening system tables
线程状态而不是System lock
和Opening tables
线程状态。请参阅 一般线程状态。
-
InnoDB
变化:持久
InnoDB
表空间现在包括序列化字典信息 (SDI)的事务存储,它是序列化形式的字典对象数据。随着.frm
前面提到的元数据文件的消失和触发器元数据文件的消失,您可能会注意到.SDI
文件的出现。这些是序列化的词典信息文件。SDI 事务存储是为尚未完全实现的正在进行的功能保留的。一个新的命令行实用程序ibd2sdi用于从持久
InnoDB
表空间中提取序列化字典信息 (SDI)。InnoDB
在此版本中,SDI 数据不存在于持久 表空间中。ibd2sdi实用程序保留供将来使用。InnoDB
重构启动代码以支持与 MySQL 数据字典功能相关的 MySQL 初始化更改。
-
升级和降级影响:
要从 MySQL 5.7 升级到 MySQL 8.0,您必须执行 升级 MySQL中描述的升级过程。
仅支持使用逻辑降级方法( mysqldump降级)从 MySQL 8.0 降级到 MySQL 5.7。不支持就地降级。
(缺陷 #80481,缺陷 #22811659)
-
-
位函数和运算符包括
BIT_COUNT()
,BIT_AND()
,BIT_OR()
,BIT_XOR()
,&
,|
,^
,~
,<<
和>>
。在 MySQL 8.0 之前,位函数和运算符需要BIGINT
(64 位整数)参数和返回BIGINT
值,因此它们的最大范围为 64 位。非参数在执行操作之前BIGINT
被转换为并且可能发生截断。BIGINT
现在,位函数和运算符允许二进制字符串类型参数(BINARY
、VARBINARY
和BLOB
类型)并返回类似类型的值,这使它们能够接受参数并生成大于 64 位的返回值。非二进制字符串参数将BIGINT
像以前一样转换为并进行处理。允许位函数和运算符使用二进制字符串参数不仅可以更轻松地操作更大的值,还可以更轻松地对某些类型的数据(例如 UUID 和 IPv6 值)执行以前不容易完成的位操作。有关示例,请参阅位函数和运算符。
这种行为变化的含义是二进制字符串参数的位操作可能在 MySQL 8.0 中产生与 5.7 中不同的结果。有关如何在 MySQL 5.7 中为 MySQL 5.7 和 8.0 之间的潜在不兼容性做准备的信息,请参阅MySQL 5.7 参考手册中的 位函数和运算符。
-
重要变更;InnoDB: 以下
InnoDB
文件格式配置选项在 MySQL 5.7.7 中已弃用,现在已删除:innodb_file_format
innodb_file_format_check
innodb_file_format_max
innodb_large_prefix
文件格式配置选项对于创建与
InnoDB
MySQL 5.1 早期版本兼容的表是必需的。现在 MySQL 5.1 已经到达其产品生命周期的末尾,不再需要这些选项。该
FILE_FORMAT
列已从INNODB_SYS_TABLES
和INNODB_SYS_TABLESPACES
信息架构表中删除。 InnoDB:
innodb_stats_sample_pages
删除 了innodb_stats_sample_pages
在 MySQL 5.6.3 中被弃用并被innodb_stats_transient_sample_pages
.InnoDB:
innodb_locks_unsafe_for_binlog
删除 了innodb_locks_unsafe_for_binlog
在 MySQL 5.6.3 中被弃用。READ COMMITTED
隔离级别提供类似 的InnoDB:
innodb_support_xa
删除了支持 XA 事务中的两阶段提交 的从 MySQL 5.7.10 开始,InnoDB
始终启用 XA 事务中对两阶段提交的支持。-
已弃用的mysql_install_db程序已从 MySQL 发行版中删除。应该通过 使用 或 选项调用mysqld来执行数据目录初始化。此外,mysql_install_db 使用的 mysqld 的弃用 选项已 被删除 , 控制mysql_install_db 安装位置的 选项也已删除。
--initialize
--initialize-insecure
--bootstrap
INSTALL_SCRIPTDIR
CMake
版本 1 测试套件代码以前位于
mysql-test/lib/v1
MySQL 源代码分发目录中。此代码使用 了mysql_install_db并已被删除。不再支持 环境变量和环境变量的MYSQL_INSTALL_DB
值为 1 。MTR_VERSION
mysql_plugin实用程序已被删除。备选方案包括在服务器启动时使用
--plugin-load
or--plugin-load-add
选项加载插件,或在运行时使用INSTALL PLUGIN
语句加载插件。已弃用的
mysql_shutdown()
C API 函数和相应的COM_SHUTDOWN
客户端/服务器协议命令已被删除。相反,用于mysql_query()
执行SHUTDOWN
语句。
-
MySQL 源代码已更新为使用 Doxygen 作为内部文档。这是一个进展中的工作。随着新 MySQL 版本的分发,Doxygen 文档将得到更新,最新版本始终可从 https://mysql.net.cn/doc/index-other.html获得。
InnoDB: 存储引擎接口现在使优化器能够提供有关用于优化器估计将读取多行的扫描的记录缓冲区大小的信息。缓冲区大小可以根据估计的大小而变化。
InnoDB
使用这种可变大小的缓冲功能来利用行预取,并减少锁存和 B 树导航的开销。以前,InnoDB
使用一个小的、固定大小的缓冲区。-
优化器现在支持表级
MERGE
和NO_MERGE
提示,用于指定派生表或视图是否应合并到外部查询块或使用内部临时表具体化。例子:SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt; SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
有关详细信息,请参阅优化器提示。(缺陷 #79554,缺陷 #22328100)
-
MySQL 现在支持不可见索引。优化器根本不使用不可见索引,但会正常维护。默认情况下索引是可见的。不可见的索引使测试删除索引对查询性能的影响成为可能,而无需进行破坏性更改,如果索引被证明是必需的,则必须撤消该更改。此功能适用于
InnoDB
表,用于主键以外的索引。要控制索引是否对新索引显式不可见,请使用
VISIBLE
orINVISIBLE
关键字作为 、 或 的索引定义CREATE TABLE
的CREATE INDEX
一部分ALTER TABLE
。要改变现有索引的不可见性,请在操作中使用VISIBLE
orINVISIBLE
关键字ALTER TABLE ... ALTER INDEX
。有关详细信息,请参阅 不可见索引。 系统
mysql
数据库现在包含一个column_stats
表,用于存储有关列值的统计信息。有关详细信息,请参阅 优化器统计信息。
以前的 MySQL 系列中的开发里程碑版本使用后缀 , 进行编号 ,以指示开发里程碑。在 MySQL 8.0 中,开发版本使用后缀 . 例如,这个版本的 MySQL 是编号的。(缺陷 #80408,缺陷 #22748154)
-m
N
N
-dmr
8.0.0-dmr
-
由于使用了这些发行说明中其他地方描述的 C++11 功能,因此对包装进行了以下更改:
不再支持 Red Hat Enterprise Linux 5 和 Oracle Linux 5 RPM
通用二进制 tarball 构建已移至 Red Hat Enterprise Linux 6
-
不兼容的更改:
SELECT
和 的解析器规则UNION
被重构为更加一致(相同的SELECT
语法在每个此类上下文中统一应用)并减少重复。这项工作产生了几个用户可见的效果,可能需要重写某些语句:NATURAL JOIN
允许可选INNER
关键字 (NATURAL INNER JOIN
),符合标准 SQL。... JOIN ... JOIN ... ON ... ON
根据标准 SQL, 允许不带括号的右深度连接(例如, )。STRAIGHT_JOIN
现在允许一个USING
子句,类似于其他内部联接。解析器接受查询表达式周围的括号。例如,
(SELECT ... UNION SELECT ...)
是允许的。解析器更好地符合文档中允许放置的
SQL_CACHE
和SQL_NO_CACHE
查询修饰符。-
联合的左侧嵌套,以前只允许在子查询中使用,现在可以在顶级语句中使用。例如,这个声明现在被认为是有效的:
(SELECT 1 UNION SELECT 1) UNION SELECT 1;
-
锁定子句 (
FOR UPDATE
,LOCK IN SHARE MODE
) 只允许在非UNION
查询中使用。这意味着括号必须用于SELECT
包含锁定子句的语句。此声明不再被接受为有效:SELECT 1 FOR UPDATE UNION SELECT 1 FOR UPDATE;
相反,写这样的声明:
(SELECT 1 FOR UPDATE) UNION (SELECT 1 FOR UPDATE);
(缺陷 #11746363,缺陷 #25734)
-
的解析器规则
CREATE TABLE
被重构为与上下文无关,并提高了可维护性和可扩展性。这项工作产生了几个用户可见的效果:对于生成
NOT NULL NULL
的列,包括导致包含NOT NULL
属性的列,这与非生成的列不同。此类定义现在使用 final 属性NULL
,从而生成可为空的列(与非生成列一致)。CREATE TEMPORARY TABLE
不再允许 . 的多个实例TEMPORARY
。以前,
PARSE_GCOL_EXPR
是关键字,不能用作存储程序中的标签。它不再是关键字,可以用作标签。某些语法错误的消息相对于错误在语句中的位置更为精确。
-
不兼容的更改: 性能模式现在检测服务器错误(和警告),并通过一组摘要表公开有关它们的统计信息:
仪器
error
控制是否收集错误信息(默认启用)。几个表包含错误信息,以各种方式总结:
events_errors_summary_global_by_error
,events_errors_summary_by_account_by_error
,events_errors_summary_by_host_by_error
,events_errors_summary_by_thread_by_error
,events_errors_summary_by_user_by_error
。系统变量控制检测错误的
performance_schema_error_size
数量。
有关详细信息,请参阅 错误汇总表
如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到
performance_schema
数据库中。由于前面的更改,两个服务器错误符号被重命名:
ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS
is nowER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX
和ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS
is nowER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX
。此外,一些服务器错误代码被发现不再在服务器中使用,并且已被删除为过时的。应更新专门测试任何这些错误的应用程序:
ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE ER_BINLOG_ROW_RBR_TO_SBR ER_BINLOG_ROW_WRONG_TABLE_DEF ER_CANT_ACTIVATE_LOG ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION ER_CANT_CREATE_FEDERATED_TABLE ER_CANT_CREATE_SROUTINE ER_CANT_DELETE_FILE ER_CANT_GET_WD ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF ER_CANT_SET_WD ER_CANT_WRITE_LOCK_LOG_TABLE ER_CREATE_DB_WITH_READ_LOCK ER_CYCLIC_REFERENCE ER_DB_DROP_DELETE ER_DELAYED_NOT_SUPPORTED ER_DIFF_GROUPS_PROC ER_DISK_FULL ER_DROP_DB_WITH_READ_LOCK ER_DROP_USER ER_DUMP_NOT_IMPLEMENTED ER_ERROR_DURING_CHECKPOINT ER_ERROR_ON_CLOSE ER_EVENTS_DB_ERROR ER_EVENT_CANNOT_DELETE ER_EVENT_CANT_ALTER ER_EVENT_COMPILE_ERROR ER_EVENT_DATA_TOO_LONG ER_EVENT_DROP_FAILED ER_EVENT_MODIFY_QUEUE_ERROR ER_EVENT_NEITHER_M_EXPR_NOR_M_AT ER_EVENT_OPEN_TABLE_FAILED ER_EVENT_STORE_FAILED ER_EXEC_STMT_WITH_OPEN_CURSOR ER_FAILED_ROUTINE_BREAK_BINLOG ER_FLUSH_MASTER_BINLOG_CLOSED ER_FORM_NOT_FOUND ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED ER_FRM_UNKNOWN_TYPE ER_GOT_SIGNAL ER_GRANT_PLUGIN_USER_EXISTS ER_GTID_MODE_REQUIRES_BINLOG ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST ER_HASHCHK ER_INDEX_REBUILD ER_INNODB_NO_FT_USES_PARSER ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR ER_LOAD_DATA_INVALID_COLUMN_UNUSED ER_LOGGING_PROHIBIT_CHANGING_OF ER_MALFORMED_DEFINER ER_MASTER_KEY_ROTATION_ERROR_BY_SE ER_NDB_CANT_SWITCH_BINLOG_FORMAT ER_NEVER_USED ER_NISAMCHK ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR ER_NO_FILE_MAPPING ER_NO_GROUP_FOR_PROC ER_NO_RAID_COMPILED ER_NO_SUCH_KEY_VALUE ER_NO_SUCH_PARTITION__UNUSED ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED ER_ORDER_WITH_PROC ER_PARTITION_SUBPARTITION_ERROR ER_PARTITION_SUBPART_MIX_ERROR ER_PART_STATE_ERROR ER_PASSWD_LENGTH ER_QUERY_ON_MASTER ER_RBR_NOT_AVAILABLE ER_SKIPPING_LOGGED_TRANSACTION ER_SLAVE_CHANNEL_DELETE ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT ER_SLAVE_MUST_STOP ER_SLAVE_WAS_NOT_RUNNING ER_SLAVE_WAS_RUNNING ER_SP_GOTO_IN_HNDLR ER_SP_PROC_TABLE_CORRUPT ER_SQL_MODE_NO_EFFECT ER_SR_INVALID_CREATION_CTX ER_TABLE_NEEDS_UPG_PART ER_TOO_MUCH_AUTO_TIMESTAMP_COLS ER_UNEXPECTED_EOF ER_UNION_TABLES_IN_DIFFERENT_DIR ER_UNSUPPORTED_BY_REPLICATION_THREAD ER_UNUSED1 ER_UNUSED2 ER_UNUSED3 ER_UNUSED4 ER_UNUSED5 ER_UNUSED6 ER_VIEW_SELECT_DERIVED_UNUSED ER_WRONG_MAGIC ER_WSAS_FAILED
以前,Performance Schema 表中的
DIGEST
和DIGEST_TEXT
列events_statements_current
仅在语句执行结束后才填充。现在,列在解析之后和语句执行开始之前被填充。这使监视应用程序能够在语句执行期间访问语句摘要信息。(缺陷号 23336542)以前,Performance Schema 优化的重点是减少收集监控数据所涉及的开销。作为对早期工作的补充,检索该数据的性能模式查询的开销现在也减少了。这是通过向大多数 Performance Schema 表添加索引来实现的,这使优化器可以访问除全表扫描之外的执行计划。这些索引还提高了相关对象的性能,例如
sys
使用这些表的模式视图。有关详细信息,请参阅 优化性能模式查询。ROLE
Performance Schema 表的列的 大小setup_actors
从 16 个字符增加到 32 个字符。
系统
validate_password_check_user_name
变量现在默认启用而不是禁用。这意味着当validate_password
启用插件时,默认情况下它现在拒绝与当前会话用户名匹配的密码。-
客户端
--ssl
和--ssl-verify-server-cert
选项已被删除。使用--ssl-mode=REQUIRED
代替--ssl=1
或--enable-ssl
。使用--ssl-mode=DISABLED
代替--ssl=0
,--skip-ssl
, 或--disable-ssl
。使用--ssl-mode=VERIFY_IDENTITY
而不是--ssl-verify-server-cert
选项。(服务器端--ssl
选项保持不变。)对于 C API,
MYSQL_OPT_SSL_ENFORCE
和MYSQL_OPT_SSL_VERIFY_SERVER_CERT
选项mysql_options()
对应于客户端--ssl
和--ssl-verify-server-cert
选项,已被删除。MYSQL_OPT_SSL_MODE
与选项值SSL_MODE_REQUIRED
or 一起使用SSL_MODE_VERIFY_IDENTITY
。
用于导入和导出 Well-Known Text (WKT) 值的空间函数使用 MySQL
'GEOMETRYCOLLECTION()'
非标准语法而不是 OpenGIS'GEOMETRYCOLLECTION EMPTY'
标准语法。现在两种语法都可以理解为导入,标准语法用于导出。请参阅 从 WKT 值创建几何值的函数。(错误#23632147,错误#81964)和空间函数现在允许使用可选的第二个参数
ST_X()
,ST_Y()
分别指定 X 或 Y 坐标值。对于两个参数,函数结果是第一个参数的点值,并修改了适当的坐标。此外, 如果参数是一个有效的几何图形而不是一个点,ST_X()
现在ST_Y()
只有一个参数的 and 会更严格并且会产生ER_UNEXPECTED_GEOMETRY_TYPE
错误而不是返回。NULL
有关详细信息,请参阅点属性函数。空间函数现在允许使用可选的
ST_SRID()
第二个参数来指定 SRID 值。对于两个参数,函数结果是第一个参数的几何值,其 SRID 根据第二个参数修改。有关详细信息,请参阅 一般几何特性函数。-
MySQL 现在存储有关 SRID 0 以外的空间参考系统的信息,以用于空间数据。此信息存储在
st_spatial_reference_systems
数据字典表中,并基于 EPSG 数据集 8.7。有关空间参考系统的信息,请参阅 空间参考系统支持。以前,
ST_IsValid()
、ST_MakeEnvelope()
和ST_Validate()
函数需要 SRID 为 0 的几何参数。它们现在接受具有 SRID 的几何参数用于投影空间参考系统。 -
在 MySQL 5.7 中,多个名称下可用的几个空间函数已被弃用,以朝着使空间函数命名空间更加一致的方向移动,目标是每个空间函数名称
ST_
如果执行精确操作则以开头,或者MBR
如果它执行一个基于最小边界矩形的操作。已弃用的函数现在已被删除,只留下相应的ST_
和MBR
函数:这些功能已被删除,取而代之的是
MBR
名称:Contains()
,Disjoint()
,Equals()
,Intersects()
,Overlaps()
,Within()
。删除了这些函数,取而代之的 是
ST_
名称:Area()
,AsBinary()
,AsText()
,AsWKB()
,AsWKT()
,Buffer()
,Centroid()
,ConvexHull()
,Crosses()
,Dimension()
,Distance()
,EndPoint()
,Envelope()
,ExteriorRing()
,GeomCollFromText()
,GeomCollFromWKB()
,GeomFromText()
,GeomFromWKB()
,GeometryCollectionFromText()
,GeometryCollectionFromWKB()
,GeometryFromText()
,GeometryFromWKB()
,GeometryN()
,GeometryType()
,InteriorRingN()
,IsClosed()
,IsEmpty()
,IsSimple()
LineFromText()
LineFromWKB()
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 。LineStringFromText()
_LineStringFromWKB()
_MLineFromText()
_MLineFromWKB()
_MPointFromText()
_MPointFromWKB()
_MPolyFromText()
_MPolyFromWKB()
_MultiLineStringFromText()
_MultiLineStringFromWKB()
_MultiPointFromText()
_MultiPointFromWKB()
_MultiPolygonFromText()
_MultiPolygonFromWKB()
_NumGeometries()
_NumInteriorRings()
_NumPoints()
_PointFromText()
_PointFromWKB()
_PointN()
_PolyFromText()
_PolyFromWKB()
_PolygonFromText()
_PolygonFromWKB()
_SRID()
_StartPoint()
_Touches()
_X()
_Y()
GLength()
被删除以支持ST_Length()
.
mysql-test-run.pl现在支持一个
--do-suite
选项,它类似于--do-test
但允许指定要运行的整套测试。(缺陷号 24350345)如果要删除的目录包含任何文件或目录,则 mysqltest 命令 失败。
rmdir
为了递归删除目录及其内容(如果有),mysqltest现在支持一个force-rmdir
命令。(漏洞#24316799)-
两个新的测试套件选项可以更轻松地调试测试用例:
mysql-test-run.pl支持一个 选项,可以将选项传递给 mysqltest。
--mysqltest=
options
mysqltest支持一个
--trace-exec
选项,使它立即将已执行程序的输出打印到stdout
.
mysql-test-run.pl现在可以识别
MTR_CTEST_TIMEOUT
环境变量。如果设置,该值是传递给 ctest单元测试命令的超时秒数。(错误#21821049,错误#21278845) -
对于 MySQL 测试套件中的测试用例,以前可以
--error
仅针对服务器错误对命令使用符号错误名称。现在也可能出现客户端错误。例如:--error CR_SERVER_GONE_ERROR
(错误#21048973,错误#76972)
mysqltest程序现在有一个 命令,可以
copy_files_wildcard
将与模式匹配的所有文件从源目录复制到目标目录。请参阅 MySQL Server Doxygen 文档,网址为 https://mysql.net.cn/doc/index-other.html。(缺陷 #82111,缺陷 #23743035)
Protobuf
解码器类将嵌套对象的数量限制为 50(默认值) 。(漏洞 #23707238,漏洞 #82025)该语句
list_objects
错误地将表报告为集合。(漏洞 #23631240)该语句创建了一个集合表,该表在列上而不是在主键
create_collection
上具有唯一键索引 。'_id'
(漏洞 #23284569)
-
不相容的变化;分区: 通用分区处理程序已从 MySQL 服务器中删除。作为此更改的一部分, mysqld不再支持
--partition
和--skip-partition
选项,并且服务器不能再使用-DWITH_PARTITION_STORAGE_ENGINE
.partition
也不再显示在 的输出中SHOW PLUGINS
或INFORMATION_SCHEMA.PLUGINS
表中。为了支持给定表的分区,用于表的存储引擎现在必须提供自己的(“本机”)分区处理程序。
InnoDB
是 MySQL 8.0 中唯一支持的存储引擎,它包括一个本机分区处理程序。尝试使用任何其他存储引擎在 MySQL 8.0 中创建分区表失败。(NDB
MySQL NDB Cluster 使用的存储引擎也提供了自己的分区处理程序,但目前 MySQL 8.0 不支持。)对升级的影响。 不支持使用非
InnoDB
(如MyISAM
)存储引擎的分区表从MySQL 5.7(或更早版本)直接升级到MySQL 8.0。将此类表升级为与 MySQL 8.0 兼容有两种选择,此处列出:删除表的分区;
ALTER TABLE ... REMOVE PARTITIONING
您可以通过执行一条语句 来做到这一点而不会丢失任何数据 。-
将用于表的存储引擎更改为
InnoDB
,使用ALTER TABLE ... ENGINE=INNODB
;这使表的分区保持不变。InnoDB
在将服务器升级到 MySQL 8.0 之前,必须对任何分区的非表至少执行这些操作之一。否则,升级后无法使用此类表。有关将
MyISAM
表转换为 的信息InnoDB
,请参阅 将表从 MyISAM 转换为 InnoDB。
将数据库从使用 mysqldump在 MySQL 5.7 或更早版本中创建的转储文件导入 MySQL 8.0 服务器时会遇到类似的情况,因为在没有此类支持的情况下使用存储引擎会导致分区表的表创建语句在 MySQL 8.0 中因错误而失败。出于这个原因,您必须确保转储文件中创建分区表的任何语句也不会指定不受支持的存储引擎。您可以通过从 使用除 以外
CREATE TABLE
的选项值的语句中删除对分区的任何引用,或者通过将存储引擎指定为(或允许STORAGE ENGINE
InnoDB
InnoDB
InnoDB
默认使用)。有关详细信息,请参阅 与存储引擎相关的分区限制。
InnoDB:
innodb_buffer_pool_debug
当缓冲池大小小于 1GB 时, 该innodb_buffer_pool_instances
. (缺陷号 24287290)InnoDB: 一个新的动态配置选项,
innodb_deadlock_detect
可用于禁用死锁检测。在高并发系统上,当大量线程等待同一个锁时,死锁检测会导致速度减慢。innodb_lock_wait_timeout
有时,禁用死锁检测并依赖发生死锁时事务回滚的设置可能更有效 (漏洞#23477773)InnoDB: 该
libinnodb_zipdecompress.a
库允许外部工具使用该page_zip_decompress_low()
功能来解压缩InnoDB
页面。(缺陷 #21405300,缺陷 #77664)InnoDB: 为了解决在某些工作负载下可能发生的争用,缓冲池互斥锁被删除并替换为多个列表和散列保护互斥锁。此外,几个与缓冲池相关的变量不再需要缓冲池互斥保护。感谢 Yasufumi Kinoshita 和 Laurynas Biveinis 提供补丁。(缺陷 #20381905,缺陷 #75534)
-
InnoDB:
InnoDB
现在避免了在操作期间每 10000 行发生一次的中间提交ALTER TABLE ALGORITHM=COPY
。中间提交的目的是在操作中止的情况下加快恢复速度ALTER TABLE ALGORITHM=COPY
。如果一个ALTER TABLE ALGORITHM=COPY
操作被中止,新的、未提交的表现在在回滚撤消日志之前的 DDL 日志恢复期间被删除,从而避免了对未提交的表进行耗时的数据回滚。ALTER TABLE ALGORITHM=COPY
除非有一个IGNORE
子句或其他需要回滚功能的东西, 现在禁止对操作进行撤消日志记录如果正在更改的表上有全文索引,则当
ALTER TABLE ALGORITHM=COPY
操作将行插入到新的未提交表中时,全文数据将插入到全文辅助表中。以前,全文数据仅在事务提交时处理。(漏洞#17479594) InnoDB: 为了减少多个清除线程从同一个表中清除行可能导致的读写锁争用,撤消记录现在按表 ID 分组并分配给不同的清除线程。
InnoDB:
InnoDB
代码现在使用 C++std::thread
库进行线程管理。InnoDB: memcached
InnoDB
插件 现在支持多个get
操作(在单个 memcached查询中获取多个键/值对)和范围查询。请参阅 InnoDB memcached 多获取和范围查询支持。InnoDB: 当遇到索引树损坏时,
InnoDB
将损坏标志写入重做日志,这使得损坏标志崩溃安全。InnoDB
还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间,InnoDB
在将内存表和索引对象标记为损坏之前,从两个位置读取损坏标志并合并结果。-
InnoDB:
InnoDB
在 MySQL 数据目录之外创建表空间数据文件时不再创建.isl
文件(InnoDB
符号链接文件)。.isl
通过此更改,不支持 在服务器离线时通过手动修改文件来移动远程表空间。 -
InnoDB:
InnoDB
不再支持压缩临时表。启用时innodb_strict_mode
(默认值), 或CREATE TEMPORARY TABLE
返回错误 。如果 禁用,则会发出警告并使用非压缩行格式创建临时表。ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE
innodb_strict_mode
通过此更改,所有临时表都在共享临时表空间中创建,
ibtmp1
.和列已从 中
PER_TABLE_TABLESPACE
删除 。IS_COMPRESSED
INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO
InnoDB: 新 每个索引缓存在缓冲池中
INFORMATION_SCHEMA.INNODB_CACHED_INDEXES
的索引页数InnoDB
InnoDB:
innodb_checksums
删除 了在 MySQL 5.6.3 中innodb_checksums
被替换为innodb_checksum_algorithm
InnoDB:
InnoDB
重构了启动代码。-
InnoDB: 默认
innodb_flush_method
值不再是NULL
. 在类 Unix 系统上,默认值为fsync
. 在 Windows 系统上,默认值为unbuffered
.在 Windows 上,该
innodb_flush_method
设置不再影响innodb_use_native_aio
设置。innodb_flush_method
现在在 Windows 上 有两种可能的设置 ,unbuffered
(unbuffered I/O) 和normal
(buffered I/O)。通过此更改,您可以启用带缓冲 I/O 的异步 I/O,这是一个新的组合(innodb_use_native_aio=ON
和innodb_flush_method=normal
)。该async_unbuffered
设置已删除。您现在可以 使用数值 设置
innodb_flush_method
和 配置选项。innodb_change_buffering
-
InnoDB: 在 MySQL 数据目录之外创建 file-per-table 表空间数据文件时
InnoDB
不再创建 现在使用重做日志来定位远程表空间数据文件。.isl
InnoDB
.isl
不再支持 通过修改文件在 MySQL 数据目录之外创建的 file-per-table 表空间数据文件的脱机重定位 。 -
InnoDB: 当前最大自动增量计数器值现在每次值更改时都写入重做日志,并保存到每个检查点上的引擎私有系统表。这些更改使当前最大自动递增计数器值在服务器重新启动后保持不变。此外:
有关更多信息,请参阅 InnoDB 中的 AUTO_INCREMENT 处理和 InnoDB AUTO_INCREMENT 计数器初始化。(错误 #199,错误 #13726455)
-
复制:对于如何将CHANGE MASTER TO 语句写入错误日志 (
mysqld.log
) ,有两个改进以前,选项说明之间没有逗号(例如
MASTER_USER =
andMASTER_PASSWORD =
),所以用户想通过复制和粘贴使用语句必须手动插入逗号。将语句写入错误日志时,现在会插入逗号。当文字“ <secret> ”作为
MASTER_PASSWORD
值的占位符插入时,现在不使用引号,因此在复制和粘贴之前忘记用真实密码替换文字的用户会立即出现语法错误,而不是遇到其他问题。
(漏洞 #18194384)
复制: 现在可以恢复基于 GTID 的复制服务器的备份,因为您可以将 GTID 添加到
gtid_purged
,无论是否gtid_executed
为空。这使您能够从基于 GTID 的复制服务器还原备份,而不会丢失现有的 GTID 信息和二进制日志。要添加的 GTID 是备份时存在的 GTIDgtid_executed
。的语法SET GTID_PURGED
已扩展,以便 添加到现有的 GTID 集。SET GTID_PURGED ="+
gtid_set
"gtid_set
gtid_purged
复制: 添加了新的 Performance Schema 阶段以显示基于行的复制的进度。您可以使用这些阶段来检查基于行的复制中缓慢操作的进度。此外,您还可以找出正在应用更改的数据库。这有助于解决基于行的复制问题,并提供有关性能调整的更多信息。有关详细信息,请参阅 监视基于行的复制
-
JSON: 此版本添加了一个不加引号的提取运算符
->>
,有时也称为内联路径运算符,用于JSON
存储在 MySQL 中的文档。new 运算符与 operator 类似->
,但也会对值执行 JSON 取消引用。对于一个 JSON 列mycol
和 JSON 路径表达式mypath
,下面三个表达式是等价的:JSON_UNQUOTE(mycol
->
"$.mypath")
mycol->>"$.mypath"
->>
运算符可以在任何JSON_UNQUOTE(JSON_EXTRACT())
允许 的SQL 语句中使用。这包括(但不限于)SELECT
列表、条款和WHERE
条款 。HAVING
ORDER BY
GROUP BY
有关详细信息,请参阅 搜索 JSON 值的函数和 JSON 路径语法。(错误#78736,错误#21980346)
为了产生更准确的估计,
MEMORY
存储引擎现在使用浮点而不是整数算法来计算索引统计信息(每个键估计的记录)。(漏洞 #23024059)一个新的CMake选项,
INSTALL_STATIC_LIBRARIES
可以控制是否安装静态库。默认值为ON
。如果设置为OFF
,则不会安装这些库:libmysqlclient.a
、libmysqld.a
、libmysqlservices.a
。(漏洞 #22891432)-
内部
mysql_prepare_create_table()
服务器功能已经过重构,以提高代码的可维护性和清晰度。CREATE TABLE
此代码修订导致和 的行为发生以下微小变化ALTER TABLE
:尝试基于
NULL
列创建第二个主键现在会产生ER_MULTIPLE_PRI_KEY
错误,而不是ER_PRIMARY_CANT_HAVE_NULL
.尝试基于生成的列创建第二个主键现在会产生
ER_MULTIPLE_PRI_KEY
错误,而不是ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
.尝试在列上创建全文键
JSON
现在会产生ER_JSON_USED_AS_KEY
错误,而不是ER_BAD_FT_COLUMN
.尝试在不支持密钥(例如
EXAMPLE
)的存储引擎中创建密钥现在会产生ER_TOO_MANY_KEYS
错误而不是ER_TOO_MANY_KEY_PARTS
。
(漏洞#22884886)
以前,性能模式不是为
libmysqld
嵌入式服务器构建的。这阻止了使用SHOW STATUS
andSHOW VARIABLES
语句 withshow_compatibility_56=OFF
因为,使用该设置,这些语句从 Performance Schema 表中获取结果。现在,对于libmysqld
,构建了所需的性能模式表(没有收集任何检测),以便SHOW
可以使用 支持这些语句show_compatibility_56=OFF
。(缺陷号 22809694)JSON_CONTAINS()
在执行 JSON 对象检查时, 、 和其他 MySQL JSON 函数使用的几个内部函数JSON_SEARCH()
创建了过多的键、值或两者的本地副本。在许多情况下,此类复制已被消除或减少。此外,其中一些函数使用的临时对象的生命周期已缩短。这些更改应该使这些和相关的 JSON 函数比以前更有效地执行,并且需要更少的资源。(漏洞 #22602142)如果系统lz4和openssl zlib命令可用, 则不需要lz4_decompress和 zlib_decompress实用程序。两项更改使这些实用程序无法构建:如果新的 CMake 选项设置为, 则不会构建或安装lz4_decompress 。如果CMake选项设置为 ,则不会构建或安装zlib_decompress 。(缺陷号 22329851)
WITH_LZ4
system
WITH_ZLIB
system
MySQL 字符串库的源文件已从 C(
.c
后缀)转换为 C++(.cc
后缀)。这样可以在库代码中启用更严格的编译检查和 C++ 功能的使用。(漏洞 #22124719)该库的源代码
mysys
现在使用 C++ 而不是 C,以利用更严格的编译检查并允许使用 C++ 功能。(漏洞#21881278)为了提高性能和更好地与其他平台兼容,
my_sync()
在 OS X 上现在使用fsync()
rather thanfcntl()
withF_FULLSYNC
标志。(缺陷号 20742269)一个新的CMake选项,
WITH_TSAN
允许为支持它的编译器启用 ThreadSanitizer。(缺陷 #80409,缺陷 #23171902)以前由单个互斥锁保护的全局连接列表已分为八个部分,每个部分都由其自己的互斥锁实例保护。结果是减少了连接处理的开销并提高了性能。出于监视目的而进行的此更改的含义是,性能模式现在公开了八个不同的实例,每个实例都是
LOCK_thd_list
互斥锁、LOCK_thd_remove
互斥锁和COND_thd_list
条件变量。-
MySQL 现在提供了操作 UUID 值的函数,并使它们更易于使用:
UUID_TO_BIN()
并BIN_TO_UUID()
在字符串和二进制格式的 UUID 值之间进行转换(VARBINARY(16)
分别表示为十六进制字符和 )。这允许将字符串 UUID 值转换为占用较少存储空间的二进制值。转换为二进制的 UUID 值可以以允许提高索引效率的方式表示。IS_UUID()
返回 1 或 0 以指示其参数是否为有效的字符串格式 UUID 值。
有关这些函数的更多信息,请参阅 杂项函数
服务器现在依靠存储引擎来清理以前服务器运行留下的临时表。
InnoDB
通过在重启时丢弃临时表空间来做到这一点。MyISAM
和其他类似的存储引擎仍然依靠扫描临时目录来检测剩余表,方法是查找属于这些引擎的具有特定名称模式的文件。-
服务器不再将包含特殊字符的 MySQL 5.1 之前的数据库名称转换为带有
#mysql50#
前缀的 5.1 格式。因为不再执行这些转换,所以 删除了mysqlcheck--fix-db-names
的和--fix-table-names
选项、 语句的子句 和 状态变量。UPGRADE DATA DIRECTORY NAME
ALTER DATABASE
Com_alter_db_upgrade
仅支持从一个主要版本升级到另一个主要版本(例如,5.0 到 5.1,或 5.1 到 5.5),因此几乎不需要将旧的 5.0 数据库名称转换为当前版本的 MySQL。解决方法是先将 MySQL 5.0 安装升级到 MySQL 5.1,然后再升级到更新的版本。
不兼容的更改: 空间值的串联没有什么意义,因此
CONCAT()
和CONCAT_WS()
函数现在会为空间参数产生错误。(缺陷号 22893669)重要变更;JSON: 当与
JSON
诸如JSON_EXTRACT()
. 在这种情况下,必须引用它。(错误#79643,错误#22366102)NDB Cluster: 以前,
mysql.ndb_binlog_index
即使服务器没有构建,也会创建表NDB
。现在只有当服务器是用NDB
. (缺陷号 22874872)创新数据库;Microsoft Windows: 未指定的块大小导致
INFORMATION_SCHEMA.TABLESPACES
Windows NTFS 上的空表的簇页面大小大于或等于 8K。(缺陷号 23598872)创新数据库;Microsoft Windows:使用 Visual Studio 2015 Update 2 编译
InnoDB
返回警告。(漏洞 #23056963)-
InnoDB:
ALTER TABLE ... ALGORITHM=COPY
由于复制 10000 行后发生的中间提交,添加外键约束 的中间提交重置了外键检查标志,导致操作失败。中间提交不再发生。(缺陷 #28662255,缺陷 #92471)参考资料:另请参阅:Bug #17479594。
InnoDB:
ut_cpuid()
从用于获取有关 CPU 的信息 的函数中删除了不必要的检查 (漏洞 #24405292)InnoDB: 对已删除表空间的异步读取操作引发错误。(缺陷号 24388498)
InnoDB:
dict_col_t
访问器被添加到InnoDB
代码中。(缺陷号 24363566)InnoDB:
dict_col
代码中的函数InnoDB
被访问器取代。(漏洞 #24361098)InnoDB:
dict_index_t
代码中的函数InnoDB
被访问器取代。(漏洞 #24361023)InnoDB: 删除了检查并释放保留的自适应哈希索引搜索闩锁的不必要代码。(漏洞 #24300175)
InnoDB: 在 32 位操作系统上大于 4G 的系统表空间数据文件大小可能会导致溢出情况。(漏洞 #23753625)
InnoDB: 用于访问表对象数据的内部方法已添加到
dict_table_t
. (漏洞 #23748128)InnoDB:删除 了要求第一个撤消表空间使用
space_id
1 的限制,以避免space_id
在升级期间与现有表空间发生冲突。第一个撤消表空间现在可以使用 1space_id
以外space_id
值。撤消表空间的值仍然按连续顺序分配。(漏洞 #23517560)InnoDB: 用于迭代表索引的内部访问器函数已替换为访问器方法。删除了死代码。(缺陷号 23336108)
InnoDB:以前由 SQL 脚本创建 的
mysql.innodb_index_stats
和mysql.innodb_table_stats
因此,该dict_table_schema_check
功能不再需要并被删除。(漏洞 #23336079)InnoDB: 该
ut_snprint
函数已被 C++11snprintf
函数取代。(缺陷号 23329353)InnoDB:
ulint
为了保持一致性, 实例InnoDB
被替换为space_id_t
和page_no_t
数据类型。(缺陷号 23297169)InnoDB: 在代码中使用 boost::atomic
InnoDB
已替换为 std::atomic。(缺陷号 23280649)InnoDB: MySQL 二进制文件不是使用 NUMA 功能构建的。(缺陷号 23259754)
InnoDB:
UNIV_NONINL
对和 引用UNIV_MUST_NOT_INLINE
已删除。和fut0fut.cc
,ut0byte.cc
时才需要UNIV_NONINL
,也被删除了。(缺陷号 23150562)InnoDB: 当
mutex_own()
使用 Clang 或更新的 GCC 编译器编译时,映射导致警告。(缺陷号 23090278)InnoDB: 查询
InnoDB
内存分配事件数据的性能模式错误地报告了 0 值。(缺陷 #23020280)InnoDB:
DBUG_OFF
编译时标志被标志取代UNIV_DEBUG
。为了改进错误日志输出,ut_dbg_assertion_failed()
现在用于sql_print_error()
在一行中显示文件名、行号和消息。线程 ID 显示在后续行中。(错误#22996442,错误#23028144)InnoDB:
SHOW ENGINE INNODB STATUS
输出显示每个等待值的负旋转轮数。感谢 Laurynas Biveinis 提供补丁。(缺陷 #22844987,缺陷 #79703)InnoDB: 该
innodb_disable_resize_buffer_pool_debug
选项已删除。此更改的补丁还删除了代码变量并简化了buf_pool_resize()
功能。(漏洞 #22755053)InnoDB: 全局计数器 (
ut_rnd_ulint_counter
) 已更改为线程本地计数器,以使其在多核系统上可扩展。(漏洞 #22733635,漏洞 #80354)InnoDB: 成功
ALTER TABLE ... ALGORITHM=COPY
操作后,在构建先前版本的聚簇索引记录时引发断言。(缺陷号 22707367)InnoDB: 一种 DML 操作,它使用
row_parse_int()
. (漏洞 #22650195)InnoDB: 使用 libevent 2.0 编译时不会加载
InnoDB
memcached插件。(缺陷号 22646919)InnoDB:
rec_per_key
从 .InnoDB
在早期版本中,基于整数的rec_per_key
信息已被浮点索引统计信息取代。(缺陷号 22625348)InnoDB: 在慢速关闭时,在后台回滚线程退出之前启动了清除线程关闭,导致断言失败。(漏洞#22561332)
InnoDB:
row_vers_old_has_index_entry()
由于未释放的堆 ,块丢失了 (错误#22543834,错误#79973)InnoDB: 可传输表空间调试测试提出了一个由竞争条件引起的断言。(缺陷号 22453668)
InnoDB: 由于缺少撤消表空间,服务器无法启动。(漏洞#22452992)
InnoDB:
InnoDB
由于恢复过程引入的缓冲撤消表空间更改,在尝试关闭撤消表空间时恢复断言。(缺陷号 22361764)InnoDB: 内存缓存引用内存的重新分配引发了断言。(缺陷 #22304250,缺陷 #79500)
InnoDB:使用 C++11 构建
InnoDB
返回了 “ register ”弃用警告。在删除已弃用的“ register ”关键字后, “ register ”弃用警告的处理 此外,删除了未使用的声明 (缺陷号 22292704)yyset_extra()
InnoDB:
SHOW CREATE TABLE
分区表的输出没有准确显示表分区的表空间分配信息。(缺陷号 22245554)InnoDB: 一个
ALTER TABLE...TRUNCATE PARTITION
操作忽略了表的KEY_BLOCK_SIZE
属性,而是使用默认值,即值的一半innodb_page_size
。(缺陷 #22186558,缺陷 #79223)InnoDB:更正了innochecksum中的 内存泄漏。(缺陷号 22179518)
InnoDB:
SPACE_ID
表中添加了 一INNODB_CACHED_INDEXES
。该INDEX_ID
值不再是全局唯一标识符。(漏洞 #22172026)InnoDB: 由于意外的数据字典表闩锁,虚拟列的清除线程打开表回调引发了断言。作为临时解决方法,对虚拟生成的列暂时禁用清除。由于未清除虚拟列上索引的删除标记记录,此临时解决方法可能会导致 b 树扩展。(漏洞 #22153217)
-
InnoDB:
foreign_key_checks
禁用 时创建具有全文索引和外键约束的表失败 (缺陷 #22094601,缺陷 #78955)参考:这个问题是 Bug #16845421 的回归。
InnoDB: 该
ha_innobase::m_primary_key
字段已被删除。这是多余的。添加了布尔谓词TABLE_SHARE::is_missing_primary_key()
。(缺陷 #21928734,缺陷 #78662)InnoDB: 尝试加载未初始化页面的缓冲池加载操作导致 Valgrind 失败。(缺陷号 21747906)
InnoDB:删除了
InnoDB
memcached插件 引入的未使用函数(漏洞 #21625760)InnoDB:
innodb_buffer_pool_size
删除 了配置选项使用的内部全局变量 (漏洞 #21512749)InnoDB:
InnoDB
在缓冲池调整大小操作期间断言 的(漏洞#21473497)InnoDB: 通过添加第二个缓冲区减少了日志缓冲区争用,允许并发日志缓冲区写入和刷新。添加了一个新的互斥锁来保护日志缓冲区刷新。感谢翟伟祥的补丁。(缺陷 #21352937,缺陷 #77094)
InnoDB:删除了 未使用
InnoDB
的libsql
函数和变量,并且在可能的情况下将全局符号转换为静态关键字。(错误#21153166、错误#21141390、错误#77146、错误#21178589)InnoDB: 从用于实现全文索引、更新数据字典和更新持久统计信息的内部 SQL 解析器中删除了许多未使用的预定义函数。(缺陷 #21126390,缺陷 #77111)
InnoDB: 该
SysTablespace::parse_units()
函数现在返回文件中的页数而不是兆字节数。该SysTablespace::normalize_size()
功能已被删除。修改了错误信息SysTablespace::parse_params()
。(缺陷 #21040199,缺陷 #76949)InnoDB: 对于持久表,
InnoDB
索引的内部唯一标识符 (index_id
) 现在包括表空间标识符 (space_id
,index_id
)。此更改使索引标识符在表空间级别和InnoDB
实例级别都是唯一的,并支持与索引标识符分配相关的未来工作。(缺陷 #20737524,缺陷 #76392)InnoDB: 在
mtr0mtr.cc
中,去掉了一个多余的函数,ReleaseBlocks
函数重命名为AddDirtyBlocksToFlushList
. (缺陷 #20735882,缺陷 #76343)InnoDB:清理并重组了与innochecksum 相关的代码校验和功能现在位于
buf0checksum.cc
. (缺陷号 20518099)InnoDB:
__attribute__((nonnull))
已从InnoDB
代码中删除。InnoDB
编码指南不再允许该属性(缺陷号 20468234)InnoDB: 添加了一个新的结构来提供一个逻辑接口来处理和操作外部
BLOB
字段引用。(漏洞 #18195972)-
InnoDB:
TRUNCATE TABLE
现在映射到DROP TABLE
和CREATE TABLE
。此更改具有以下含义:在具有大型缓冲池并
innodb_adaptive_hash_index
启用TRUNCATE TABLE
的系统上,由于在删除表的自适应哈希索引条目时发生的 LRU 扫描,操作先前导致系统性能暂时下降。重映射TRUNCATE TABLE
到DROP TABLE
并CREATE TABLE
避免了有问题的 LRU 扫描。TRUNCATE TABLE
暂时是非原子的。操作期间的服务器退出TRUNCATE TABLE
可能会导致删除表InnoDB
SYS_FOREIGN
和SYS_FOREIGN_COLS
系统表中的孤立外键约束。InnoDB
memcached 插件flush_all
命令调用 而DELETE
不是TRUNCATE TABLE
.DELETE
具有更高的开销成本,FLUSH TABLES
因为它涉及撤消日志记录、删除标记和最终清除每个已删除的行。为每个表文件表空间的内部截断表操作发生的日志检查点被日志刷新所取代。
(错误#16834993、错误#68184、错误#16207919)
InnoDB:
InnoDB
在用于片段页面的范围内浪费了大部分页面。(漏洞 #16204823,漏洞 #67963)分区: 在某些情况下,在解析时已修剪所有分区后,在优化期间第二次尝试分区修剪的问题会导致断言。(漏洞 #23194259)
-
分区: 无法从使用 mysqldump创建的备份导入表名和任何分区名的组合长度超过 61 个字符的分区表。当表也使用子分区时,表名、任何分区名和该分区的任何子分区的名称的组合长度不能超过 57 个字符,不会触发相同的问题。
这是因为内部
mysql.innodb_table_stats
表允许用于存储表名的列最多 64 个字符,即使 InnoDB 存储,对于分区或子分区表,innodb_table_stats
每个分区或子分区中的一行,其中值实际用于表示表名分别遵循模式 or 。通过更改 的定义以适应这些属性加上 和的最大组合长度(199 个字符),此问题得到解决。(错误#72061,错误#18416479)table_name
#P#partition_name
table_name
#P#partition_name
#SP#subpartition_name
innodb_table_stats
#P#
#SP#
复制: 在
Slave_worker::write_info()
中,DBUG_ENTER()
将 “Master_info::write_info
”作为参数而不是 “Slave_worker::write_info
”。此修复更正了该参数。感谢 Stewart Smith 提供的补丁。(缺陷 #21658067,缺陷 #78133)复制: 当使用 带有多线程从属的语句时,唯一 可用的子句是 . 现在多线程从站与and 语句兼容 (错误#75843,错误#20513547)
START SLAVE UNTIL
position
UNTIL
SQL_BEFORE_GTIDS
START SLAVE UNTIL MASTER_LOG_FILE = '
log_name
', MASTER_LOG_POS =log_position
START SLAVE UNTIL RELAY_LOG_FILE = '
log_name
', RELAY_LOG_POS =log_position
Microsoft Windows: 在 Windows 上,在多线程中设置全局
log_syslog
系统变量可能会导致服务器退出。(缺陷号 22180046)Solaris: 客户端库无法使用该
Cstd
库在 Solaris 上构建。(漏洞 #24353920,漏洞 #82347)JSON: 使用值的内存地址而不是值本身
CHECKSUM TABLE
计算JSON
现在在这种情况下,计算是基于实际JSON
值,而不是该值的地址。(漏洞 #23535703)JSON: 传递
NULL
到期望JSON
参数的存储过程导致调试版本中的断言失败。(缺陷号 23209914)-
JSON:路径参数 的解析
JSON
无法区分 NULL 路径和语法无效的路径。这已被更改,因此这些路径的解析现在可以清楚地区分有效的非 NULL 路径、NULL 路径和无效路径。(漏洞 #22816576)
JSON:
JSON
对于调试版本,当服务器创建一个临时表来保存对象 时,可以引发断言 (漏洞#22782948)JSON: 执行
JSON
引发错误的函数的查询可能会导致服务器退出。(漏洞 #22253965)将表重命名为不存在的数据库的一部分失败(正确),但出现未知错误 消息。现在会生成一条正确的错误消息;这已作为数据字典实现的一部分得到纠正。(漏洞 #25167507,漏洞 #84000)
对于 FreeBSD 上的分段错误,服务器没有生成堆栈跟踪。(错误#24566529、错误#23575445、错误#81827)
在 macOS 上,堆栈跟踪 demangling 现在发生在使用 Clang 编译的构建中,就像 GCC 一样。(漏洞 #23606094,漏洞 #81908)
libevent
即使在不需要时也是基于 macOS 构建的。(漏洞 #23228287,漏洞 #81311)如果作为存储过程中语句的一部分调用 ,返回
JSON
值的函数可能会导致服务器退出 。CASE
(漏洞 #23212765)SHOW ENGINE PERFORMANCE_SCHEMA STATUS
以前,性能模式中使用的SELECT * FROM performance_schema.memory_summary_global_by_event_name
总内存 报告了不同的值 。输出memory/performance_schema/scalable_buffer
中缺少 用于可扩展缓冲区页面的内存(检测为 )。SHOW ENGINE STATUS
该语句现在包括丢失的内存,显示为(pfs_buffer_scalable_container).memory
。(漏洞 #23104498)GCC 选项导致ARM64
-fexpensive-optimizations
和 PowerPC 构建计算浮点运算与其他平台略有不同。此选项由-O2
更高的优化级别启用。该选项现在在受其负面影响的平台上被禁用。(漏洞 #23046775)在诸如 之类的管理操作失败后
ALTER TABLE ... OPTIMIZE PARTITION
,从 Performance Schema 中选择锁表模式可能会挂起。(缺陷号 23044286)在启用了 AddressSanitizer 的构建中,
CAST(... AS BINARY)
可能会导致服务器退出。(缺陷号 22900560)在错误消息中使用不同的空间函数名称报告了一些空间函数。(缺陷 #22883056,缺陷 #80627)
my_strtod_int()
修复了函数 优化模式下 Clang 的 Valgrind 警告 。(缺陷号 22839888)对具有 64 位小数的值进行精确数学运算可能会产生 0 结果。(漏洞 #22828692)
ST_GeomFromGeoJSON()
可以返回带有有效参数的错误。(漏洞 #22804853)对于
STRICT_TRANS_TABLES
启用了 SQL 模式的调试构建,断言可以由 做出无法回滚的更改并随后生成 错误INSERT
的 语句引发。(漏洞 #22635253)REPLACE
ER_NO_DEFAULT_FOR_FIELD
优化器包含一个
memcpy()
不检查重叠源和目标的调用。(漏洞 #22537196)对于调试版本,对访问值的子查询的结果缺少错误检查
JSON
可能会引发断言。(漏洞 #22522073)准备
CREATE TABLE ... SELECT
语句,然后刷新表(从而关闭表)并执行准备好的语句可能会导致服务器退出。(缺陷号 22393309)在作为联接一部分的派生表的选择列表中使用参数的准备好的语句可能会导致服务器退出。(错误#22392374,错误#24380263)
一些授权表没有考虑到 MySQL 5.7.8 中最大用户名长度从 16 个字符增加到 32 个字符。(缺陷 #22379607,缺陷 #79680)
重新评估生成的列表达式可能会导致访问以前释放的内存和服务器退出。(缺陷号 22346120)
HANDLER
在目标索引值未成功存储到行缓冲区时搜索索引的读取语句可能会导致服务器退出。(漏洞 #22321965)ZEROFILL
对值的数字转换 处理不当NULL
可能会导致服务器退出。(漏洞 #22281205)使用包含行构造函数的子查询在
SET
语句中设置变量可能会导致服务器退出。(缺陷号 22276843)如果 SQL 模式不包括
ALLOW_INVALID_DATES
,包含子查询具体化并由其处理的查询可能会导致服务器退出。(缺陷号 22262843)invalid_date
IN (subquery
)对于嵌入式服务器,检查无效参数后的代码是在缺少或不正确的参数的情况下调用的,这可能会导致不正确的退出。(漏洞 #22262706)
在 OS X 上,
vio_io_wait()
使用select()
,将文件描述符的数量限制为 1024。现在使用 kqueue 事件通知来避免此限制。FreeBSD 也被更改为使用 kqueue。(漏洞 #22244911)如果存储的例程加载涉及临时更改默认数据库并且在恢复原始默认数据库时发生错误,则可能导致内存泄漏。(缺陷号 22179795)
调整CMake配置以检查 编译器选项,而不是 因为后者对 GCC 产生误报。(漏洞 #21881753)
-W
xxx
-Wno-
xxx
INFORMATION_SCHEMA.EVENTS.LAST_EXECUTED
和 的值之间可能存在差异mysql.event.last_executed
。这不再发生。事件信息存储在mysql.events
不可见的数据字典表中,因此这INFORMATION_SCHEMA.EVENTS
是事件元数据的唯一接口。(缺陷号 21374010)视图可以在评估来自视图定义的限制之前评估用户定义的或 SQL 函数。(缺陷号 20933307)
对于
-DENABLE_DTRACE=ON
, CMake不检查是否存在有效的 DTrace 安装。现在,如果找不到 DTrace,它会检查并中止。(缺陷号 20671056)SHOW CREATE USER
返回了意想不到的结果。(缺陷号 20625566)如果为该
--log-error
选项提供相对路径名, mysqld可能会将stdout
和发送stderr
到错误的位置。(缺陷号 20609063)评估
LEAST()
和GREATEST()
可能对日期时间和字符串文字使用太小的排序缓冲区,导致引发断言。(缺陷号 20565160)MySQL 8.0 中新错误的错误编号范围指定为以 3500 开头。(缺陷 #20538173)
Debian 包装已更新为
sql_mode
不在my.cnf
. (缺陷号 20535729)如果启用了 SQL 模式,从
mysql.event
系统表 加载事件可能会失败。PAD_CHAR_TO_FULL_LENGTH
(缺陷 #20073523,缺陷 #74947)INSERT
and 等LOAD DATA
使用REPLACE
orIGNORE
关键字处理重复记录的 语句可能会影响后续操作。(缺陷号 20017428)CREATE TABLE ... SELECT
BIT
从源表中选择非数据到BIT
目标表中的列可能会导致服务器退出。(缺陷号 19930894)-DMYSQL_MAINTAINER_MODE=1
当使用 clang/Xcode 6.0 配置和编译 MySQL 时,在 OS X 上编译失败 。(缺陷 #19694515,缺陷 #74100)对于
CHANGE MASTER TO
在写入通用查询日志之前重写以过滤密码的语句,任何MASTER_AUTO_POSITION
子句都会丢失。(漏洞 #19622609)表重命名代码中潜在的空指针取消引用和内存泄漏已得到纠正。(漏洞 #18194270)
用于
MATCH ... AGAINST
比较字符列和聚合函数可能会导致服务器退出。(漏洞#17865492)可以在各种信息源中报告略有不同的连接数值,例如
Connections
状态变量、性能模式threads
和global_status
表以及SHOW PROCESSLIST
语句。(漏洞#17666696)带有包含带有外部引用的集合操作的子查询的查询可能会导致服务器退出。(漏洞#17270896)
使用
GRANT
更改无效用户的密码会产生错误,但也会更新mysql.user
系统表。(漏洞 #17180985)空间 WKT 数据的解析器接受数字,例如
0.23
但不接受不.23
带前导零的等效值。现在两种格式都被接受了。(漏洞 #17167633)-
以前,如果客户端尝试发送总大小大于
performance_schema_session_connect_attrs_size
系统变量值的连接属性键/值对,则性能模式会截断属性数据。log_warnings
此外,如果系统变量大于零 ,Performance Schema 会将此消息写入错误日志 :[Warning] Connection attributes of length N were truncated
此消息对试图确定有问题的客户端的 DBA 没有帮助,因此对连接属性处理进行了一些更改:
对于过多的数据,连接属性仍然会被截断,但日志消息会提供更多信息。它包括丢失的字节数、连接标识符和有关客户端用户的信息。附加信息应使 DBA 能够更轻松地识别发生属性截断的客户端。
发生截断时,
_truncated
如果属性缓冲区有足够的空间,则会将一个属性添加到会话属性中,该属性的值指示丢失了多少字节。这使性能模式能够在连接属性表中公开每个连接的截断信息。一个新的状态变量,
Performance_schema_session_connect_attrs_longest_seen
表示服务器看到的小于 64KB 的最长连接属性缓冲区。如果此值大于performance_schema_session_connect_attrs_size
,则发生了属性截断,DBA 可能希望增加后一个值,或者调查哪些客户端正在发送大量属性数据。
有关详细信息,请参阅 性能模式连接属性表。(漏洞 #16576959)
-
引入数据字典可以
INFORMATION_SCHEMA
解决几个问题:查询
INFORMATION_SCHEMA.STATISTICS
可能返回不同的结果,具体取决于选择列表中列的顺序。某些
INFORMATION_SCHEMA
表的列类型和大小不理想。此类表现在是系统数据库中数据字典表的视图,mysql
具有更合适的列定义。导致目录扫描以确定数据库或文件名的表查询
INFORMATION_SCHEMA
不再这样做,而是从数据字典中读取数据库和表名。INFORMATION_SCHEMA
对打开文件以获取表元数据 的表的查询.frm
不再这样做,而是从数据字典中读取此信息。-
对于
INFORMATION_SCHEMA
查询中数据库或表名的比较,使用COLLATE
强制给定排序规则仅在应用于INFORMATION_SCHEMA
表列时有效,但在应用于比较值时无效。有关执行此类比较的其他信息,请参阅 在 INFORMATION_SCHEMA 搜索中使用排序规则。
(错误#14017351、错误#65121、错误#17559183、错误#70462、错误#23259470、错误#81347、错误#20372562、错误#75532、错误#13878164、错误#11756519、错误#48445)
Windows 下服务器异常退出,服务器之前创建了一个minidump 文件 ,名称为
,其中module_name
.dmpmodule_name
是服务器可执行文件的名称。为了防止早期的小型转储文件被覆盖,小型转储文件名现在包括进程 ID 并具有以下形式 :例如,。(漏洞 #12779463)module_name
..pid
dmpmysqld.exe.7296.dmp
对于
INFORMATION_SCHEMA
表查询,架构和表名的比较可能区分大小写或不区分大小写,具体取决于底层文件系统和lower_case_table_names
系统变量值的特征。此外,提供COLLATE
更改比较属性的子句是无效的,因为该子句被忽略了。这已更改,因此COLLATE
不再被忽略,可用于获得所需的比较属性。(错误#11748044,错误#34921)FLOOR(CEIL())
截断大BIGINT UNSIGNED
参数。(缺陷 #80873,缺陷 #23013359)JSON_MERGE()
对函数 返回值的 操作JSON_SET()
有时会产生无效结果。(缺陷 #80787,缺陷 #22961128)ST_AsGeoJSON()
使用用户定义的变量提供几何参数时失败。(缺陷 #80697,缺陷 #22912800)CAST(
expr
AS BINARY(N
) )NULL
为 的某些有效值 意外返回N
。(缺陷 #80630,缺陷 #22885819)采用 SRID 参数的几何导入函数将其转换为无符号 32 位整数,而不会出现警告或错误,因此负值或大于无符号 32 位整数范围的值会自动转换为该范围内的数字。现在,所有将 SRID 作为参数的几何函数都会检查它是否在无符号 32 位整数范围内,
ER_DATA_OUT_OF_RANGE
如果不在则产生错误。这也适用于先前检查参数是否在范围内但返回不同错误代码的 GeoJSON 和 GeoHash 函数。(缺陷 #80499,缺陷 #22819614)如果在存储谓词值时发生舍入,范围优化器可能不会为
<
and<=
运算符返回正确的结果。(缺陷 #80244,缺陷 #22661012)对于
mf_iocache
单元测试,添加一个缺失va_end()
的 ,通过调用 修复内存泄漏my_end()
,并为测试添加一个目标。感谢 Daniel Black 提供了这些更改所基于的补丁。(缺陷 #80085,缺陷 #22578670)SELECT DISTINCT SUBSTR()
可能会错误地将值作为大位置或长度参数的重复值丢弃。同样的问题也影响了LEFT()
andRIGHT()
。(缺陷 #80047,缺陷 #22565155)SUBSTRING_INDEX(
没有正确处理str
,delim
,count
)count
大于 32 位的值。(错误#79978,错误#22545429)对于对 的调用
CONVERT()
,文字字符串参数可能会在执行期间被修改,从而产生不正确的结果。(错误#79924,错误#22531111)REPLACE('a', BINARY 'b', NULL)
返回'a'
而不是NULL
. (错误#79912,错误#22523836)事务状态跟踪现在避免了非 8 位安全的功能,以增强与非标准字符集的兼容性。(错误#79905,错误#22523383)
GREATEST()
并将LEAST()
所有整数输入视为有符号。(错误#79902,错误#22523685)一般查询日志中的行在时间戳和线程 ID 之间缺少一个选项卡。感谢 Tsubasa Tanaka 提供补丁。(错误#79868,错误#22508563)
无符号值和负上限之间的某些比较可能会返回不正确的结果(例如,
CAST(100 AS UNSIGNED) BETWEEN 1 AND -1
)。(错误#79857,错误#22501606)该
JSON_TYPE()
函数现在BIT
将转换为 JSON 的文字类型显示为BLOB
,而不是BIT
。(错误#79308,错误#22297987)使用CMake选项 配置 MySQL 会 产生一个功能不全的服务器。(缺陷 #79238,缺陷 #22194071)
-DWITH_UBSAN=ON
sql_common.h
,包含在 MySQL 发行版中的头文件,包含并因此依赖于hash.h
,一个不包含在 MySQL 发行版中的头文件。这导致编译失败。为了消除这种依赖性,sql_common.h
修改为不再包含hash.h
. (错误#79237、错误#22187997、错误#70672、错误#17633467)--help
即使在使用该选项 启动服务器时,用于检查最大语句执行时间的计时器也会被初始化 。如果--help
给出,则不再执行此操作。(错误#79182,错误#22172389)优化器在尝试优化 形式的表达式时失败
IF(true, '2015-01-01', '2015-01-01') IS NOT NULL
。(错误#79114,错误#22148586)减去无符号小数可能会返回负值,但元数据类型信息为
UNSIGNED BINARY
. 无符号十进制减法现在的处理方式与无符号整数相同:ER_DATA_OUT_OF_RANGE
如果结果为负,则产生错误,除非NO_UNSIGNED_SUBTRACTION
启用 SQL 模式。(错误#78914,错误#22083757)-
HEX()
改进了大于 2 64的数字函数的 处理。(错误#78828,错误#22297983)参考资料:这个问题是 Bug #9854 的回归。
客户端插件取消初始化函数签名已从更改
int (*deinit)()
为int (*deinit)(void)
以避免在使用-Wstrict-prototypes
. (错误#78177、错误#21680094、错误#81419、错误#23282498)CREATE TABLE
DATA DIRECTORY
如果为orINDEX DIRECTORY
表选项指定了很长或不正确的路径名,则报告不正确的错误。现在ER_PATH_LENGTH
或ER_WRONG_VALUE
正在报告那些案件。(错误#76635,错误#20857556)服务器现在尝试为这些错误代码提供更多信息性消息:
ER_CANT_CREATE_DB
,ER_CANT_CREATE_TABLE
,ER_DB_DROP_RMDIR
,ER_ERROR_DURING_COMMIT
,ER_ERROR_DURING_ROLLBACK
,ER_GET_ERRNO
。(错误#76298,错误#20694494)对于某些无法准备 XA 事务的实例,不完整的事务清理可能会引发断言。(缺陷 #75809,缺陷 #20488921)
mysqld可能会尝试关闭无效的套接字文件描述符。感谢翟伟祥的补丁。(错误#75778,错误#20504513)
-
以下形式的语句将表数据转换为
latin1
,但也将表默认字符集更改为latin1
并忽略该utf8
子句:ALTER TABLE tbl_name CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1;
感谢 Daniel Black 提供的补丁。(缺陷 #75320,缺陷 #20279241)
在
mysqld.cc
中,abort_loop
变量用 量化volatile
,这在某些平台上可能导致在不同内核上运行的线程中无法立即看到更改。感谢 Stewart Smith 提供的补丁。(错误#74846,错误#20134637)在某些情况下,调用从触发器创建视图的过程,或创建调用已执行过程的函数
RENAME TABLE
可能会引发断言。(错误#74740、错误#19988193、错误#21198646)服务器端准备好的语句的时间戳可以写入二进制日志,最多比相应的非准备语句的时间戳晚一秒,导致主从服务器之间的时间值差异。(错误#74550、错误#19894382、错误#25187670)
对于动态存储引擎插件,
DROP TABLE
、TRUNCATE TABLE
和RENAME TABLE
由于从.frm
文件中错误地确定了引擎而无法工作。(错误#74277,错误#19902868)执行的准备好的语句被记录下来,
?
参数标记被数据值替换。记录字符串的构建效率低下并且已得到改进。(缺陷 #73056,缺陷 #20955496)插件对其字符串类型的线程变量的分配可能会泄漏内存。(错误#71759,错误#19917521)
当从基表中选择时,使用 视图分组可能会产生
ER_INVALID_GROUP_FUNC_USE
错误(“无效使用分组功能” )。(错误#70220,错误#17406425)旨在与存储引擎无关但实际上使用特定引擎的测试用例已得到纠正。