Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.0 的变化(2016-09-12,发展里程碑)

MySQL 8.0.0 的变化(2016-09-12,发展里程碑)

有关升级、降级、平台支持等的一般信息,请访问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 从旧版本升级,但授权表尚未从 升级MyISAMInnoDB,则服务器认为它们是只读的,并且帐户管理语句会产生错误。

    由于存储引擎从 更改 MyISAMInnoDBSELECT没有ORDER BY授权表可以产生与以前不同的行顺序。如果查询结果必须具有特定的行排序特征,请包含一个ORDER BY子句。

  • MySQL 现在支持角色,即命名的权限集合。角色允许将权限集分配给帐户,并提供一种方便的替代方法来授予个人权限,既可以概念化所需的权限分配,也可以实现它们:

    • 可以创建和删除角色。

    • 角色可以拥有授予和撤销的特权。

    • 可以向用户帐户授予和撤销角色。

    • 一个帐户的活动角色可以从授予该帐户的角色中选择,并且可以在该帐户的会话期间更改。

    有关详细信息,请参阅使用角色

    笔记

    ROLEnow 是一个保留字,不能在没有标识符引用的情况下用作标识符。

C API 说明

  • 共享库主libmysqlclient版本号从 20(用于 MySQL 5.7)增加到 MySQL 8.0 的 21。(错误#77600,错误#21363863)

字符集支持

  • 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也可用作下表中语言的不区分重音、不区分大小写的排序规则。

    表 7 utf8mb4_da_0900_ai_ci 适用的语言

    语言名称 语言代码
    挪威
    挪威语 注意事项
    挪威新诺斯克语 nn

    非语言特定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 COMPONENTand 语句为运行时 的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存储引擎的其他表的操作,例如授权表和funcplugin桌子。(漏洞 #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 VERSION10.frm

    • 随着.frm文件的删除, sync_frm系统变量也被删除。

    • 为 MySQL 数据字典提供服务的新字典对象缓存将以前访问的数据字典对象存储在内存中,以实现对象重用并最大限度地减少磁盘 I/O。基于 LRU 的逐出策略用于从内存中逐出最近最少使用的对象。缓存包含多个存储不同对象类型的分区。有关详细信息,请参阅 字典对象缓存

    • 新的内部数据字典 API 使服务器、内部存储引擎和插件能够访问和存储 MySQL 数据字典中的数据。引入了内部数据字典 API 来处理模式、表空间、表空间文件、表、分区表、表分区数据、触发器、存储例程、事件、表对象、视图、字符集和排序规则。

      通过此更改,数据字典更新和二进制日志写入CREATE TRIGGERDROP 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_statsCACHED(默认)时,服务器使用存储在 STATISTICSTABLES表中的缓存统计信息。

      • information_schema_statsLATEST服务器直接从存储引擎获取统计信息。在这种情况下,服务器将对 和 的查询视为 STATISTICS对 和 表 TABLES中存储的最新统计信息的查询 。STATISTICS_DYNAMICTABLES_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_CONSTRAINTSand KEY_COLUMN_USAGE表;这些表现在作为 、 和其他数据字典表的视图来 foreign_keys实现 foreign_key_column_usage

      对于某些外键错误,服务器现在会生成更合适且信息更丰富的错误消息。

      笔记

      不兼容: 以前,MySQL 支持长度超过 64 个字符的外键名称。根据 SQL 标准,存储在 foreign_keysforeign_key_column_usage表中的外键名称最多为 64 个字符,因此不再允许使用更长的外键名称。

    • 因为数据字典提供了有关数据库对象的信息,所以服务器不再检查数据目录中的目录名称来查找数据库。因此,--ignore-db-dir选项和 ignore_db_dirs系统变量是无关的并且已被删除。相应地更新系统配置和应用程序。

    • 以前,通过使用 CREATE TEMPORARY TABLE不存在的数据库名称限定表名,可以使用它在不存在的数据库中创建表。这不再被允许。

    • 系统表变化:

      • 许多系统表已从 MyISAM(非事务)表转换为 InnoDB(事务)表。例如,正如这些发行说明中其他地方所讨论的,授权表现在是InnoDB 表。其他示例如下。

      • 现在系统数据库func中存储可加载函数信息的表 是一个 (事务)表。以前,它是一个 (非事务性)表。 mysqlInnoDBMyISAM

        由于此更改, CREATE FUNCTIONand DROP FUNCTION语句会导致隐式提交,即使用于可加载函数时也是如此(请参阅导致隐式提交的语句)。以前,它们在用于存储函数时会导致隐式提交,但不会用于可加载函数。

      • 以前,有关存储例程和事件的信息存储在系统数据库的表procevent表中 。mysql这些表不再使用。相反,有关存储例程和事件的信息存储在 系统数据库的routineseventsparameters数据字典表中。mysql旧表使用MyISAM (非事​​务性)存储引擎。新表使用InnoDB(事务)引擎。

        以前,创建包含非法字符的存储例程会产生警告。现在这是一个错误。

      • 为了将对系统表(例如,时区或日志表)的访问与对非系统表的访问区分开来,服务器使用Locking system tablesOpening system tables线程状态而不是 System lockOpening 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现在,位函数和运算符允许二进制字符串类型参数(BINARYVARBINARYBLOB类型)并返回类似类型的值,这使它们能够接受参数并生成大于 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

    文件格式配置选项对于创建与 InnoDBMySQL 5.1 早期版本兼容的表是必需的。现在 MySQL 5.1 已经到达其产品生命周期的末尾,不再需要这些选项。

    FILE_FORMAT列已从 INNODB_SYS_TABLESINNODB_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--bootstrapINSTALL_SCRIPTDIR CMake

    版本 1 测试套件代码以前位于 mysql-test/lib/v1MySQL 源代码分发目录中。此代码使用 了mysql_install_db并已被删除。不再支持 环境变量和环境变量的 MYSQL_INSTALL_DB值为 1 。MTR_VERSION

  • mysql_plugin实用程序已被删除。备选方案包括在服务器启动时使用 --plugin-loador --plugin-load-add选项加载插件,或在运行时使用INSTALL PLUGIN 语句加载插件。

  • 已弃用的mysql_shutdown()C API 函数和相应的COM_SHUTDOWN 客户端/服务器协议命令已被删除。相反,用于 mysql_query()执行 SHUTDOWN语句。

吸氧笔记

优化器注释

  • InnoDB: 存储引擎接口现在使优化器能够提供有关用于优化器估计将读取多行的扫描的记录缓冲区大小的信息。缓冲区大小可以根据估计的大小而变化。InnoDB使用这种可变大小的缓冲功能来利用行预取,并减少锁存和 B 树导航的开销。以前,InnoDB使用一个小的、固定大小的缓冲区。

  • 优化器现在支持表级 MERGENO_MERGE提示,用于指定派生表或视图是否应合并到外部查询块或使用内部临时表具体化。例子:

    SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
    SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;

    有关详细信息,请参阅优化器提示。(缺陷 #79554,缺陷 #22328100)

  • MySQL 现在支持不可见索引。优化器根本不使用不可见索引,但会正常维护。默认情况下索引是可见的。不可见的索引使测试删除索引对查询性能的影响成为可能,而无需进行破坏性更改,如果索引被证明是必需的,则必须撤消该更改。此功能适用于InnoDB表,用于主键以外的索引。

    要控制索引是否对新索引显式不可见,请使用VISIBLEor INVISIBLE关键字作为 、 或 的索引定义CREATE TABLECREATE INDEX一部分 ALTER TABLE。要改变现有索引的不可见性,请在操作中使用 VISIBLEorINVISIBLE 关键字ALTER TABLE ... ALTER INDEX 。有关详细信息,请参阅 不可见索引

  • 系统mysql数据库现在包含一个 column_stats表,用于存储有关列值的统计信息。有关详细信息,请参阅 优化器统计信息。

包装说明

  • 以前的 MySQL 系列中的开发里程碑版本使用后缀 , 进行编号 ,以指示开发里程碑。在 MySQL 8.0 中,开发版本使用后缀 . 例如,这个版本的 MySQL 是编号的。(缺陷 #80408,缺陷 #22748154)-mNN-dmr8.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_CACHESQL_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是关键字,不能用作存储程序中的标签。它不再是关键字,可以用作标签。

    • 某些语法错误的消息相对于错误在语句中的位置更为精确。

性能模式注释

  • 不兼容的更改: 性能模式现在检测服务器错误(和警告),并通过一组摘要表公开有关它们的统计信息:

    有关详细信息,请参阅 错误汇总表

    如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到 performance_schema数据库中。

    由于前面的更改,两个服务器错误符号被重命名: ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS is now ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TXER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS is now ER_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 表中的DIGESTDIGEST_TEXTevents_statements_current仅在语句执行结束后才填充。现在,列在解析之后和语句执行开始之前被填充。这使监视应用程序能够在语句执行期间访问语句摘要信息。(缺陷号 23336542)

  • 以前,Performance Schema 优化的重点是减少收集监控数据所涉及的开销。作为对早期工作的补充,检索该数据的性能模式查询的开销现在也减少了。这是通过向大多数 Performance Schema 表添加索引来实现的,这使优化器可以访问除全表扫描之外的执行计划。这些索引还提高了相关对象的性能,例如 sys使用这些表的模式视图。有关详细信息,请参阅 优化性能模式查询

  • ROLEPerformance 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_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT选项 mysql_options()对应于客户端--ssl--ssl-verify-server-cert选项,已被删除。MYSQL_OPT_SSL_MODE与选项值SSL_MODE_REQUIREDor 一起使用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)

X 插件说明

  • Protobuf解码器类将嵌套对象的数量限制为 50(默认值) 。(漏洞 #23707238,漏洞 #82025)

  • 该语句list_objects错误地将表报告为集合。(漏洞 #23631240)

  • 该语句创建了一个集合表,该表在列上而不是在主键create_collection上具有唯一键索引 。'_id'(漏洞 #23284569)

添加或更改的功能

  • 不相容的变化;分区: 通用分区处理程序已从 MySQL 服务器中删除。作为此更改的一部分, mysqld不再支持--partition--skip-partition选项,并且服务器不能再使用 -DWITH_PARTITION_STORAGE_ENGINE. partition也不再显示在 的输出中SHOW PLUGINSINFORMATION_SCHEMA.PLUGINS 表中。

    为了支持给定表的分区,用于表的存储引擎现在必须提供自己的(本机)分区处理程序。 InnoDB是 MySQL 8.0 中唯一支持的存储引擎,它包括一个本机分区处理程序。尝试使用任何其他存储引擎在 MySQL 8.0 中创建分区表失败。( NDBMySQL 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 ENGINEInnoDBInnoDBInnoDB默认使用)。

    有关详细信息,请参阅 与存储引擎相关的分区限制

  • 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: BLOB重构代码以提供一个内部 C++ 接口来对压缩和未压缩BLOB数据进行操作。

  • InnoDB: memcachedInnoDB 插件 现在支持多个get操作(在单个 memcached查询中获取多个键/值对)和范围查询。请参阅 InnoDB memcached 多获取和范围查询支持

  • InnoDB: 当遇到索引树损坏时, InnoDB将损坏标志写入重做日志,这使得损坏标志崩溃安全。 InnoDB还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间,InnoDB在将内存表和索引对象标记为损坏之前,从两个位置读取损坏标志并合并结果。

  • InnoDB: InnoDB在 MySQL 数据目录之外创建表空间数据文件时不再创建 .isl文件(InnoDB 符号链接文件)。

    .isl通过此更改,不支持 在服务器离线时通过手动修改文件来移动远程表空间。

  • InnoDB: InnoDB不再支持压缩临时表。启用时 innodb_strict_mode(默认值), 或 CREATE TEMPORARY TABLE返回错误 。如果 禁用,则会发出警告并使用非压缩行格式创建临时表。 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZEinnodb_strict_mode

    通过此更改,所有临时表都在共享临时表空间中创建,ibtmp1.

    和列已从 中 PER_TABLE_TABLESPACE删除 。 IS_COMPRESSEDINFORMATION_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=ONinnodb_flush_method=normal)。该async_unbuffered设置已删除。

    您现在可以 使用数值 设置innodb_flush_method和 配置选项。innodb_change_buffering

  • InnoDB: 在 MySQL 数据目录之外创建 file-per-table 表空间数据文件时InnoDB不再创建 现在使用重做日志来定位远程表空间数据文件。 .islInnoDB

    .isl不再支持 通过修改文件在 MySQL 数据目录之外创建的 file-per-table 表空间数据文件的脱机重定位 。

  • InnoDB: 当前最大自动增量计数器值现在每次值更改时都写入重做日志,并保存到每个检查点上的引擎私有系统表。这些更改使当前最大自动递增计数器值在服务器重新启动后保持不变。此外:

    • 服务器重新启动不再取消 AUTO_INCREMENT = N表选项的影响。如果将自动递增计数器初始化为特定值,或者如果将自动递增计数器值更改为更大的值,则新值将在服务器重新启动后保留。

    • 服务器在操作后立即重新启动 ROLLBACK 不再导致重用分配给回​​滚事务的自动增量值。

    • 如果您将AUTO_INCREMENT列值修改为大于当前最大自动增量值的值( UPDATE例如,在操作中),则新值将被持久化,并且后续 INSERT操作会从新的较大值开始分配自动增量值。

    有关更多信息,请参阅 InnoDB 中的 AUTO_INCREMENT 处理InnoDB AUTO_INCREMENT 计数器初始化。(错误 #199,错误 #13726455)

  • 复制:对于如何将CHANGE MASTER TO 语句写入错误日志 (mysqld.log) ,有两个改进

    • 以前,选项说明之间没有逗号(例如MASTER_USER =and MASTER_PASSWORD =),所以用户想通过复制和粘贴使用语句必须手动插入逗号。将语句写入错误日志时,现在会插入逗号。

    • 当文字<secret>作为MASTER_PASSWORD 值的占位符插入时,现在不使用引号,因此在复制和粘贴之前忘记用真实密码替换文字的用户会立即出现语法错误,而不是遇到其他问题。

    (漏洞 #18194384)

  • 复制: 现在可以恢复基于 GTID 的复制服务器的备份,因为您可以将 GTID 添加到 gtid_purged,无论是否gtid_executed为空。这使您能够从基于 GTID 的复制服务器还原备份,而不会丢失现有的 GTID 信息和二进制日志。要添加的 GTID 是备份时存在的 GTID gtid_executed。的语法SET GTID_PURGED已扩展,以便 添加到现有的 GTID 集。 SET GTID_PURGED ="+gtid_set"gtid_setgtid_purged

  • 复制: 添加了新的 Performance Schema 阶段以显示基于行的复制的进度。您可以使用这些阶段来检查基于行的复制中缓慢操作的进度。此外,您还可以找出正在应用更改的数据库。这有助于解决基于行的复制问题,并提供有关性能调整的更多信息。有关详细信息,请参阅 监视基于行的复制

  • JSON: 此版本添加了一个不加引号的提取运算符 ->>,有时也称为内联路径运算符,用于JSON存储在 MySQL 中的文档。new 运算符与 operator 类似 -> ,但也会对值执行 JSON 取消引用。对于一个 JSON 列mycol和 JSON 路径表达式 mypath,下面三个表达式是等价的:

    ->>运算符可以在任何 JSON_UNQUOTE(JSON_EXTRACT())允许 的SQL 语句中使用。这包括(但不限于) SELECT列表、条款和WHERE条款 。 HAVINGORDER BYGROUP BY

    有关详细信息,请参阅 搜索 JSON 值的函数JSON 路径语法。(错误#78736,错误#21980346)

  • 为了产生更准确的估计, MEMORY存储引擎现在使用浮点而不是整数算法来计算索引统计信息(每个键估计的记录)。(漏洞 #23024059)

  • 一个新的CMake选项, INSTALL_STATIC_LIBRARIES可以控制是否安装静态库。默认值为 ON。如果设置为OFF,则不会安装这些库: libmysqlclient.alibmysqld.alibmysqlservices.a。(漏洞 #22891432)

  • 内部mysql_prepare_create_table() 服务器功能已经过重构,以提高代码的可维护性和清晰度。CREATE TABLE此代码修订导致和 的行为发生以下微小变化 ALTER TABLE

    (漏洞#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)

  • 如果系统lz4openssl zlib命令可用, 则不需要lz4_decompresszlib_decompress实用程序。两项更改使这些实用程序无法构建:如果新的 CMake 选项设置为, 则不会构建或安装lz4_decompress 。如果CMake选项设置为 ,则不会构建或安装zlib_decompress 。(缺陷号 22329851)WITH_LZ4 systemWITH_ZLIB system

  • MySQL 字符串库的源文件已从 C(.c后缀)转换为 C++(.cc后缀)。这样可以在库代码中启用更严格的编译检查和 C++ 功能的使用。(漏洞 #22124719)

  • 该库的源代码mysys现在使用 C++ 而不是 C,以利用更严格的编译检查并允许使用 C++ 功能。(漏洞#21881278)

  • 为了提高性能和更好地与其他平台兼容,my_sync()在 OS X 上现在使用 fsync()rather than fcntl()with F_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 NAMEALTER DATABASECom_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_id1 的限制,以避免 space_id在升级期间与现有表空间发生冲突。第一个撤消表空间现在可以使用 1 space_id以外 space_id值。撤消表空间的值仍然按连续顺序分配。(漏洞 #23517560)

  • InnoDB: 用于迭代表索引的内部访问器函数已替换为访问器方法。删除了死代码。(缺陷号 23336108)

  • InnoDB:以前由 SQL 脚本创建 的mysql.innodb_index_statsmysql.innodb_table_stats因此,该 dict_table_schema_check功能不再需要并被删除。(漏洞 #23336079)

  • InnoDB:ut_snprint函数已被 C++11snprintf函数取代。(缺陷号 23329353)

  • InnoDB:ulint为了保持一致性, 实例InnoDB被替换为 space_id_tpage_no_t 数据类型。(缺陷号 23297169)

  • InnoDB: 在代码中使用 boost::atomicInnoDB已替换为 std::atomic。(缺陷号 23280649)

  • InnoDB: MySQL 二进制文件不是使用 NUMA 功能构建的。(缺陷号 23259754)

  • InnoDB:UNIV_NONINL对和 引用UNIV_MUST_NOT_INLINE已删除。和 fut0fut.ccut0byte.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)

  • InnoDBrec_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:删除了 未使用InnoDBlibsql 函数和变量,并且在可能的情况下将全局符号转换为静态关键字。(错误#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 TABLECREATE TABLE。此更改具有以下含义:

    • 在具有大型缓冲池并 innodb_adaptive_hash_index 启用TRUNCATE TABLE 的系统上,由于在删除表的自适应哈希索引条目时发生的 LRU 扫描,操作先前导致系统性能暂时下降。重映射 TRUNCATE TABLEDROP TABLECREATE TABLE避免了有问题的 LRU 扫描。

    • TRUNCATE TABLE暂时是非原子的。操作期间的服务器退出 TRUNCATE TABLE可能会导致删除表InnoDB SYS_FOREIGNSYS_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_nametable_name#P#partition_name#SP#subpartition_nameinnodb_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 positionUNTILSQL_BEFORE_GTIDSSTART SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_positionSTART 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)REPLACEER_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)-Wxxx-Wno-xxx

  • INFORMATION_SCHEMA.EVENTS.LAST_EXECUTED和 的值之间可能存在差异 mysql.event.last_executed。这不再发生。事件信息存储在 mysql.events不可见的数据字典表中,因此这INFORMATION_SCHEMA.EVENTS 是事件元数据的唯一接口。(缺陷号 21374010)

  • 视图可以在评估来自视图定义的限制之前评估用户定义的或 SQL 函数。(缺陷号 20933307)

  • 对于-DENABLE_DTRACE=ONCMake不检查是否存在有效的 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)

  • INSERTand 等LOAD DATA使用 REPLACEorIGNORE关键字处理重复记录的 语句可能会影响后续操作。(缺陷号 20017428)

  • CREATE TABLE ... SELECTBIT从源表中选择非数据到BIT目标表中的列可能会导致服务器退出。(缺陷号 19930894)

  • -DMYSQL_MAINTAINER_MODE=1当使用 clang/Xcode 6.0 配置和编译 MySQL 时,在 OS X 上编译失败 。(缺陷 #19694515,缺陷 #74100)

  • 对于CHANGE MASTER TO在写入通用查询日志之前重写以过滤密码的语句,任何MASTER_AUTO_POSITION 子句都会丢失。(漏洞 #19622609)

  • 在子句中使用VALUES()函数 SELECT可能会导致服务器退出。(漏洞 #19601973)

  • 表重命名代码中潜在的空指针取消引用和内存泄漏已得到纠正。(漏洞 #18194270)

  • 用于MATCH ... AGAINST比较字符列和聚合函数可能会导致服务器退出。(漏洞#17865492)

  • 可以在各种信息源中报告略有不同的连接数值,例如 Connections状态变量、性能模式threadsglobal_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.dmp,其中module_name是服务器可执行文件的名称。为了防止早期的小型转储文件被覆盖,小型转储文件名现在包括进程 ID 并具有以下形式 :例如,。(漏洞 #12779463)module_name..piddmpmysqld.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()and RIGHT()。(缺陷 #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)

  • REPEAT()函数未正确处理 SUBSTR()函数的输出。(错误#79695,错误#22391186)

  • 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 TABLEDATA DIRECTORY如果为or INDEX DIRECTORY表选项指定了很长或不正确的路径名,则报告不正确的错误。现在 ER_PATH_LENGTHER_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 TABLETRUNCATE TABLERENAME TABLE由于从 .frm文件中错误地确定了引擎而无法工作。(错误#74277,错误#19902868)

  • 执行的准备好的语句被记录下来, ?参数标记被数据值替换。记录字符串的构建效率低下并且已得到改进。(缺陷 #73056,缺陷 #20955496)

  • 插件对其字符串类型的线程变量的分配可能会泄漏内存。(错误#71759,错误#19917521)

  • 当从基表中选择时,使用 视图分组可能会产生 ER_INVALID_GROUP_FUNC_USE错误(无效使用分组功能” )。(错误#70220,错误#17406425)

  • 旨在与存储引擎无关但实际上使用特定引擎的测试用例已得到纠正。