这是一个里程碑版本,使用风险自负。不支持里程碑版本之间的升级(或从里程碑版本升级到 GA 版本)。重大的开发变更发生在里程碑版本中,您可能会遇到兼容性问题,例如除了运行mysql_upgrade的常规过程之外还需要注意的数据格式更改。例如,您可能会发现有必要在升级前使用mysqldump转储数据并 在升级后重新加载。(无论如何,在升级之前进行备份是一种谨慎的预防措施。)
-
MySQL 5.7 将审计日志文件输出更改为与 Oracle Audit Vault 具有更好兼容性的新格式。现在可以使用新
audit_log_format
系统变量选择旧格式或新格式,该变量的允许值为OLD
和NEW
(默认值NEW
)。有关每种格式的详细信息,请参阅 审核日志文件格式。如果更改 的值
audit_log_format
,请使用此过程避免将一种格式的日志条目写入包含不同格式条目的现有日志文件:停止服务器。
手动重命名当前审计日志文件。
使用新值重新启动服务器
audit_log_format
。审核日志插件将创建一个新的日志文件,其中包含所选格式的日志条目。
编译器的CMake配置为
Clang
在 Linux 上构建设置了更合适的标志。具体来说,-g -fno-omit-frame-pointer -fno-strict-aliasing
现在补充。(漏洞 #17633291)已完成清理源代码库的工作,包括: 删除不需要的CMake检查;从源文件中删除未使用的宏;重组头文件以减少依赖项的数量并使它们更加模块化,删除没有定义的函数声明,用行业标准库中的等效函数替换本地编写的函数。
-
服务器不再为
UNION
满足特定条件的语句使用临时表。相反,它从临时表创建中仅保留执行结果列类型转换所需的数据结构。该表未完全实例化,也没有向其中写入或读取任何行;行直接发送给客户端。结果是减少了内存和磁盘需求,并且第一行发送到客户端之前的延迟更小,因为服务器不需要等到最后一个查询块被执行。EXPLAIN
并且优化器跟踪输出将更改:UNION RESULT
查询块将不存在,因为该块是从临时表读取的部分。有资格在
UNION
没有临时表的情况下进行评估的条件是:工会是
UNION ALL
,不是UNION
或UNION DISTINCT
。没有全局
ORDER BY
条款。联合不是语句的顶级查询块
{INSERT | REPLACE} ... SELECT ...
。
(错误#50674,错误#11758470)
-
优化器现在能够将范围扫描访问方法应用于这种形式的查询:
SELECT ... FROM t1 WHERE ( col_1, col_2 ) IN (( 'a', 'b' ), ( 'c', 'd' ));
以前,要使用范围扫描,查询必须写成:
SELECT ... FROM t1 WHERE ( col_1 = 'a' AND col_2 = 'b' ) OR ( col_1 = 'c' AND col_2 = 'd' );
对于使用范围扫描的优化器,查询必须满足以下条件:
EXPLAIN
适用查询的输出从全表扫描或索引扫描更改为范围扫描。Handler_read_first
通过检查、Handler_read_key
和Handler_read_next
status 变量的值也可以看到更改 。(错误#31188,错误#11747186) -
修改后的
filesort
算法现在包括一项额外的优化,旨在使更多元组适合排序缓冲区:对于 or 类型的其他列CHAR
,VARCHAR
或任何可为 null 的固定大小数据类型,值将被打包。例如,如果不打包,VARCHAR(255)
仅包含 3 个字符的列值在排序缓冲区中占用 255 个字符。通过打包,该值只需要 3 个字符加上一个两字节的长度指示符。对于包含短于最大列长度或许多
NULL
值的可压缩字符串的数据,更多记录适合排序缓冲区。这改进了排序缓冲区的内存排序和临时文件的基于磁盘的合并排序的性能。在边缘情况下,打包可能是不利的:如果可打包字符串是最大列长度或值很少
NULL
,则长度指示符所需的空间会减少适合排序缓冲区的记录数,并且内存和磁盘上的排序速度较慢.如果文件排序使用优先级队列进行排序,则打包不适用,就像
ORDER BY ... LIMIT
应用优化时的情况一样(请参阅 LIMIT 查询优化)。如果 a
filesort
完成,优化器跟踪输出包括一个filesort_summary
块。例如:"filesort_summary": { "rows": 100, "examined_rows": 100, "number_of_tmp_files": 0, "sort_buffer_size": 25192, "sort_mode": "<sort_key, packed_additional_fields>" }
该
sort_mode
值提供有关所用算法和排序缓冲区内容的信息:<sort_key, rowid>: sort using row pointers <sort_key, additional_fields>: sort using additional fields <sort_key, packed_additional_fields>: sort using packed additional fields
有关该
filesort
算法的其他信息,请参阅ORDER BY 优化。有关优化器跟踪的信息,请参阅 MySQL 内部结构:跟踪优化器。
-
以前,MySQL 服务器发行版包括 Info 格式的 MySQL 参考手册(Docs/mysql.info 文件)。由于该手册的许可证限制了再分发,因此将其包含在社区包中会给下游再分发者带来问题,例如那些创建 Linux 发行版的人。MySQL Server 的社区发行版不再包含 mysql.info 文件,以简化重新打包和重新分发过程(例如,可以直接使用源代码压缩包及其校验和)。此更改适用于所有源代码和二进制社区打包格式。商业(企业)发行版没有变化。
对于那些希望继续使用 Info 格式的 MySQL 参考手册的人,我们已经在 https://mysql.net.cn/doc/上提供了它。
-
Performance Schema 现在检测交易。收集的信息包括定量和定性数据,包括事务持续时间、事务计数和各种事务属性(如隔离级别和访问模式)的频率。此信息收集在包含当前和最近事务事件的表中,并汇总在多个维度的摘要表中,包括用户、帐户和线程(客户端连接)。
这些新表存储交易事件:
events_transactions_current
:当前交易事件events_transactions_history
: 每个线程的最近事务事件events_transactions_history_long
: 整体最近的交易事件
还有提供汇总交易信息的汇总表。
在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务中。为了反映这一点,该
NESTING_EVENT_TYPE
列在具有它的那些表中,TRANSACTION
除了现有值STATEMENT
、STAGE
和之外,还允许一个新值WAIT
。为了允许控制事务事件集合的配置,对性能模式设置表进行了这些更改:
该
setup_instruments
表包含一个名为 的新工具transaction
。默认情况下禁用此工具。该
setup_consumers
表包含新的消费者值,其名称与当前和最近的交易事件表名称相对应。这些消费者可用于过滤交易事件的集合。默认情况下仅events_transactions_current
启用。该
setup_timers
表包含一个新行,其NAME
值transaction
指示事务事件计时的单位。默认单位是NANOSECOND
.
如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到
performance_schema
数据库中。 -
性能模式现在公开元数据锁定信息:
已授予的锁(显示哪些会话拥有哪些当前元数据锁)
已请求但尚未授予的锁(显示哪些会话正在等待哪些元数据锁)。
已被死锁检测器终止或超时并正在等待请求会话的锁定请求被丢弃的锁定请求
此信息使您能够了解会话之间的元数据锁依赖关系。您不仅可以看到会话正在等待哪个锁,还可以看到当前持有该锁的会话。
Performance Schema 现在还公开了表锁信息,这些信息显示服务器打开了哪个表句柄、它们如何被锁定以及被哪些会话锁定。
实施了这些具体更改:
metadata_locks
和 表列出了元数据锁和表锁 的table_handles
当前锁和锁请求。该
setup_instruments
表现在有一个wait/lock/metadata/sql/mdl
用于元数据锁定的工具。默认情况下禁用此工具。系统变量配置表中跟踪的
performance_schema_max_metadata_locks
最大元数据锁数metadata_locks
。对于table_handles
,大小由现有的performance_schema_max_table_handles
系统变量配置。Performance_schema_metadata_lock_lost
状态变量指示无法记录元数据锁的次数 。 对于table_handles
,已打开但无法检测的表按现有Performance_schema_table_handles_lost
状态变量计数。
有关详细信息,请参阅 性能模式锁表。
如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到
performance_schema
数据库中。
-
不兼容的更改: 以前,该
--ssl
选项已被视为咨询:给出时,允许但不需要加密连接。此外,还暗示了其他几个 。因此,该选项通常不明确用作,而是以其否定形式用作,以防止使用加密。这在客户端和服务器端都是如此,对于 (,) 或 (, ) 的任何同义词也是如此。--ssl-
xxx
--ssl
--ssl
--ssl=0
--ssl
--ssl=1
--enable-ssl
--ssl=0
--skip-ssl
--disable-ssl
现在 的含义仅在客户端
--ssl
发生了变化 。(服务器端没有安全连接更改。)当在客户端作为
--ssl
(或同义词)给出时,该选项不再是建议性的而是规范性的。给定一个支持加密连接的服务器,客户端程序可以通过仅指定--ssl
选项来要求加密连接。(以前,客户端必须指定选项,或、 和 选项--ssl-ca
的所有三个选项。)如果无法建立加密连接,连接尝试将失败。从使用的 MySQL 客户端命令的意义上说,这是一个不兼容的更改--ssl-ca
--ssl-key
--ssl-cert
--ssl
now 将失败,除非可以建立加密连接。另一方面,对于成功的连接尝试,可以保证连接是安全的。以前,没有这样的保证。此外, 客户端的其他选项不再暗示并且在没有以下情况时是建议性的 :客户端尝试使用加密进行连接,但如果无法建立加密连接,则回退到未加密的连接。
--ssl-
xxx
--ssl
--ssl
防止使用加密和覆盖其他选项 的
--ssl=0
(及其同义词) 的含义没有变化。--ssl-
xxx
C API 函数有一个新
MYSQL_OPT_SSL_ENFORCE
选项可用于mysql_options()
指示是否要求连接使用加密。如果启用,则与在命令行中指定的效果相同--ssl
:如果无法建立加密连接,则连接尝试失败。有关详细信息,请参阅 加密连接的命令选项和 mysql_options()。
语句的
MASTER_SSL=1
选项CHANGE MASTER TO
也发生了变化,类似于 的含义发生变化--ssl
。也就是说,当给定时,从站到主站的连接必须使用加密,否则连接尝试将失败。(漏洞 #11744828)
-
Incompatible Change:
setup_instruments
在确切的语句类型未知之前,Performance Schema 在语句分类的早期阶段使用 了表中的几个语句工具 这些工具被重新命名以更清楚地反映它们的 “抽象”性质:旧仪器名称 新仪器名称 statement/com/
statement/abstract/new_packet
statement/com/Query
statement/abstract/Query
statement/rpl/relay_log
statement/abstract/relay_log
此外,下表中不再收集抽象工具的统计数据,因为此类工具从未用作声明的最终分类:
events_statements_summary_by_thread_by_event_name events_statements_summary_by_account_by_event_name events_statements_summary_by_user_by_event_name events_statements_summary_by_host_by_event_name events_statements_summary_global_by_event_name
引用旧仪器名称的应用程序必须更新为新名称。有关在语句分类中使用抽象工具的更多信息,请参阅 性能模式语句事件表。(错误#16750433,错误#17271055)
-
Incompatible Change: 该
EXPLAIN
语句已更改,因此EXTENDED
和PARTITIONS
关键字的效果。EXTENDED
并且PARTITIONS
仍然被认可,但是是多余的并且已被弃用。EXPLAIN
在未来的 MySQL 版本中, 它们将从语法中删除EXPLAIN
由于此更改,输出不同如下:EXPLAIN
无论是否指定EXTENDED
和PARTITIONS
关键字 ,过滤列和分区列都会出现在 输出中。对于希望按位置而不是按名称来标识列信息的应用程序来说,这是一个不兼容的更改,此类应用程序将需要进行调整。SHOW WARNINGS
紧随其后EXPLAIN
的显示附加的执行计划信息,无论是否EXTENDED
指定关键字。(如果语句包含EXTENDED
orPARTITIONS
关键字,则会包含一个额外的弃用警告。)
表现; InnoDB: 该
log_write_up_to
函数写入重做日志文件直至达到某个日志序列号 (LSN) 并可选择将写入刷新到磁盘,该函数已被重构以提高log_sys::mutex
竞争激烈且 whereinnodb_flush_log_at_trx_commit=2
。-
性能: 互斥
LOCK_thread_count
锁保护了几个独立的内部服务器结构和变量,是一个瓶颈,特别是在许多客户端同时连接和断开连接的情况下影响服务器性能。这个互斥量被分解为更具体的互斥量和原子操作,以缓解瓶颈并提高性能。作为这项工作的一部分,以下状态变量在嵌入式服务器中不再可见,因为对于该服务器而言,它们没有 更新 并且 没有 意义 :
Aborted_connects
,,,,,,,,, 。Connection_errors_accept
Connection_errors_internal
Connection_errors_max_connections
Connection_errors_peer_address
Connection_errors_select
Connection_errors_tcpwrap
InnoDB: memcached
InnoDB
插件 现在支持插入和读取 定义为主键InnoDB
的映射表INTEGER
(错误#17315083,错误#17203937)-
复制: 现在可以使用
CHANGE REPLICATION FILTER
此版本中引入的 SQL 语句在从站上动态设置复制过滤规则。此语句与使用、 、 、 、 、 和中的一个或多个选项 启动从属mysqld的效果相同 。--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
--replicate-rewrite-db
例如,发出该语句
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (d1.t2)
等同于用 启动从属 mysqld--replicate-do-table='d1.t2'
。CHANGE REPLICATION FILTER
与服务器选项的不同之处在于,要生效,该语句只需要事先停止从属 SQL 线程并在之后重新启动,分别使用STOP SLAVE SQL_THREAD
和START SLAVE SQL_THREAD
。此语句保留任何现有的复制过滤规则不变;要取消设置给定类型的所有过滤器,请将过滤器设置为空列表,如本例所示:
CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();
您可以在同一语句中列出多个复制过滤规则,以逗号分隔。当 找到同一规则的多个实例时,仅使用最后一个实例。
有关详细信息,请参阅 CHANGE REPLICATION FILTER 语句;另请参阅 服务器如何评估复制过滤规则。(错误#15877941、错误#11752237、错误#67362、错误#43366)
复制: 以前,在启用半同步复制的情况下,master 在继续之前等待每个事务的单个 slave 确认。一个新的系统变量,
rpl_semi_sync_master_wait_for_slave_count
允许配置每个事务所需的从站确认数。最小(默认)值为 1。最大值为 65,536。此变量的小值性能最佳。Microsoft Windows: 从源代码中删除了特定于 Windows XP 和 Windows Server 2003 的条件变量的实现,因为从 MySQL 5.6 开始,这些平台不支持 MySQL。(漏洞 #17332056)
-
Performance Schema 现在检测读/写锁
Delegate::lock
,用于以下类:Trans_delegate Binlog_storage_delegate Binlog_transmit_delegate Binlog_relay_IO_delegate
每个子类使用不同的仪器名称,以针对不同的用途使用不同的统计数据。这些工具在
schema.setup_instruments
表中可见,并具有以下名称:wait/synch/rwlock/sql/Trans_delegate::lock wait/synch/rwlock/sql/Binlog_storage_delegate::lock wait/synch/rwlock/sql/Binlog_transmit_delegate::lock wait/synch/rwlock/sql/Binlog_relay_IO_delegate::lock
(错误#17590161,错误#70577)
-
删除了客户端插件头文件之间的一些依赖关系:
MYSQL_PLUGIN_EXPORT
插件声明所需 的宏现在直接在中声明,mysql/client_plugin.h
而不是从中获取定义mysql/plugin.h
。该宏是客户端插件唯一需要并在服务器端标头中声明的宏mysql/plugin.h
,因此包含mysql/client_plugin.h
在应用程序中不再需要应用程序也包含mysql/plugin.h
.mysql/plugin_trace.h
不再使用C_MODE_START
orC_MODE_END
。因此,包含mysql/plugin_trace.h
在应用程序中不再需要应用程序也包含my_global.h
.
当然,应用程序可能需要
mysql/plugin.h
或my_global.h
出于其他原因。(漏洞#17582168) 减少了与线程创建相关的性能模式检测的开销。(漏洞 #17539520)
-
现在可以启用性能模式但排除仪器的某些部分。例如,要启用 Performance Schema 但排除阶段和语句检测,请执行以下操作:
shell> cmake . -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DDISABLE_PSI_STAGE=1 \ -DDISABLE_PSI_STATEMENT=1
更多信息请参见 MySQL Source-Configuration Options中CMake选项 的说明。(漏洞#17478068)
DISABLE_PSI_
XXX
一个新的CMake选项,
WITH_ASAN
允许为支持它的编译器启用 AddressSanitizer。(漏洞 #17435338)修复了在未启用调试的情况下进行编译时出现的多个编译警告。(漏洞#17332094)
存储引擎可以使用新的
ER_ENGINE_OUT_OF_MEMORY
错误代码来报告内存不足的情况。(漏洞 #16807964)减少了弃用警告的开销。(错误#70402,错误#17497869)
对于
GRANT
语句,ER_SP_DOES_NOT_EXIST
不存在的存储过程和函数的错误现在指定PROCEDURE does not exist
orFUNCTION does not exist
而不是不太具体的PROCEDURE or FUNCTION does not exist
. (缺陷 #69628,缺陷 #17036976)修改了用于元数据锁定的散列函数以减少开销。(漏洞 #68487,漏洞 #16396598)
因为有新的 API 函数 (
mysql_get_option()
,mysql_reset_connection()
),库 ABI 版本现在是 18.2。共享库名称现在在适当的地方包括 18.2。一个新的
mysql_get_option()
C API 函数可用,它返回适用mysql_options()
选项的当前值。请参阅 mysql_get_option()。-
当连接返回到线程池插件时,必须清理连接线程上下文。以前,这是使用
COM_CHANGE_USER
(类似于mysql_change_user()
C API 函数)完成的。但是,该操作会重新进行身份验证,这在这种情况下是不必要的网络往返开销。现在可以以更轻量级的方式重置客户端连接状态,而不会导致重新验证。API 通过以下更改公开:
一个新的
COM_RESET_CONNECTION
协议命令(在 中定义mysql_com.h
)一个新的
mysql_reset_connection()
C API 函数mysql客户端 的新
resetconnection
命令
重置连接的效果类似于
mysql_change_user()
自动重新连接或自动重新连接,只是连接不会关闭并重新打开,并且不会进行重新身份验证。请参阅 mysql_change_user() ) 和 自动重新连接控制)。有关详细信息,请参阅 mysql_reset_connection()和 mysql — MySQL 命令行客户端。
-
不兼容的更改: 对于记录到数据库中的
general_log
和slow_log
表,mysql
包含多个字符集的日志行并不总是被正确处理。和general_log.argument
列slow_log.sql_text
现在已从 更改MEDIUMTEXT
为MEDIUMBLOB
。因此,现在没有为记录到表进行字符集转换,这与记录到文件保持一致。如果从早期版本升级到此 MySQL 版本,则必须运行mysql_upgrade(并重新启动服务器)以将这些更改合并到
mysql
系统数据库中。(漏洞 #14575847) 重要变更;复制:
START SLAVE UNTIL SQL_AFTER_GTIDS
在执行具有指定 GTID 的事务后收到下一个 GTID 事件之前不会导致从站停止,这可能会在下一个 GTID 事件延迟或不存在的情况下导致问题。现在,slave 在完成与该 GTID 的事务后停止。(漏洞 #14767986)-
重要变更;复制: 可以在启用二进制日志但未指定服务器 ID 的情况下启动服务器;在这种情况下,服务器将设置
server_id
为 1(而不是 0),而从服务器仍然无法连接。现在
server_id
必须在启用二进制日志记录的情况下启动服务器时设置,否则服务器无法启动。如果--server-id=0
被使用,这个值不再被服务器改变;在这种情况下,更新被写入二进制日志,但从服务器无法连接。在不指定值的情况下使用--server-id
与将其显式设置为 0 具有相同的效果。(Bug #11763963,Bug #56739) 创新数据库;复制: mecached
InnoDB
插件会在插入到二进制日志之前更新一条记录,这会导致从属服务器复制停止。插入应该发生在更新之前。(漏洞 #17358875)InnoDB: 当通过
ALTER TABLE
操作添加新索引时,不是只保存表级统计信息和新索引的统计信息,而是InnoDB
保存整个表的统计信息,包括表的其他索引。此行为会降低ALTER TABLE
性能。(错误#17848838,错误#16511145)-
InnoDB: Bug#17371537 的修复引入的回归导致memcached插入操作的内存泄漏。(漏洞 #17738935)
参考资料:另请参阅:Bug #17371537。
InnoDB: 在日志中发现的容错代码应用代码
InnoDB
ALTER TABLE ... IN PLACE
可能会导致数据损坏。(错误#17625063,错误#17512497)InnoDB: 该
trx->error_key_num
字段未在中找到的错误注入代码中初始化storage/innobase/handler/handler0alter.cc
。该error_key_num
字段通常为 0,但如果重用 DDL 事务对象的内存缓冲区,则可以为非零值。(漏洞#17624926)-
InnoDB: 以数字开头的数据库名称会导致全文搜索 (FTS) 解析器错误。(漏洞 #17607956)
参考资料:另请参阅:错误 #17161372。
InnoDB: 一个
ALTER TABLE ... CHANGE [COLUMN]
操作会导致一个rbt_empty(index_cache->words)
断言。(漏洞#17536995)InnoDB:
buf_flush_event
将在刷新线程启动而不是服务器启动时创建。此外,buf_flush_event
将在InnoDB
以只读模式启动时发出信号。(漏洞 #17516062)InnoDB:
CHECK TABLE
将忽略该QUICK
选项。(漏洞 #17513737)InnoDB: 查询时会消耗过多的内存
INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE
。非常大的全文搜索索引会出现此问题。(错误#17483582,错误#70329)InnoDB:
SHOW ENGINE INNODB STATUS
在一个连接线程上 运行KILL CONNECTION
来自不同连接线程的语句来终止该线程将导致严重错误。(漏洞#17474166)InnoDB:
ibuf_contract_ext
在调试版本中,由于执行合并并将dict_stats_update
被逐出的页面返回到缓冲池而ibuf_change_buffering_debug
启用 ,因此会发生测试用例失败 (漏洞 #17446090)InnoDB:
InnoDB
在丢弃表空间后尝试运行查询时未能返回错误。(漏洞 #17431533)InnoDB: 丢弃表空间后会发生严重错误。(错误号 17430207)
InnoDB:由于MySQL 5.7.2引入的代码回归
OPERATION
,表列 数据performance_schema.events_waits_current
(漏洞 #17429480)-
InnoDB: 在
TRUNCATE TABLE
操作期间, InnoDB:尝试截断表的缺失索引...警告将打印到错误日志中。当索引是全文搜索 (FTS) 索引时,不应打印这些警告。(错误#17402002,错误#70226)参考资料:另请参阅:Bug #12429565。
InnoDB: 在并行全文搜索 (FTS) 索引创建期间,扫描器线程读取文档并将它们传递给分词器。标记化完成后,标记器从内存中释放文档。当对包含大量文本的文档进行分词时,分词器线程无法跟上扫描器线程的步伐。结果,内存的释放速度不够快, “标记化待处理列表”的大小将会增加。(漏洞 #17384979)
InnoDB:
row_scan_index_for_mysql
将分配缓冲区大小为UNIV_PAGE_SIZE
forrow_search_for_mysql
。当记录长度大于 时UNIV_PAGE_SIZE
,将发生 Valgrind 错误。(漏洞 #17378106)InnoDB:
trx_create
并且trx_free
会为每个memcachedget
请求调用。(错误#17371537,错误#70172)InnoDB:查询字符串中包含无效字符 的全文搜索 (FTS)
BOOLEAN MODE
查询可能会导致内存访问冲突失败。(漏洞 #17350055)InnoDB: 当数据库初始化线程遇到其他执行缓冲池刷新的线程时,将引发断言。(漏洞 #17349975)
InnoDB: 由于临时表空间不足,在大表上创建全文索引失败,并导致误导性的 “不正确的密钥文件”错误。(漏洞 #17339606)
InnoDB:
UNIV_BLOB_DEBUG
为了简化代码重构,删除了不经常使用且受限于无法跨崩溃恢复工作 的(漏洞 #17338452)InnoDB:从未报告过失败 的
UNIV_SEARCH_DEBUG
编译时调试检查已与所有对它的引用一起删除。(漏洞#17338432)InnoDB:
trx_sys_t::ro_trx_list
已被删除。在 MySQL 5.7.2 中实现互斥相关优化后,在列表中添加和删除事务的ro_trx_list
成本可能很高,默认情况下将事务放在列表中不再需要。用户交易仍然放在trx_t::mysql_trx_list
. 目前,后台只读事务不在任何列表中。(漏洞 #17332300)InnoDB: 当
innodb_file_per_table
设置OFF
为时,截断表时复制失败,错误代码为 1880。对于驻留在共享表空间中的表,截断操作期间使用的截断日志文件名不是唯一的。该错误是由于与 Bug #14174004 相关的 MySQL 5.7.2 代码回归所致。(漏洞 #17327409)InnoDB: 当
InnoDB
正在检索行并发出KILL QUERY
语句时,InnoDB
将返回假错误。(漏洞 #16950658)InnoDB: 其中
btr_validate_level
有检查以确保所有 B 树页面在分配时都被标记。更改缓冲区的检查失败,因为更改缓冲区页面的分配处理方式与其他 B 树页面不同。(漏洞#16884217)InnoDB:变量 的硬编码大小
srv_max_n_threads
不足。现在根据连接线程和InnoDB
后台线程的最大数量配置变量设置。(漏洞 #16884077)InnoDB:
UNIV_WORD_SIZE
对于 Windows 32 位和 64 位系统, InnoDB 都将设置使用此修补程序,UNIV_WORD_SIZE
在 64 位 Windows 系统上设置为 8。此补丁还删除UNIV_WORD_ALIGNMENT
了不再使用的 。(漏洞 #16774645)InnoDB: 当
SELECT COUNT(*)
与操作同时运行时,查询将花费很长时间才能完成LOAD DATA
。该mtr_memo_contains
函数确定一个对象是否是迷你事务中备忘录的一部分,它包含一个嵌套循环,导致查询运行缓慢。(漏洞 #16764240,漏洞 #69141)InnoDB: 启用更改缓冲区
InnoDB
时,如果插入是作为“就地更新”执行的,则在将记录从插入缓冲区合并到二级索引页面时无法写入事务日志记录。(漏洞 #16752251,漏洞 #69122)InnoDB: 由于 MySQL 5.6 中的回归,创建或删除
innodb_force_recovery
设置为3
(SRV_FORCE_NO_TRX_UNDO
) 的表失败。此外,此错误修复包括代码修改, 设置为大于 ()InnoDB
时设置为只读 (错误#16631778,错误#69892)innodb_force_recovery
3
SRV_FORCE_NO_TRX_UNDO
InnoDB: 内存
InnoDB
缓存 配置错误消息包含不正确的文件名。错误消息指出,请通过运行 innodb_config.sql 在数据库 innodb_memcache 中创建配置表容器。错误 31。正确的文件名是innodb_memcached_config.sql
. 此外,错误消息的 “ error 31 ”部分已被翻译成对应的文本,即“找不到表”。(错误#16498810,错误#68684)InnoDB: 在
mutex_spin_wait()
中,该sync_array_reserve_cell
函数可能无法在具有较小同步等待数组的系统上找到空槽,从而导致错误。(漏洞#16245498)InnoDB: 当
index_read_map
调用精确搜索时,由于搜索条件不匹配而无法返回记录时,光标将定位到搜索到的键之后的下一条记录。随后调用index_next
将返回下一条记录,而不是返回前一个不匹配的行,从而跳过一条记录。(错误#14621190、错误#15965874、错误#17314241、错误#70038、错误#17413093、错误#12860669、错误#60220、错误#17565888)-
InnoDB:
innodb_force_recovery
隐式回滚导致服务器在以 3 或更大的值 重新启动时停止此错误已通过修复错误 #16310467 和错误 #17253499 的组合得到解决。(漏洞 #14178835)参考资料:另请参阅:Bug #16310467、Bug #17253499。
InnoDB:
buf_page_get_gen
处理仅压缩页面时 可能会出现无限循环 (缺陷 #12560151,缺陷 #61132)InnoDB:
InnoDB
将尝试释放BLOB
已标记为空闲的页面。(缺陷 #11762662,缺陷 #55284)InnoDB: 将列数较多的表从
MyISAM
转换为InnoDB
会因日志缓冲区空间不足而引发断言。InnoDB
如果重做日志大小太大,现在会尝试自动增加日志缓冲区大小,而不是断言 (缺陷 #11758196,缺陷 #50366)分区: 分区重建期间存储引擎设置不正确;表存储引擎被忽略,而是使用默认存储引擎。因此,在 MySQL 5.1 中,可以
REBUILD PARTITION
将分区存储引擎从 更改InnoDB
为 MySQL 5.5 及更高版本中MyISAM
可以进行相反的操作(重建MyISAM
表的分区导致分区使用InnoDB
现在,当重建分区时,表实际使用的存储引擎由重建操作的处理程序检查和使用,这样分区存储引擎就不会被无意中更改。(漏洞 #17559867)分区: 索引条件下推不适用于分区表。(漏洞 #17306882,漏洞 #70001)
-
分区: 在使用 禁用父表的索引后
ALTER TABLE ... DISABLE KEYS
,重建其任何分区都会启用这些分区上的索引,MyISAM
当优化器尝试使用受影响的索引之一时会导致失败并出现错误。现在在这种情况下,我们会在重建任何分区之前检查表上是否有禁用的索引。如果索引已被禁用,那么我们将在重建后的分区上禁用它们。(漏洞 #16051817)
复制: 当基于 GTID 的复制与模式内多线程从属一起使用时,事务仅分配给第一个工作线程。(错误#17590616,错误#70536)
复制:表 的
WORKER_ID
列replication_execute_status_by_worker
未按预期id
列值mysql.slave_worker_info
(错误#17514406,错误#70426)-
复制:表中显示 的
THREAD_ID
列值performance_schema.replication_execute_status_by_worker
使用与输出中显示的线程 ID 相同的线程 IDSHOW PROCESSLIST
,而不是其他performance_schema
表使用的线程 ID。(错误#17440991,错误#70423)参考资料:另请参阅:Bug #17473308、Bug #17526982。
复制:
SET
语句子句中 的最后一个参数在LOAD DATA ... SET
二进制日志中重复。(错误#17429677,错误#70277)-
复制: 当转储线程在从活动二进制日志文件中读取事件时遇到的错误是临时错误,因此转储线程尝试读取事件时,转储线程可能会寻找错误的位置,这可能导致一个或多个事件被重新发送。为了防止这种情况,线程的位置是在每次正确读取事件后获得的。
此外,通过此修复,只有未正常关闭的二进制日志才会被标记为可能已损坏。
最后,添加两个警告;当转储线程遇到临时错误时,这些现在会返回。(漏洞 #17402313)
复制:
rpl_semi_sync_master_enabled
在主服务器等待从服务器回复时 设置 (错误#17327454,错误#70045)复制: 当停止 I/O 线程时,可能有一个非常大的事务(相当于一个大于 100MB 的二进制日志大小)线程没有收到事务到最后。当重新连接时
MASTER_AUTO_POSITION=1
,然后尝试从下一个交易中获取更改,这可能会导致不完整的交易及其数据丢失。(错误#17280176,错误#69943)复制: 尝试设置
CHANGE MASTER TO ... MASTER_AUTO_POSITION = 0
失败,错误 1777 (ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON
)。(漏洞#17277744)复制: 将事件事件写入二进制日志时,没有错误写入日志文件。这意味着用户没有收到从属服务器稍后将被事件事件停止的警告。为了防止这种情况发生,现在将所有写入二进制日志的事件的错误消息写入日志文件。(漏洞#17258782)
Replication:
LAST_INSERT_ID()
在从站上使用过滤规则时,未正确复制 值(漏洞 #17234370,漏洞 #69861)复制:
RESET SLAVE ALL
仅重置主机、端口、用户、密码和日志位置。现在它重置所有连接参数。(漏洞 #17185647)复制: 用于存储 GTID 值的内部函数有时会尝试将它们作为错误长度的字符串进行处理。(错误#17032712,错误#69618)
复制: 在
binlog_row_image
设置为MINIMAL
,仅更新具有 9 个或更多列的表的某些列会导致 mysqlbinlog在与该--verbose
选项一起使用时失败。(漏洞 #16960133)-
复制: 当启用了半同步复制的主服务器关闭时,主服务器在完成关闭之前无法等待半同步
ACK
或超时。这阻止了半同步复制恢复为异步复制,并允许打开的事务在主服务器上完成,从而导致从服务器上丢失事件。为了解决这个问题,转储线程现在在关闭期间最后停止,在客户端被告知停止之后,这样,如果转储线程有来自活动客户端的未决事件,它们可以被发送到从属。(漏洞 #16775543)
复制: 发出
GRANT
带有无效参数的语句导致主服务器将LOST_EVENTS
事件写入其二进制日志,从而导致复制停止。现在这样的情况下,如果一个或多个权限的授予或撤销成功,一个事件就会被写入日志;否则,只会记录警告。(错误#16629195,错误#68892)-
复制: 当服务器以 和 以及 和一起
START SLAVE
启动时失败 。master_info_repository=TABLE
relay_log_info_repository=TABLE
autocommit=0
--skip-slave-start
以前版本的 MySQL 的解决方法是在没有 选项的情况下重新启动从属mysqld 。
--skip-slave-start
(漏洞 #16533802) 复制: 删除了一些不需要的对象初始化,这些对象被使用但实际上不需要读取中继日志信息日志。(漏洞 #16291602)
复制: mysqlbinlog现在支持与 SSL 相关的与mysql、 mysqladmin和其他 MySQL 客户端程序相同的命令行选项 有关详细信息,请参阅 加密连接的命令选项。(缺陷 #11751199,缺陷 #41975)
复制: 以前版本的mysqlbinlog没有正确接受
ssl-ca
选项文件中的选项。此修复确保可以正确使用此选项。在早期版本中,解决方法是使用该loose-ssl-ca
选项。(缺陷 #74864,缺陷 #20032654)对于调试构建,期间发生的错误
DELETE IGNORE
可能会引发断言。(漏洞 #17720294)UNION ALL
返回零行的语句SELECT
可能会导致不正确的FOUND_ROWS()
值。(漏洞 #17708480)启用索引合并优化器开关并设置较小的
sort_buffer_size
值可能会导致服务器退出。(漏洞 #17617945)Windows MSI 包中缺少一些许可证和文档文件。(漏洞 #17584523)
UNION ALL
最后SELECT
从空表中选择聚合值的查询导致了不正确的FOUND_ROWS()
值。(漏洞 #17580869)半连接具体化策略未用于
VARCHAR
长度超过 512 字节的列,导致使用效率较低的策略和较差的查询性能。(字符数而非字节数的限制取决于列字符集;utf8
例如 170 个字符。)(缺陷 #17566396)对于没有未完成的准备好的语句的会话,断开连接处理开销减少了。以前,获取了一个全局互斥体来处理这些,但在没有此类语句的情况下没有必要这样做。(漏洞#17560986)
除非查询所需的所有列都在主键定义中,否则优化器不会将聚簇主键视为覆盖索引。这错误地增加了使用索引的计算成本,并导致在某些情况下不使用它,因为它比其他选择的索引更有效。(漏洞 #17560636)
session_connect_attrs
在高负载下 从 Performance Schema 表中进行选择 可能会导致服务器退出。(漏洞 #17542370)性能模式在添加和删除可能引发断言的存储过程条目时存在竞争条件。(漏洞 #17529279)
DROP TRIGGER
即使read_only
启用了系统变量也成功了。(漏洞 #17503460)COUNT(DISTINCT)
对包含大量不同值的表 进行简单查询可能会产生不正确的结果 。当tmp_table_size
或max_heap_table_size
被设置为较小的值时,这种情况更有可能发生。(漏洞 #17500866)-
性能架构内存检测开销减少了。
内存检测未报告性能模式内部分配的内存。这已得到纠正,现在有一个
memory/performance_schema/internal_buffers
工具(默认情况下禁用)可以启用以获取此信息。(漏洞#17493868) 存储程序未列在
objects_summary_global_by_type
性能架构表中。(漏洞 #17472833)my_print_stacktrace()
打印了指向 5.1 手册的参考手册 URL。它现在已针对当前服务器系列进行了参数化。(漏洞 #17465503)在调试版本中,
SHOW PROCEDURE CODE
提出断言。(漏洞 #17434385)Visual Studio 2012 下的编译失败已得到纠正。(错误号 17430236)
对于 JSON 格式的
EXPLAIN
语句,物化视图被错误地标记为optimized_away_subqueries
而不是标记为materialized_from_subquery
. (漏洞 #17428655)KILL
具有无效线程 ID 值的线程可能会引发断言。(漏洞#17420682)如果语句试图在已经包含异常或完成条件的诊断区域中设置异常条件,则会引发断言。如果失败的存储程序试图将其异常条件传输到其已包含条件的调用程序的诊断区域,则可能会发生这种情况。(漏洞 #17400687)
在 Performance Schema 内存检测中,为无内存操作收集的统计信息可能被低估,导致内存泄漏的出现。(漏洞 #17400029)
在没有 Performance Schema 的情况下编译会导致无法解析的符号。(漏洞#17399658)
mysql_install_db 产生的一些警告 引用了现已弃用的
log_warnings
系统变量。这些已更新为参考log_error_verbosity
。(漏洞 #17363350)如果
SET PASSWORD
用于已从mysql.user
表中手动删除但仍存在于内存中的帐户,则会引发断言。(漏洞 #17359329)-
ER_LOCK_DEADLOCK
发生错误(或ER_LOCK_WAIT_TIMEOUT
错误,如果innodb_rollback_on_timeout
已启用) 后无法成功使用保存点 。(漏洞#17356954)参考资料:此问题是 Bug #14188793 的回归。
该
CLIENT_CONNECT_WITH_DB
标志在 C 客户端库中处理不当。这可能导致发送到服务器的格式错误的数据包。(漏洞 #17351732)如果 MySQL 服务器由于未能忽略 由mysqld_safe
mysqld_safe.pid
创建的文件 而正在运行,则使用 RPM 包升级失败。(漏洞 #17343851)mysql_real_connect()
如果失败,C API 函数可能会泄漏内存 。(漏洞#17337684)该
filesort
实现有时无法分配足够的缓冲区空间,从而导致服务器退出。(漏洞 #17326567)访问成本比较
ref
可能不准确。(漏洞 #17303649)如果使用该选项
mysql_options()
调用多次,C API 函数可能会泄漏内存 。MYSQL_SET_CLIENT_IP
(漏洞 #17297012)该
CONV()
函数可以调用abs(INT_MIN)
未定义的 ,并导致服务器退出。(漏洞#17296644)SSL 代码中的错误数组缺少一个逗号,导致相邻消息的隐式连接以及错误编号和消息之间的关系中产生的差一错误。(漏洞 #17294150)
在使用布尔运算符的搜索中, 对表的全文搜索
InnoDB
失败。+
(漏洞 #17280122)对于单线程工作负载,优化器会识别一些特殊情况,在这些情况下它可以避免函数调用并提高性能。(漏洞 #17234723)
my_load_path()
在某些情况下, 该函数可能会错误地计算路径值。(漏洞 #17204851)临时表列被标记为暂时可为空,而不考虑表触发器的存在。这可能导致
NOT NULL
列被NULL
多表UPDATE
语句更新。(漏洞 #17055378)在调试版本中,如果语句在执行触发器时被终止,则可以引发断言。(漏洞 #17049537)
在存储程序中,将标量子查询的值与
IN
子句进行比较会在第一次执行时导致错误,并在第二次执行时引发断言。(漏洞 #17029399)信息未在两个优化器模块之间传输,因为相同信息存在重复变量。这可能会导致次优的查询执行计划和不正确的查询结果。(错误#16982071、错误#70021、错误#17310161)
JSON 格式的
EXPLAIN
语句可能会泄漏内存。(漏洞 #16970785)查询
ROLLUP
和引用外部字段的内部子查询可以引发断言。(漏洞 #16967281)GRANT
即使对于现有用户,没有IDENTIFIED BY
子句也会导致错误。(漏洞#16938568)GROUP_CONCAT()
使用无效的分隔符可能会导致服务器退出。(漏洞 #16870783)-
对于分区表,查询可能会返回不同的结果,具体取决于是否使用索引合并。(漏洞#16862316)
参考资料:另请参阅:Bug #17648468、Bug #176588348、Bug #18167648。
mysqltest_embedded不适用于该
--ps-protocol
选项,因此如果给出该选项,它现在会发出警告。(漏洞 #16817580)内部
InnoDB
字符串例程可以写入超过缓冲区的末尾。(漏洞#16765410)GIS 交集相关代码缺少返回值检查,导致非调试构建中出现循环并在调试构建中引发断言。(漏洞 #16659166)
-
对于调试版本,当优化器删除
Item_ref
指向子查询的指针时,会导致服务器退出。(漏洞 #16509874)参考:这个问题是 Bug #16318585 的回归。
不再可能使匿名用户帐户的密码过期,因为匿名用户无法执行
SET PASSWORD
重置帐户密码的操作。(漏洞 #16483619)-
#include <mysql.h>
在 Windows 上,由于该文件中缺少 Windows 声明,无法编译 简单使用的 MySQL 客户端程序 。同样的程序可以在其他平台上编译。(漏洞 #16409270)参考资料:另请参阅:错误 #17514554。
HANDLER READ
可能由于错误地将列视为常量而导致服务器退出。(漏洞#16386136)使用二进制客户端/服务器协议,为子句中带有参数的查询准备好的语句的第二次执行
LIMIT
引发了断言。(漏洞 #16346241)查询中的非常长的数据库名称可能会导致服务器退出。(错误#15912213,错误#16900358)
服务器关闭时未释放为性能模式分配的内存。(漏洞 #14771682)
如果
INSTALL PLUGIN
语句在共享库名称中包含无效的 UTF-8 字符,则会导致服务器挂起(或在调试版本中引发断言)。(错误#14653594,错误#23080148,错误#27167197)-
独立的 Windows MSI 包没有
ALLUSERS
属性集。他们现在设置ALLUSERS=1
。对于本 MySQL 系列中较早的 MSI 包,解决方法是使用以下命令:C:\> msiexec /i msi_installer_name ALLUSERS=1
(漏洞 #14647206)
涉及元数据锁和
InnoDB
死锁的死锁都被报告为ER_LOCK_DEADLOCK
错误,但只有InnoDB
死锁回滚了事务。现在两个死锁都回滚了事务。(漏洞 #14188793)a 中的列
PRIMARY KEY
必须是NOT NULL
,但如果明确声明为NULL
不会产生错误。现在发生错误。例如,CREATE TABLE t (i INT NULL PRIMARY KEY)
被拒绝的声明。类似的ALTER TABLE
陈述也是如此。(错误#13995622、错误#66987、错误#15967545、错误#16545198).pdb
Windows Zip 存档分发中丢失了 一些文件。(漏洞 #13878021)Coverity 静态分析工具发现的几个问题已得到修复。感谢 Jan Staněk 和 Honza Horak 提供的补丁。(错误#70591,错误#17590095)
启动时的设置
host_cache_size
没有效果。(错误#70552,错误#17576516)MySQL 无法在 OS X 10.9 (Mavericks) 上编译。(错误#70542,错误#17647863)
对于,解析器不允许 值大于最大有符号值。现在允许最大无符号值。(错误#70533,错误#17564492)
EXPLAIN FOR CONNECTION
connection_id
connection_id
BIGINT
EXPLAIN FOR CONNECTION
如果连接 ID 不属于任何连接线程,则不会报告错误。(错误#70532,错误#17564493)在某些情况下,在列前缀上定义的索引的范围条件返回不完整的结果集。(例如 ,其中索引 on仅索引前 6 个字符。)(错误 #70341,错误 #17458273)
SELECT ... WHERE 'abcdef1' <
col_name
ANDcol_name
< 'abcdef9'col_name
InnoDB
全文搜索无法在包含保存点的事务中找到记录。(错误#70333,错误#17458835)范围优化器模块中不正确的引用计数导致查询结果集中可能丢失或重复行。(错误#70236,错误#17405466)
如果要求升级在未
InnoDB
启用的情况下运行的服务器, mysql_upgrade 会发出关于表不存在的投诉 (除非可用InnoDB
,否则表将不存在)。InnoDB
(错误#70152,错误#17361912)-
启用线程池插件 后, Performance Schema 表的
PROCESSLIST_USER
和PROCESSLIST_HOST
列 始终用于客户端会话。此外,对于主线程,这些列未 设置为用户帐户。threads
NULL
NULL
笔记作为错误修复实现的一部分,线程池插件的性能模式检测已更改为使用
thread_pool
,而不是sql
.(错误#70028、错误#17310065、错误#17049691)
对于频繁的连接/断开操作,降低了性能模式检测开销。(错误#70018,错误#17310878)
-
使用布尔运算符时,对表的全文搜索在
InnoDB
搜索包含撇号的单词时失败。innodb_ft_max_token_size
最大值被错误地定义为 252,这是最大字节长度 。现在最大值innodb_ft_max_token_size
为 84,这是最大字符长度。(缺陷 #69932,缺陷 #17276125) COUNT(DISTINCT)
不应该计算NULL
值,但是当优化器使用松散索引扫描时它们被计算在内。(漏洞 #69841,漏洞 #17222452)InnoDB
死锁导致事务回滚但没有释放元数据锁,阻塞事务表上的并发 DDL,直到出现死锁的连接发出显式COMMIT
orROLLBACK
。(缺陷 #69668,缺陷 #17054007)在调试版本中,静态初始化代码可以在 DBUG 子系统初始化之前调用 DBUG 函数。(缺陷 #69653,缺陷 #17063675)
读取
Geometry
存储程序中的值可能会读取已释放的内存并产生不正确的结果。(缺陷 #69517,缺陷 #16985214)指定具有多个实例的同一目录
--ignore-db-dir
导致服务器退出。(漏洞 #69441,漏洞 #16944177)-
对于有资格写入慢速查询日志的查询,现在更早地检查是否启用了日志,从而减少了开销。
此外,当
log_throttle_queries_not_using_indexes
在服务器启动时指定时,现在需要一个值。以前,它被错误地视为可选的。(缺陷 #69420,缺陷 #16924125) 除非将和 系统变量设置得足够大以允许将用于查询处理的临时表存储在 存储引擎中,否则 某些
INSERT INTO ... SELECT ... FROM
语句速度很慢 。(漏洞 #69368,漏洞 #16894092)tmp_table_size
max_heap_table_size
MEMORY
丢失
va_end()
的呼叫已添加到日志记录和 UCS2 代码中。感谢 Jan Staněk 提供的补丁。(漏洞 #68896,漏洞 #16725769)ER_TRUNCATED_WRONG_VALUE
(截断值)错误DECIMAL
值无法显示错误的输入值。(缺陷 #68745,缺陷 #16552002)对于 form 的查询,可能会更新不正确的行。唯一键允许多个值,但优化器并不总是考虑所有这些值。(错误#68656,错误#16482467)
UPDATE ... WHERE
unique_key
ORDER BY ... LIMIT ...NULL
在存储函数或触发器中,发生
ER_LOCK_WAIT_TIMEOUT
错误导致无法执行条件处理程序。(错误#67947,错误#16041903)NULL
在特定参数位置使用文字, ,IFNULL()
,COALESCE()
并CASE
在它们应返回无符号值时返回有符号值。(缺陷 #65976,缺陷 #14359340)服务器使用以太网硬件地址生成 UUID,但对以太网设备的名称进行了假设,而不是向系统查询它们的名称。感谢 Honza Horak 提供补丁。(缺陷 #63055,缺陷 #13548252)
授权表中的主机名以小写形式存储,但 mysql_install_db可能无法遵守此约定,导致无法使用 删除帐户
DROP USER
。(错误#62255、错误#12917164、错误#62254、错误#12917151)如果一个连接更改了其默认数据库并同时执行了另一个连接
SHOW PROCESSLIST
,则第二个连接在尝试显示第一个连接的默认数据库时可能会访问无效内存。记忆。(错误#58198,错误#11765252)在服务器关闭时,主线程和关闭线程之间的竞争条件可能导致服务器故障。(错误#56666,错误#11763896)
修复了 MySQL 字符串函数的潜在问题
strmov()
。它在源和目标重叠方面的行为以前取决于对stpcpy()
. (错误#48864,错误#17429539)对于声明为 a 的列
PRIMARY KEY
,MySQL 有时会不必要地添加一个DEFAULT
子句。例如, forCREATE TABLE t (a INT, PRIMARY KEY(a))
,添加了一个DEFAULT 0
子句,而 withCREATE TABLE t (a INT PRIMARY KEY)
,则没有。(缺陷 #36723,缺陷 #11748566)-
包含的视图可能会导致在视图评估时出错。考虑这些视图定义,它们与序号一起使用:
ORDER BY
integer
ORDER BY
CREATE VIEW v1 AS SELECT x, y, z FROM t ORDER BY 2; CREATE VIEW v2 AS SELECT x, 1, z FROM t ORDER BY 2;
在第一种情况下,
ORDER BY 2
指的是命名列y
。在第二种情况下,它指的是常量 1。对于从任一视图中选择少于 2 列(ORDER BY
子句中指定的数字)的查询,如果服务器使用 MERGE 算法评估视图,则会发生错误。例子:mysql> SELECT x FROM v1; ERROR 1054 (42S22): Unknown column '2' in 'order clause' mysql> SELECT x FROM v2; ERROR 1054 (42S22): Unknown column '2' in 'order clause'
为了像这样处理视图定义,服务器现在以不同的方式将它们写入
.frm
存储视图定义的文件中。这种差异在SHOW CREATE VIEW
. 以前,该.frm
文件包含以下ORDER BY 2
子句:For v1: ORDER BY 2 For v2: ORDER BY 2
现在,该
.frm
文件包含以下内容:For v1: ORDER BY `t`.`y` For v2: ORDER BY ''
也就是说,对于
v1
, 2 替换为对所引用列的名称的引用。对于v2
,2 被常量字符串表达式替换(按常量排序无效,因此按任何常量排序都可以)。如果您遇到刚刚描述的视图评估错误,请删除并重新创建视图,以便
.frm
文件包含更新的视图表示。或者,对于像v2
按常量值排序的视图,删除并重新创建不带ORDER BY
子句的视图。(错误#28695,错误#11746789) 终止正在执行
filesort
操作的查询会导致ER_SERVER_SHUTDOWN
(服务器正在关闭)错误。(错误#18256,错误#11745656)