1.4 MySQL 5.7 的新增功能
本节总结了 MySQL 5.7 新增,弃用和删除的内容。随附的部分列出了在 MySQL 5.7 中已添加,不建议使用或删除的 MySQL 服务器选项和变量。参见第 1.5 节“在 MySQL 5.7 中添加,不建议使用或删除的服务器和状态变量及选项”。
MySQL 5.7 中添加的功能
以下功能已添加到 MySQL 5.7:
- 安全性增强. 添加了以下安全性增强:
-
在 MySQL 8.0 中,
caching_sha2_password
是默认的身份验证插件。为了使 MySQL 5.7Client 端能够使用通过caching_sha2_password
进行身份验证的帐户连接到 8.0 服务器,MySQL 5.7Client 端库和 Client 端程序支持从 MySQL 5.7.23 开始的caching_sha2_password
Client 端身份验证插件。这提高了 MySQL 5.7 与 MySQL 8.0 及更高版本服务器的兼容性。参见第 6.4.1.4 节“缓存 SHA-2 可插入身份验证”。-
服务器现在要求
mysql.user
系统 table 中的帐户行具有非空的plugin
列值,并禁用具有空值的帐户。有关服务器升级的说明,请参阅第 2.11.3 节“ MySQL 5.7 中的更改”。建议 DBA 也将使用mysql_old_password
身份验证插件的帐户转换为使用mysql_native_password
,因为已经删除了对mysql_old_password
的支持。有关帐户升级的说明,请参见第 6.4.1.3 节“迁移到 4.1 版之前的密码哈希和 mysql_old_password 插件”。 -
MySQL 现在使数据库 Management 员可以构建自动密码过期策略:任何使用密码已超过其允许使用期限的帐户连接到服务器的用户,都必须更改密码。有关更多信息,请参见第 6.2.11 节“密码 Management”。
-
Management 员可以锁定和解锁帐户,以更好地控制谁可以登录。有关更多信息,请参阅第 6.2.15 节“锁定帐户”。
-
为了更轻松地支持安全连接,使用 OpenSSL 编译的 MySQL 服务器可以在启动时自动生成丢失的 SSL 和 RSA 证书以及密钥文件。参见第 6.3.3.1 节“使用 MySQL 创建 SSL 和 RSA 证书和密钥”。
-
如果未明确为 SSL 配置所有服务器,则所有服务器如果在数据目录中找到必需的 SSL 文件,则尝试在启动时自动启用 SSL。参见第 6.3.1 节“配置 MySQL 以使用加密连接”。
另外,MySQL 发行版包含mysql_ssl_rsa_setupUtil,可以手动调用该 Util 来创建 SSL 和 RSA 密钥以及证书文件。有关更多信息,请参见第 4.4.5 节“ mysql_ssl_rsa_setup-创建 SSL/RSA 文件”。
-
默认情况下,使用mysqld --initialize安装的 MySQL 部署是安全的。已将以下更改作为默认部署 Feature 实现:
-
安装过程仅创建一个
root
帐户'root'@'localhost'
,自动为此帐户生成一个随机密码,并将该密码标记为过期。 MySQLManagement 员必须使用随机密码以root
的身份连接并分配新密码。 (服务器将随机密码写入错误日志.)-
安装不会创建任何匿名用户帐户。
-
安装不会创建
test
数据库。
-
有关更多信息,请参见第 2.10.1 节“初始化数据目录”。
-
MySQL 企业版现在提供数据屏蔽和取消标识功能。数据屏蔽通过用替代品替换实际值来隐藏敏感信息。 MySQL Enterprise Data Masking 和 De-Identification 功能可使用多种方法来掩蔽现有数据,例如混淆(删除识别 Feature),格式化随机数据的生成以及数据替换或替换。有关更多信息,请参见第 6.4.7 节“ MySQL 企业数据屏蔽和取消标识”。
-
现在,MySQL 将授予命名管道上的 Client 端的访问控制设置为在 Windows 上成功进行通信所需的最低要求。较新的 MySQLClient 端软件无需任何其他配置即可打开命名管道连接。如果不能立即升级旧的 Client 端软件,则可以使用新的named_pipe_full_access_group系统变量为 Windows 组授予打开命名管道连接的必要权限。完全访问权限组的成员资格应受到限制且是临时的。
-
SQL 模式更改. 现在默认情况下为事务存储引擎(STRICT_TRANS_TABLES)启用严格的 SQL 模式。
ONLY_FULL_GROUP_BY SQL 模式的实现已经变得更加复杂,不再拒绝以前被拒绝的确定性查询。因此,现在默认情况下启用了此模式,以仅禁止包含不能保证在组内唯一确定的 table 达式的不确定查询。
现在已弃用ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL 模式,但默认情况下启用。长期计划是将它们包含在严格的 SQL 模式中,并在将来的 MySQL 版本中将它们作为显式模式删除。参见MySQL 5.7 中的 SQL 模式更改。
对默认 SQL 模式的更改导致启用以下模式的默认sql_mode系统变量值:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER和NO_ENGINE_SUBSTITUTION。
- 在线 ALTER TABLE.
ALTER TABLE
现在支持重命名索引的RENAME INDEX
子句。无需进行 table 复制操作即可进行更改。它适用于所有存储引擎。参见第 13.1.8 节“ ALTER TABLE 语句”。
- ngram 和 MeCab 全文分析器插件. MySQL 提供了一个内置的全文 ngram 解析器插件,该插件支持中文,日文和韩文(CJK),以及一个可安装的 MeCab 全文分析器插件,用于日语。
有关更多信息,请参见第 12.9.8 节“ ngram 全文分析器”和第 12.9.9 节“ MeCab 全文分析器插件”。
- InnoDB 增强功能. 添加了这些
InnoDB
增强功能:
- 可以使用就地ALTER TABLE来增加VARCHAR列的大小,如以下示例所示:
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
只要VARCHAR列所需的长度字节数保持不变,这就是事实。对于大小为 0 到 255 个字节的VARCHAR列,需要一个长度的字节来编码该值。对于大小为 256 字节或更大的VARCHAR列,需要两个长度的字节。结果,就地ALTER TABLE仅支持将VARCHAR列的大小从 0 增大到 255 字节,或从 256 字节增大到更大的大小。就地ALTER TABLE不支持将VARCHAR列的大小从少于 256 个字节增加到等于或大于 256 个字节的大小。在这种情况下,所需的长度字节数从 1 更改为 2,这仅由 table 副本(ALGORITHM=COPY
)支持。
不支持使用就地ALTER TABLE减小VARCHAR的大小。减小VARCHAR大小需要 table 副本(ALGORITHM=COPY
)。
有关更多信息,请参见第 14.13.1 节“在线 DDL 操作”。
-
通过优化CREATE TABLE,DROP TABLE,TRUNCATE TABLE和ALTER TABLE语句,改进了
InnoDB
临时 table 的 DDL 性能。 -
InnoDB
个临时 table 元数据不再存储到InnoDB
个系统 table 中。相反,新 tableINNODB_TEMP_TABLE_INFO
为用户提供了活动临时 table 的快照。该 table 包含在给定的InnoDB
实例中处于活动状态的所有用户和系统创建的临时 table 的元数据和报告。该 table 是针对第一个SELECT
语句运行时创建的。 -
InnoDB
现在支持 MySQL 支持的空间数据类型。在此版本之前,InnoDB
将空间数据存储为二进制BLOB数据。BLOB
仍然是基础数据类型,但是空间数据类型现在已 Map 到新的InnoDB
内部数据类型DATA_GEOMETRY
。 -
现在,所有非压缩的
InnoDB
临时 table 都有一个单独的 table 空间。新 table 空间总是在服务器启动时重新创建,默认情况下位于DATADIR
中。新添加的配置文件选项innodb_temp_data_file_path允许用户定义的临时数据文件路径。 -
innochecksum功能通过多个新选项和扩展功能得到增强。参见第 4.6.1 节“ innochecksum —脱机 InnoDB 文件校验和 Util”。
-
现在,临时 table 空间中将同时存在用于普通和压缩临时 table 以及相关对象的新型非重做撤消日志。有关更多信息,请参见第 14.6.7 节“撤消日志”。
-
InnoDB
缓冲池的转储和加载操作得到增强。新的系统变量innodb_buffer_pool_dump_pct允许您指定每个缓冲池中要读取和转储的最近使用页面的百分比。当InnoDB
后台任务正在执行其他 I/O 活动时,InnoDB
尝试使用innodb_io_capacity设置来限制每秒缓冲池加载操作的数量。 -
InnoDB
已添加对全文分析器插件的支持。有关全文分析器插件的信息,请参见全文解析器插件和第 28.2.4.4 节“编写全文分析器插件”。 -
InnoDB
支持多个页面清除器线程,用于从缓冲池实例中刷新脏页面。新的系统变量innodb_page_cleaners
用于指定页面清洁程序线程的数量。缺省值1
保留以前的配置,其中只有一个页面清洁程序线程。此增强功能基于 MySQL 5.6 中完成的工作,MySQL 5.6 中引入了一个单页清理程序线程以从InnoDB
主线程上卸载缓冲池刷新工作。 -
Online DDL支持扩展到常规和分区
InnoDB
table 的以下操作: -
-
ALTER TABLE ... ENGINE = INNODB(在
InnoDB
table 上运行时)
Online DDL支持减少了 table 重建时间,并允许并发 DML。参见第 14.13 节“ InnoDB 和在线 DDL”。
-
Linux 上的 Fusion-io 非易失性内存(NVM)文件系统提供atomic写入功能,这使
InnoDB
doublewrite buffer成为冗余。对于支持原子写入的 Fusion-io 设备上的系统 table 空间文件(ibdata files),将自动禁用InnoDB
doublewrite 缓冲区。 -
InnoDB
支持分区InnoDB
table 和单个InnoDB
table 分区的Transportable Tablespace功能。此增强功能简化了分区 table 的备份过程,并允许在 MySQL 实例之间复制分区 table 和单个 table 分区。有关更多信息,请参见第 14.6.1.3 节“导入 InnoDBtable”。 -
innodb_buffer_pool_size参数是动态的,允许您在不重新启动服务器的情况下调整缓冲池的大小。调整大小操作涉及将页面移动到内存中的新位置,它是按块执行的。块大小可以使用新的innodb_buffer_pool_chunk_size配置选项进行配置。您可以使用新的Innodb_buffer_pool_resize_status status 变量监视调整大小的进度。有关更多信息,请参见在线配置 InnoDB 缓冲池大小。
-
多线程页面清理程序支持(innodb_page_cleaners)已扩展到关闭和恢复阶段。
-
InnoDB
支持使用SPATIAL
索引对空间数据类型进行索引,包括使用ALTER TABLE ... ALGORITHM =插入进行在线操作(ADD SPATIAL INDEX
)。 -
InnoDB
在创建或重建索引时执行批量加载。这种索引创建方法称为“排序索引构建”。此增强功能提高了索引创建的效率,也适用于全文本索引。新的全局配置选项innodb_fill_factor定义了在排序的索引构建过程中每个页面上已填充数据的空间的百分比,剩余的空间保留给将来的索引增长。有关更多信息,请参见第 14.6.2.3 节“排序的索引构建”。 -
新的日志记录类型(
MLOG_FILE_NAME
)用于标识自上一个检查点以来已被修改的 table 空间。此增强功能简化了崩溃恢复过程中的 table 空间发现,并消除了在重做日志应用程序之前对文件系统进行的扫描。有关此增强功能好处的更多信息,请参见故障恢复期间的 table 空间发现。
此增强功能更改了重做日志格式,要求在升级到 MySQL 5.7.5 或从 MySQL 5.7.5 降级之前,请彻底关闭 MySQL。
-
您可以截断驻留在撤消 table 空间中的撤消日志。使用innodb_undo_log_truncate配置选项可启用此功能。有关更多信息,请参见截断撤消 table 空间。
-
InnoDB
支持本机分区。以前,InnoDB
依靠ha_partition
处理程序,该处理程序为每个分区创建一个处理程序对象。对于本机分区,已分区的InnoDB
table 使用单个分区感知处理程序对象。此增强功能减少了InnoDB
分区 table 所需的内存量。
从 MySQL 5.7.9 开始,mysql_upgrade查找并尝试升级使用ha_partition
处理程序创建的分区InnoDB
table。同样在 MySQL 5.7.9 和更高版本中,您可以使用ALTER TABLE ...升级分区在mysqlClient 端中按名称升级此类 table。
InnoDB
支持使用CREATE TABLESPACE语法创建常规 table 空间。
CREATE TABLESPACE `tablespace_name`
ADD DATAFILE 'file_name.ibd'
[FILE_BLOCK_SIZE = n]
常规 table 空间可以在 MySQL 数据目录之外创建,可以容纳多个 table,并支持所有行格式的 table。
使用创建 tabletbl_name ... TABLESPACE [=] tablespace_name或ALTER TABLE tbl_name TABLESPACE [=] tablespace_name语法将 table 添加到常规 table 空间。
有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”。
-
DYNAMIC
代替COMPACT
作为InnoDB
table 的隐式默认行格式。新的配置选项innodb_default_row_format指定默认的InnoDB
行格式。有关更多信息,请参见定义 table 格的行格式。 -
从 MySQL 5.7.11 开始,
InnoDB
支持每 table 文件 table 空间的静态数据加密。通过在创建或更改InnoDB
table 时指定ENCRYPTION
选项来启用加密。此功能依靠keyring
插件进行加密密钥 Management。有关更多信息,请参见第 6.4.4 节“ MySQL 密钥环”和第 14.14 节“ InnoDB 静态数据加密”。 -
从 MySQL 5.7.24 开始,与 MySQLBinding 在一起的zlib library版本从 1.2.3 版本提高到 1.2.11 版本。 MySQL 在 zlib 库的帮助下实现了压缩。
如果您使用InnoDB
个压缩 table,请参阅第 2.11.3 节“ MySQL 5.7 中的更改”了解相关的升级含义。
- JSON 支持. 从 MySQL 5.7.8 开始,MySQL 支持本机JSON类型。 JSON 值不存储为字符串,而是使用内部二进制格式存储,该格式允许快速读取文档元素。插入或更新
JSON
列中存储的 JSON 文档时,它们会自动进行验证,其中无效的文档会产生错误。 JSON 文档在创建时已标准化,可以使用大多数比较运算符进行比较,例如=
,<
,<=
,>
,>=
,<>
,!=
和<=>
;有关比较JSON
值时 MySQL 支持的运算符以及优先级和其他规则的信息,请参见JSON 值的比较和排序。
MySQL 5.7.8 还引入了许多用于处理JSON值的函数。这些功能包括此处列出的功能:
-
创建
JSON
值的函数:JSON_ARRAY(),JSON_MERGE()和JSON_OBJECT()。参见第 12.17.2 节“创建 JSON 值的函数”。-
搜索
JSON
值的函数:JSON_CONTAINS(),JSON_CONTAINS_PATH(),JSON_EXTRACT(),JSON_KEYS()和JSON_SEARCH()。参见第 12.17.3 节“搜索 JSON 值的函数”。 -
修改
JSON
值的函数:JSON_APPEND(),JSON_ARRAY_APPEND(),JSON_ARRAY_INSERT(),JSON_INSERT(),JSON_QUOTE(),JSON_REMOVE(),JSON_REPLACE(),JSON_SET()和JSON_UNQUOTE()。参见第 12.17.4 节“修改 JSON 值的函数”。 -
提供有关
JSON
值的信息的函数:JSON_DEPTH(),JSON_LENGTH(),JSON_TYPE()和JSON_VALID()。参见第 12.17.5 节“返回 JSON 值属性的函数”。
-
在 MySQL 5.7.9 和更高版本中,您可以使用column->path作为JSON_EXTRACT(column, path)的简写。只要在 SQL 语句中可以出现列标识符的地方(包括WHERE
,ORDER BY
和GROUP BY
子句),它就可以用作列的别名。这包括SELECT,UPDATE,DELETE,CREATE TABLE和其他 SQL 语句。左侧必须是JSON列标识符(而不是别名)。右侧是带引号的 JSON 路径 table 达式,该 table 达式将针对作为列值返回的 JSON 文档进行评估。
MySQL 5.7.22 添加了以下 JSON 函数:
-
两个 JSON 聚合函数JSON_ARRAYAGG()和JSON_OBJECTAGG()。
JSON_ARRAYAGG()
将列或 table 达式作为其参数,并将结果汇总为单个JSON数组。该 table 达式可以求值为任何 MySQL 数据类型;不必是JSON
值。JSON_OBJECTAGG()
接受两列或 table 达式,将其解释为键和值;它将结果作为单个JSON
对象返回。有关更多信息和示例,请参见第 12.20 节“聚合函数”。- JSONUtil 功能JSON_PRETTY(),以易于读取的格式输出现有的JSON值;每个 JSON 对象成员或数组值都打印在单独的一行上,并且子对象或数组相对于其父对象要有 2 个空格。
此函数还可以与可解析为 JSON 值的字符串一起使用。
另请参见第 12.17.6 节“ JSONUtil 函数”。
- JSONUtil 函数JSON_STORAGE_SIZE(),它返回在进行任何部分更新之前用于 JSON 文档的二进制 table 示的存储空间(以字节为单位)(请参阅上一项)。
此函数还接受 JSON 文档的有效字符串 table 示形式。对于这样的值,JSON_STORAGE_SIZE()
返回其二进制 table 示形式转换为 JSON 文档后使用的空间。对于包含 JSON 文档的字符串 table 示形式的变量,JSON_STORAGE_FREE()
返回零。如果不能将其(非 null)参数解析为有效的 JSON 文档,则任何一个函数都会生成错误;如果参数是NULL
,则每个函数都生成NULL
。
有关更多信息和示例,请参见第 12.17.6 节“ JSONUtil 函数”。
-
旨在符合RFC 7396的 JSON 合并功能。 JSON_MERGE_PATCH(),当用于 2 个 JSON 对象时,会将它们合并为一个 JSON 对象,该对象具有以下集合的并集:
-
第一个对象的每个成员,在第二个对象中不存在具有相同键的成员。
-
第二个对象的每个成员,在第一个对象中没有成员具有相同的键,并且其值不是 JSON
null
Literals。 -
每个成员都具有在两个对象中都存在的键,并且其在第二个对象中的值不是 JSON
null
Literals。
-
在这项工作中,JSON_MERGE()函数已重命名为JSON_MERGE_PRESERVE()。 JSON_MERGE()
在 MySQL 5.7 中 continue 被视为JSON_MERGE_PRESERVE()
的别名,但现在已弃用,并且在将来的 MySQL 版本中会被删除。
有关更多信息和示例,请参见第 12.17.4 节“修改 JSON 值的函数”。
有关->
和JSON_EXTRACT()
的更多信息,请参见第 12.17.3 节“搜索 JSON 值的函数”。有关 MySQL 5.7 中 JSON 路径支持的信息,请参见搜索和修改 JSON 值。另请参见索引生成的列以提供 JSON 列索引。
- 系统和状态变量. 现在,性能模式 table 中提供了系统和状态变量信息,而不是使用
INFORMATION_SCHEMA
table 来获取这些变量。这也会影响SHOW VARIABLES和SHOW STATUS语句的操作。 show_compatibility_56系统变量的值影响系统和状态变量语句和 table 所产生的输出以及所需的特权。有关详细信息,请参见第 5.1.7 节“服务器系统变量”中对该变量的描述。
Note
show_compatibility_56的默认值为OFF
。需要 5.6 行为的应用程序应将此变量设置为ON
,直到将它们迁移到系统变量和状态变量的新行为为止。参见第 25.20 节“迁移到性能模式系统和状态变量 table”
- sys 模式. MySQL 发行版现在包含sys模式,这是一组对象,可帮助 DBA 和开发人员解释由性能模式收集的数据。 sys架构对象可用于典型的调整和诊断用例。有关更多信息,请参见第 26 章,MySQL sys 模式。
- 条件处理. MySQL 现在支持堆叠的诊断区域。推入诊断区域堆栈时,第一个(当前)诊断区域将成为第二个(堆叠)诊断区域,并创建一个新的当前诊断区域作为其副本。在条件处理程序中,执行的语句会修改新的当前诊断区域,但是获取堆叠诊断可用于检查堆叠的诊断区域,以获取有关导致处理程序激活的条件的信息,而与处理程序自身内部的当前条件无关。 (以前,只有一个诊断区域.要检查处理程序中的处理程序激活条件,必须在执行任何可能更改它的语句之前检查该诊断区域.)请参见第 13.6.7.3 节“获取诊断声明”和第 13.6.7.7 节“ MySQL 诊断区域”。
- Optimizer. 添加了以下优化器增强功能:
- EXPLAIN可用于获取在命名 Connecting 执行的可解释语句的执行计划:
EXPLAIN [options] FOR CONNECTION connection_id;
有关更多信息,请参见第 8.8.4 节“获取命名连接的执行计划信息”。
-
可以在单个 SQL 语句中向优化器提供提示,这比使用optimizer_switch系统变量可以更好地控制语句执行计划。与EXPLAIN一起使用的语句中还允许使用提示,使您能够查看提示如何影响执行计划。有关更多信息,请参见第 8.9.3 节“优化程序提示”。
-
触发器. 以前,对于触发器事件(INSERT,UPDATE,DELETE)和动作时间(
BEFORE
,AFTER
)的每种组合,一个 table 最多可以具有一个触发器。此限制已取消,并且允许多个触发器。有关更多信息,请参见第 23.3 节“使用触发器”。
- 记录. 添加了以下记录增强功能:
-
以前,在 Unix 和类似 Unix 的系统上,MySQL 通过将mysqld_safe捕获服务器错误输出并将其传递给
syslog
来实现将服务器错误日志发送到syslog
的支持。该服务器现在包括本机syslog
支持,该支持已扩展为包括 Windows。有关将服务器错误输出发送到syslog
的更多信息,请参见第 5.4.2 节“错误日志”。- mysqlClient 端现在具有--syslog选项,该选项导致将交互式语句发送到系统
syslog
设施。对于与默认“忽略”模式列 table("*IDENTIFIED*:*PASSWORD*"
)匹配的语句以及与使用--histignore选项指定的任何模式匹配的语句,将禁止记录日志。参见第 4.5.1.3 节“ mysqlClient 端记录”。
- mysqlClient 端现在具有--syslog选项,该选项导致将交互式语句发送到系统
-
Generated Columns. MySQL 现在支持在CREATE TABLE和ALTER TABLE语句中指定生成的列。根据列创建时指定的 table 达式计算生成的列的值。生成的列可以是虚拟的(读取行时“即时”计算)或存储(插入或更新行时计算)。有关更多信息,请参见第 13.1.18.7 节“创建 table 和生成的列”。
- mysqlClient 端. 以前, 中的 Ctrl C 中断当前语句(如果存在),否则中断 mysql。现在, Control C (如果存在)会中断当前语句,否则会取消任何部分 Importing 行,但不会退出。
- 使用 mysqlbinlog 重写数据库名称. 现在,通过使用 MySQL 5.7.1 中添加的--rewrite-db选项,当从使用基于行格式编写的二进制日志中读取数据时,可以通过mysqlbinlog重命名数据库。
此选项使用格式--rewrite-db='dboldname->dbnewname'
。您可以通过多次指定选项来实现多个重写规则。
- 带分区 table 的 HANDLER. HANDLER语句现在可以与用户分区 table 一起使用。此类 table 可以使用任何可用的分区类型(请参阅第 22.2 节“分区类型”)。
- 对分区 table 的索引条件下推支持. 使用InnoDB或MyISAM存储引擎对分区 table 进行查询时,可以采用 MySQL 5.6 中引入的索引条件下推优化。有关更多信息,请参见第 8.2.1.5 节“索引条件下推优化”。
- 不支持 ALTER TABLE ... EXCHANGE PARTITION 的验证. 从 MySQL 5.7.5 开始,ALTER TABLE ...交换分区语法包括一个可选的
{WITH|WITHOUT} VALIDATION
子句。如果指定WITHOUT VALIDATION
,则在与分区交换已填充的 table 时ALTER TABLE ...交换分区不会执行逐行验证,从而使数据库 Management 员可以承担确保行在分区定义的边界内的责任。WITH VALIDATION
是默认行为,无需明确指定。有关更多信息,请参见第 22.3.3 节“用 table 交换分区和子分区”。
- 改进了主转储线程. 重构了主转储线程,以减少锁争用并提高主吞吐量。在 MySQL 5.7.2 之前的版本中,每当读取事件时,转储线程就锁定二进制日志。在 MySQL 5.7.2 和更高版本中,仅在读取上一次成功写入的事件结束时的位置时才保留此锁定。这意味着多个转储线程现在都可以从二进制日志文件中同时读取,并且转储线程现在可以在 Client 端向二进制日志写入时读取。
- 字符集支持. MySQL 5.7.4 包含一个
gb18030
字符集,该字符集支持中国国家标准 GB18030 字符集。有关 MySQL 字符集支持的更多信息,请参见第 10 章,字符集,排序规则,Unicode。
- 在不使用 STOP SLAVE 的情况下更改复制母版. 在 MySQL 5.7.4 及更高版本中,删除了在发出任何更改为主语句之前执行STOP SLAVE的严格要求。现在,
CHANGE MASTER TO
的行为不再取决于从站是否停止,而取决于从站 SQL 线程和从站 I/O 线程的状态。现在,这些线程中的哪个线程已停止或正在运行,确定了在给定时间点可以与CHANGE MASTER TO
语句一起使用或不能使用的选项。进行此确定的规则在此处列出:
-
如果 SQL 线程已停止,则即使从属 I/O 线程正在运行,也可以使用
RELAY_LOG_FILE
,RELAY_LOG_POS
和MASTER_DELAY
选项的任意组合来执行CHANGE MASTER TO
。当 I/O 线程正在运行时,此语句不能与其他选项一起使用。-
如果 I/O 线程已停止,则即使使用 SQL 线程,也可以使用此语句的任何选项(以任何允许的组合)* _1 *除外
RELAY_LOG_FILE
,RELAY_LOG_POS
或MASTER_DELAY
来执行CHANGE MASTER TO
。当 I/O 线程正在运行时,可能无法使用这三个选项。 -
在发出
CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1
之前,必须停止 SQL 线程和 I/O 线程。
-
您可以使用显示从站状态检查从属 SQL 和 I/O 线程的当前状态。
如果使用的是基于语句的复制和临时 table,则STOP SLAVE
语句后的CHANGE MASTER TO
语句可能会在从属服务器上留下临时 table。作为这组改进的一部分,当使用基于语句的复制并且Slave_open_temp_tables保持大于 0 时,在STOP SLAVE
之后发出CHANGE MASTER TO
之后,现在会发出警告。
有关更多信息,请参见第 13.4.2.1 节“将主 table 更改为语句”和第 16.3.7 节“故障转移期间切换源”。
- 测试套件. MySQL 测试套件现在使用
InnoDB
作为默认存储引擎。
- 现在可以进行多源复制. MySQL 多源复制增加了从多个主服务器复制到从服务器的能力。 MySQL 多源复制拓扑可用于将多个服务器备份到单个服务器,合并 table 分片,并将数据从多个服务器合并到单个服务器。参见第 16.1.5 节“ MySQL 多源复制”。
作为 MySQL 多源复制的一部分,已添加复制通道。复制通道使从属服务器可以打开多个要复制的连接,每个通道都是与主服务器的连接。参见第 16.2.3 节“复制通道”。
- 组复制性能模式 table. MySQL 5.7 向性能模式添加了许多新 table,以提供有关复制组和通道的信息。这些 table 格包括:
所有这些 table 都是在 MySQL 5.7.2 中添加的,除了replication_group_members
和replication_group_member_stats
是在 MySQL 5.7.6 中添加的。有关更多信息,请参见第 25.12.11 节,“性能架构复制 table”。
- 组复制 SQL. 在 MySQL 5.7.6 中添加了以下语句来控制组复制:
有关更多信息,请参见第 13.4.3 节“用于控制组复制的 SQL 语句”。
MySQL 5.7 中不推荐使用的功能
以下功能在 MySQL 5.7 中已弃用,并且可能在以后的系列中被删除或将被删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用在更高版本的 MySQL 系列中已删除的 MySQL 5.7 中不推荐使用的功能的应用程序,将语句从 MySQL 5.7 主服务器复制到更高系列的从服务器时,语句可能会失败,或者可能会对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用 5.7 中不推荐使用的功能的应用程序,以避免出现这种情况,并在可能的情况下使用替代方法。
- 现在已弃用ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL 模式,但默认情况下启用。长期计划是将它们包含在严格的 SQL 模式中,并在将来的 MySQL 版本中将它们作为显式模式删除。
仍然可以识别已弃用的ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL 模式,以便命名它们的语句不会产生错误,但是会在 MySQL 的 Future 版本中将其删除。为了为不存在这些模式名称的 MySQL 版本做提前准备,应修改应用程序以使其不引用它们。参见MySQL 5.7 中的 SQL 模式更改。
- 这些 SQL 模式现已被弃用,并将在 MySQL 的 Future 版本中删除:DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。这些弃用有两个含义:
-
为sql_mode系统变量分配不建议使用的模式将产生警告。
- 启用MAXDB SQL 模式后,使用CREATE TABLE或ALTER TABLE向 table 中添加TIMESTAMP列会产生警告。
-
帐户 Management 对帐单的更改使以下功能过时了。现在不推荐使用:
-
使用GRANT创建用户。而是使用CREATE USER。遵循这种做法会使GRANT语句对NO_AUTO_CREATE_USER SQL 模式不重要,因此也不建议使用。
-
使用GRANT修改权限分配以外的帐户属性。这包括身份验证,SSL 和资源限制属性。相反,应在创建帐户时使用CREATE USER构建此类属性,或随后使用ALTER USER对其进行修改。
-
CREATE USER和GRANT的
IDENTIFIED BY PASSWORD 'auth_string'
语法。而是将IDENTIFIED WITH auth_plugin AS 'auth_string'
table 示CREATE USER和ALTER USER,其中'auth_string'
值的格式与命名插件兼容。
- PASSWORD()函数已被弃用,在任何情况下都应避免使用。因此,也不赞成使用设置密码... =密码('auth_string')语法。 设置密码... ='auth_string'语法未过时;但是,ALTER USER现在是分配密码的首选语句。
- old_passwords系统变量。帐户身份验证插件不能再在
mysql.user
系统 table 中保留未指定的位置,因此,从明 Literals 符串分配密码的任何语句都可以在将其存储在mysql.user
table 中之前,明确确定要对该字符串使用的哈希方法。这使old_passwords变得多余。
- 不建议使用查询缓存。弃用包括以下各项:
SQL_CACHE
和SQL_NO_CACHE
SELECT修饰符。
- 这些系统变量:have_query_cache,ndb_cache_check_time,query_cache_limit,query_cache_min_res_unit,query_cache_size,query_cache_type,query_cache_wlock_invalidate。
- 这些状态变量:Qcache_free_blocks,Qcache_free_memory,Qcache_hits,Qcache_inserts,Qcache_lowmem_prunes,Qcache_not_cached,Qcache_queries_in_cache,Qcache_total_blocks。
- 以前,--transaction-isolation和--transaction-read-only服务器启动选项对应于tx_isolation和tx_read_only系统变量。为了使启动选项和系统变量名称之间更好的名称对应,已创建transaction_isolation和transaction_read_only作为tx_isolation和tx_read_only的别名。 tx_isolation和tx_read_only变量现已弃用,并将在 MySQL 8.0 中删除。应将应用程序调整为使用transaction_isolation和transaction_read_only代替。
- 不推荐使用--skip-innodb选项及其同义词(
--innodb=OFF
,--disable-innodb
等)。这些选项自 MySQL 5.7 起无效。因为InnoDB
无法禁用。
- Client 端的--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_options()的MYSQL_OPT_SSL_ENFORCE
和MYSQL_OPT_SSL_VERIFY_SERVER_CERT
选项与 Client 端--ssl和--ssl-verify-server-cert选项相对应,并且已弃用。请将MYSQL_OPT_SSL_MODE
与选项值SSL_MODE_REQUIRED
或SSL_MODE_VERIFY_IDENTITY
一起使用。
- log_warnings系统变量和--log-warnings服务器选项已弃用。请改用log_error_verbosity系统变量。
- --temp-pool服务器选项已弃用。
- binlog_max_flush_queue_time系统变量在 MySQL 5.7 中不执行任何操作,从 MySQL 5.7.9 开始不推荐使用。
- 从 MySQL 5.7.10 开始,已弃用innodb_support_xa系统变量,该变量启用
InnoDB
支持 XA 事务中的两阶段提交。从 MySQL 5.7.10 开始,始终启用对 XA 事务中的两阶段提交的InnoDB
支持。
- metadata_locks_cache_size和metadata_locks_hash_instances系统变量已弃用。从 MySQL 5.7.4 开始,这些功能不起作用。
- sync_frm系统变量已弃用。
- 全局character_set_database和collation_database系统变量已弃用,并将在 MySQL 的将来版本中删除。
不建议为会话character_set_database和collation_database系统变量分配值,并且分配会产生警告。会话变量在 MySQL 的 Future 版本中将变为只读,并且赋值将产生错误。仍然可以访问会话变量,以确定默认数据库的数据库字符集和排序规则。
- sql_log_bin系统变量的全局作用域已被弃用,现在只能使用会话作用域设置此变量。语句设置全局 SQL_LOG_BIN现在产生一个错误。仍然可以读取
sql_log_bin
的全局值,但这样做会产生警告。您应该立即采取行动,从应用程序中删除与读取此值有关的所有依赖关系。 MySQL 8.0 中删除了全局范围sql_log_bin
。
- 随着 MySQL 8.0 中数据字典的引入,--ignore-db-dir选项和ignore_db_dirs系统变量变得多余,并在该版本中被删除。因此,它们在 MySQL 5.7 中已弃用。
- 默认情况下,
GROUP BY
隐式排序(即在没有ASC
或DESC
指示符的情况下),但是不建议使用 MySQL 5.7 中的隐式GROUP BY
排序。要获得分组结果的特定排序 Sequences,最好使用来生成给定的排序 Sequences,对GROUP BY
列使用显式的ASC
或DESC
指示符或提供ORDER BY
子句。GROUP BY
sorting 是一个 MySQL 扩展,在将来的版本中可能会更改;例如,使优化器可以以它认为最有效的任何方式对分组进行排序,并避免排序开销。
- EXPLAIN语句的
EXTENDED
和PARTITIONS
关键字已弃用。这些关键字仍然可以识别,但现在不再需要,因为它们的效果始终处于启用状态。
- ENCRYPT(),ENCODE(),DECODE(),DES_ENCRYPT()和DES_DECRYPT()加密功能已弃用。对于ENCRYPT(),请考虑使用SHA2()代替单向哈希。对于其他,请考虑改用AES_ENCRYPT()和AES_DECRYPT()。 --des-key-file选项,have_crypt系统变量,FLUSH语句的
DES_KEY_FILE
选项和HAVE_CRYPT
CMake 选项也已弃用。
- 不建议使用MBREqual()空间函数。请改用MBREquals()。
- 第 12.16.4 节“从 WKB 值创建几何值的函数”中描述的函数以前接受 WKB 字符串或几何参数。不推荐使用几何参数。有关从不使用几何参数迁移查询的准则,请参见该部分。
INFORMATION_SCHEMA
PROFILINGtable 已弃用。改用性能模式;参见第 25 章,MySQL 性能模式。
INFORMATION_SCHEMA
INNODB_LOCKS和INNODB_LOCK_WAITStable 已过时,将在 MySQL 8.0 中删除,该 table 提供了替换的 Performance Schematable。
- “性能模式setup_timers”table 已弃用,在 MySQL 8.0 中已删除,“ performance_timerstable”中的
TICK
行也已删除。
sys
模式sys.version视图已弃用,并将在以后的 MySQL 版本中删除。受影响的应用程序应进行调整,以使用替代方法。例如,使用VERSION()函数检索 MySQL 服务器版本。
- 在 SQL 语句中不赞成将
\N
作为NULL
的同义词,在 MySQL 8.0 中已删除;使用NULL
代替。
此更改不会影响使用LOAD DATA或选择...进入外档执行的文本文件导入或导出操作,对于NULL
continue 由\N
table 示。参见第 13.2.6 节“ LOAD DATA 语句”。
PROCEDURE ANALYSE()
语法已弃用。
- 不推荐使用mysqlClient 端剥离 Comments 和控制它的选项(--skip-comments,--comments)。
- mysqld_safe对
syslog
输出的支持已弃用。请改用本机服务器syslog
支持。参见第 5.4.2 节“错误日志”。
- 不建议将包含特殊字符的 MySQL 5.1 之前的数据库名称转换为 5.1 格式并添加
#mysql50#
前缀。因此,mysqlcheck的--fix-db-names和--fix-table-names选项以及ALTER DATABASE语句的UPGRADE DATA DIRECTORY NAME
子句也被弃用。
仅支持从一个发行系列升级到另一个发行系列(例如,从 5.0 升级到 5.1,或从 5.1 升级到 5.5),因此,将旧的 5.0 数据库名称转换为当前版本的 MySQL 几乎不需要。解决方法是,先将 MySQL 5.0 安装升级到 MySQL 5.1,然后再升级到最新版本。
- mysql_install_db功能已集成到 MySQL 服务器mysqld中。要使用此功能初始化 MySQL 安装,如果您以前手动调用mysql_install_db,请使用--initialize或--initialize-insecure选项调用mysqld,具体取决于您是否希望服务器为初始
'root'@'localhost'
帐户生成随机密码。
mysql_install_db现在已弃用,mysql_install_db传递给mysqld的特殊--bootstrap选项也已弃用。
- mysql_pluginUtil 已弃用。替代方法包括在服务器启动时使用--plugin-load或--plugin-load-add选项或在运行时使用INSTALL PLUGIN语句加载插件。
- resolveipUtil 已弃用。可以使用 nslookup,host 或 dig 代替。
- resolve_stack_dumpUtil 已弃用。来自官方 MySQL 构建的堆栈跟踪始终是符号化的,因此无需使用resolve_stack_dump。
- 反对使用mysql_kill(),mysql_list_fields(),mysql_list_processes()和mysql_refresh() C API 函数。相应的
COM_PROCESS_KILL
,COM_FIELD_LIST
,COM_PROCESS_INFO
和COM_REFRESH
Client 端/服务器协议命令也是如此。而是使用mysql_query()分别执行KILL,SHOW COLUMNS,SHOW PROCESSLIST或FLUSH语句。
mysql_shutdown()
C API 函数已弃用。而是使用mysql_query()执行SHUTDOWN语句。
- 从 MySQL 5.7.19 开始不推荐使用
libmysqld
嵌入式服务器库。这些也不推荐使用:
-
mysql_config --libmysqld-libs,--embedded-libs和--embedded选项
-
CMake WITH_EMBEDDED_SERVER,WITH_EMBEDDED_SHARED_LIBRARY和INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项
-
(未记录)mysql
--server-arg
选项 -
mysqltest
--embedded-server
,--server-arg
和--server-file
选项 -
mysqltest_embedded 和 mysql_client_test_embedded 测试程序
-
由于libmysqld
使用的 API 与libmysqlclient
类似,因此从libmysqld
迁移的路径很简单:
-
启动一个独立的 MySQL 服务器(mysqld)。
-
修改应用程序代码以删除特定于
libmysqld
的 API 调用。 -
修改应用程序代码以连接到独立的 MySQL 服务器。
-
修改构建脚本以使用
libmysqlclient
而不是libmysqld
。例如,如果您使用mysql_config,请使用--libs选项而不是--libmysqld-libs调用它。 -
replaceUtil 已弃用。
- 不支持 DTrace。
- 从 MySQL 5.7.22 开始不推荐使用JSON_MERGE()函数。请改用JSON_MERGE_PRESERVE()。
- 从 MySQL 5.7.24 开始,不再支持在共享
InnoDB
table 空间中放置 table 分区。共享 table 空间包括InnoDB
系统 table 空间和常规 table 空间。有关标识共享 table 空间中的分区并将其移至每个 table 文件 table 空间的信息,请参阅准备安装以进行升级。
- 从 MySQL 5.7.24 开始,不支持对带有创建临时 table的
TABLESPACE = innodb_file_per_table
和TABLESPACE = innodb_temporary
子句的支持。
--ndb
perror选项已弃用。请改用ndb_perrorUtil。
MySQL 5.7 中删除的功能
以下各项已过时,并且已在 MySQL 5.7 中删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用 MySQL 5.7 中已删除功能的 MySQL 5.6 应用程序,将语句从 MySQL 5.6 主服务器复制到 MySQL 5.7 从服务器时,语句可能会失败,或对主服务器和从服务器产生不同影响。为避免此类问题,应修改使用 MySQL 5.7 中已删除功能的应用程序,以避免它们出现,并在可能的情况下使用替代方法。
- 删除了对使用较早的 4.1 之前的密码哈希格式的密码的支持,其中涉及以下更改。必须修改使用不再受支持的功能的应用程序。
mysql_old_password
身份验证插件已删除。使用该插件的帐户在启动时被禁用,服务器将“未知插件”消息写入错误日志。有关升级使用此插件的帐户的说明,请参阅第 6.4.1.3 节“迁移到 4.1 版之前的密码哈希和 mysql_old_password 插件”。
- 服务器和 Client 端程序的
--secure-auth
选项是默认选项,但现在是禁止操作。不推荐使用,它将在将来的 MySQL 版本中删除。
- 服务器和 Client 端程序的
--skip-secure-auth
选项不再受支持,使用它会产生错误。
- secure_auth系统变量仅允许值为 1;值 0 不再被允许。
- 对于old_passwords系统变量,不再允许使用值 1(产生 4.1 之前的哈希值)。
OLD_PASSWORD()
功能已删除。
- 在 MySQL 5.6.6 中,不建议使用两位数的YEAR(2)数据类型。现在删除了对YEAR(2)的支持。升级到 MySQL 5.7.5 或更高版本后,所有剩余的 2 位YEAR(2)列都必须转换为 4 位YEAR列才能再次使用。有关转换策略,请参见第 11.2.5 节“ 2 位数字年份(2)限制并迁移到 4 位数字年份”。例如,升级后运行mysql_upgrade。
innodb_mirrored_log_groups
系统变量。唯一支持的值为 1,因此没有任何目的。
- storage_engine系统变量。请改用default_storage_engine。
thread_concurrency
系统变量。
- timed_mutexes系统变量。它什么也不做,没有任何效果。
- ALTER TABLE的
IGNORE
子句。
- 不再支持INSERT DELAYED。服务器识别但忽略
DELAYED
关键字,将插入作为非延迟插入进行处理,并生成ER_WARN_LEGACY_SYNTAX_CONVERTED
警告。 (“不再支持 INSERT DELAYED.该语句已转换为 INSERT.”)类似地,REPLACE DELAYED被视为非延迟替换。DELAYED
关键字将在以后的版本中删除。
此外,还删除了一些与DELAYED
相关的选项或功能:
-
mysqldump的
--delayed-insert
选项。-
Performance Schema table_lock_waits_summary_by_tabletable 的
COUNT_WRITE_DELAYED
,SUM_TIMER_WRITE_DELAYED
,MIN_TIMER_WRITE_DELAYED
,AVG_TIMER_WRITE_DELAYED
和MAX_TIMER_WRITE_DELAYED
列。 -
mysqlbinlog不再写提及
INSERT DELAYED
的 Comment。
-
-
Windows 上用于
.sym
文件的数据库符号链接已删除,因为使用 mklink 提供的本机符号链接支持是多余的。任何.sym
文件符号链接都将被忽略,并应替换为使用 mklink 创建的符号链接。参见部分 8.12.3.3,“在 Windows 上使用数据库的符号链接”。
- mysql_upgrade的未使用的
--basedir
,--datadir
和--tmpdir
选项已删除。
- 以前,程序选项可以完整指定,也可以指定为任何明确的前缀。例如,可以将--compress选项作为
--compr
给予mysqldump,但不能将--comp
给予--comp
,因为后者不明确。选项前缀不再受支持;仅接受完整选项。这是因为在为程序实现新选项时,前缀可能会引起问题,而当前明确的前缀将来可能会变得模棱两可。此更改的一些含义:
-
现在必须将
--key-buffer
选项指定为--key-buffer-size
。- 现在必须将
--skip-grant
选项指定为--skip-grant-tables
。
- 现在必须将
-
显示引擎 INNODB MUTEX输出已删除。可通过在Performance Schema个 table 上创建视图来生成可比较的信息。
InnoDB
table 空间监视器和InnoDB
table 监视器被删除。对于 table 监视器,可以从InnoDB
INFORMATION_SCHEMA
个 table 中获取等效信息。
- 用于启用和禁用标准
InnoDB
Monitor 和InnoDB
Lock Monitor(innodb_monitor
和innodb_lock_monitor
)的特殊命名的 table 已删除,并被两个动态系统变量innodb_status_output和innodb_status_output_locks代替。有关更多信息,请参见第 14.18 节“ InnoDB 监视器”。
- 在 MySQL 5.6.3 中已弃用的innodb_use_sys_malloc和innodb_additional_mem_pool_size系统变量已删除。
- msql2mysql , mysql_convert_table_format , mysql_find_rows , mysql_fix_extensions , mysql_setpermission , mysql_waitpid , mysql_zap , mysqlaccess 和 mysqlbug Util。
- mysqlhotcopy **Util。替代方法包括mysqldump和 MySQL Enterprise Backup。
- binary-configure.sh 脚本。
- INNODB_PAGE_ATOMIC_REF_COUNT CMake 选项已删除。
innodb_create_intrinsic
选项已删除。
innodb_optimize_point_storage
选项和相关的内部数据类型(DATA_POINT
和DATA_VAR_POINT
)已删除。
innodb_log_checksum_algorithm
选项已删除。