MySQL8.1.0发布了,但是看着像是8.0版本的一个小版本的bug修复。本文概括一下简要信息分享给大家。
账户管理说明
增加了一个新的系统参数,用于限制用户改密码时的最少替换字符数。
validate_password.changed_characters_percentage,该值是百分比。
审计日志说明
审计日志可以指定库database存储JSON过滤表。
mysql -u root -D database_name -p < audit_log_filter_linux_install.sql
新增Audit_log_direct_writes系统变量,用于计算直接写入审计文件的次数。
MySQL企业审计使用临时缓冲区保存写入日志文件的查询事件数据。然而,由于服务器可能无法为长查询分配额外内存,审计插件已经进行了优化,在JSON格式记录日志时,不再使用临时缓冲区。
MySQL企业审计现在支持使用调度程序组件来配置和执行定期任务,以刷新内存缓存。
二进制日志
libmysqlclient.so 共享库中添加了几个函数,使开发人员能够访问 MySQL 服务器的二进制日志:mysql_binlog_open()、mysql_binlog_fetch() 和 mysql_binlog_close()。
C API 说明
新增了mysql_reset_connection_nonblocking() C API函数。它是mysql_reset_connection()同步函数的对应函数,用于需要与服务器进行异步通信的应用程序。
新的mysql_get_connect_nonblocking_stage() C API函数允许应用程序监控异步连接的进展,以便根据进展采取适当的行动。
在调用函数中,如果net->vio为null,len被初始化为0并且永远不会改变。此修复在解引用vio之前添加了对net的检查。
编译说明
略
组件说明
MySQL企业版现在支持使用component_telemetry组件以OpenTelemetry格式收集服务器跟踪数据。然后,将此数据转发到可配置的端点,可以由任何兼容OpenTelemetry的系统使用。(只支持linux平台)
废弃与移除功能
参考 xxx
IPv6 支持
NDB Cluster:任意节点没有支持IPv6,NDB集群无法启动。
日志说明
为了在Server关闭过程中出现异常长时间的情况下帮助故障排除,此版本引入了一系列新的消息,这些消息会在MySQL错误日志中记录,包括以下内容:
- MySQL服务器的启动和关闭日志消息,包括使用--initialize参数启动时的日志。
- 插件关闭阶段的启动和结束日志消息。
- 组件关闭阶段的启动和结束日志消息。
- 连接关闭阶段的开始和结束日志消息。
- 在强制断开连接后仍然活动的线程数量和ID的日志消息,这些线程可能会导致等待情况。
Performance Schema 说明
Performance Schema中的clone_status表的gtid_executed列的数据类型已从VARCHAR(4096)更改为LONGTEXT。
空间数据支持
包含空间参考系统数据的EPSG数据集已从版本9.3升级到版本9.7。
SQL语法说明
JSON: 现在可以通过在此版本中添加的语法扩展来将EXPLAIN FORMAT=JSON输出捕获到用户变量中。EXPLAIN FORMAT=JSON INTO var_name stmt可以与任何可解释的语句stmt一起使用,将输出存储在用户变量var_name中,以便在后续分析中使用。该值是一个有效的JSON文档,可以使用MySQL的JSON函数(如JSON_EXTRACT())进行检查和操作。INTO子句仅支持FORMAT=JSON;explain_format系统变量的值对此要求没有影响。如果无法执行语句(例如由于语法错误),则不会更新用户变量。INTO不支持EXPLAIN ANALYZE或EXPLAIN FOR CONNECTION。
在CREATE TABLE和ALTER TABLE ... ADD COLUMN语句中,现在可以将CURRENT_USER()用作VARCHAR和TEXT列的默认值。同样,SESSION_USER()、USER()和SYSTEM_USER()函数在上述所有情况中也被支持。例如,以下语句序列现在与所示类似,输出结果取决于你的环境:
mysql> SELECT CURRENT_USER();+-------------------+| CURRENT_USER() |+-------------------+| sakila@localhost |+-------------------+1 row in set (0.00 sec)mysql> CREATE TABLE t ( > c1 VARCHAR(288) DEFAULT (USER()), > c2 VARCHAR(288) DEFAULT (CURRENT_USER()), > c3 VARCHAR(288) DEFAULT (SESSION_USER()), > c4 VARCHAR(288) DEFAULT (SYSTEM_USER()) > );Query OK, 0 rows affected (0.04 sec)mysql> INSERT INTO t VALUES ROW();Query OK, 1 row affected (0.01 sec)mysql> TABLE t;+-------------------+-------------------+-------------------+-------------------+| c1 | c2 | c3 | c4 |+-------------------+-------------------+-------------------+-------------------+| sakila@localhost | sakila@localhost | sakila@localhost | sakila@localhost |+-------------------+-------------------+-------------------+-------------------+1 row in set (0.00 sec)
当以这种方式使用这些函数时,它们也会包含在SHOW CREATE TABLE和SHOW COLUMNS的输出中,并在适用的情况下被引用在Information Schema COLUMNS表的COLUMN_DEFAULT列中。
如果您需要确保该列中可以存储具有最大可能长度的值,您应该确保该列至少能容纳288个字符(255个用于用户名,32个用于主机名,再加1个用于@分隔符)。因此,虽然可以将其中一个函数用作CHAR列的默认值,但由于错误或值截断的风险,不建议这样做。
功能增加或更改
重要更改;复制:CHANGE REPLICATION SOURCE TO语句的SOURCE_RETRY_COUNT选项的默认值已更改为10。这意味着,使用此选项和SOURCE_CONNECT_RETRY(60)的默认值,复制将在重新连接尝试之间等待60秒,并在10分钟内以此速率不断尝试重新连接,直到超时并进行故障转移。此更改还适用于--master-retry-count选项的默认值。需要注意的是,此选项已被弃用,因此可能在未来的MySQL版本中被移除。应改为使用CHANGE REPLICATION SOURCE TO的SOURCE_RETRY_COUNT选项。
重要更改:对于捆绑了OpenSSL库的平台,MySQL服务器的链接OpenSSL库已从OpenSSL 1.1.1更新为OpenSSL 3.0。确切的版本现在是3.0.9。有关从1.1.1到3.0的更多变更信息,请参阅:https://www.openssl.org/docs/man3.0/man7/migration_guide.html.
重要更改: 在版本化的注释中,MySQL版本号支持由一个或两个数字组成的主版本号(之前,只支持一个数字作为该值)。
重要更改:不再支持Enterprise Linux 6(以及相关的glibc 2.12通用版本)、SUSE 12、Debian 10、MacOS 12、Ubuntu 18.04和20.04、Windows 10和Server 2012R2;且不再构建32位版本。
复制:当以调试模式运行时,mysqlbinlog现在会打印所有Rows_log_event标志(不再只打印STMT_END_F标志),并且如果遇到无效的标志,现在会使用UNKNOWN_FLAG(0xN)进行断言。
Group Replication: 任何获取系统状态变量值的语句都会获取所有这些变量的值,并且同时会获取这些变量的读锁。这包括像SHOW STATUS LIKE 'Uptime'
和SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME='Uptime'
这样的语句。此外,以下操作都会对状态变量获取写锁:
- START GROUP_REPLICATION 和 STOP GROUP_REPLICATION 语句
- 设置 group_replication_force_members 或 group_replication_message_cache_size
- 调用 group_replication_get_write_concurrency() 或 group_replication_set_communication_protocol()
- 自动重新加入
- 在启用 group_replication_single_primary_mode 的情况下更改主服务器
这意味着在上述操作之后开始的SHOW STATUS语句必须等待操作完成后才能返回结果。现在,在这种情况下,获取状态变量的语句会立即返回它们的缓存值,而不会等待。
Group Replication:在选举新的主服务器之前,group_replication_set_as_primary()函数会等待所有事务完成,包括当前正在处理的所有DML操作。在此版本中,该函数现在还会等待所有正在进行的DDL语句(例如ALTER TABLE)完成。
以下列出了现在被group_replication_set_as_primary()函数视为DDL语句的所有操作:
- ALTER TABLE
- ANALYZE TABLE
- CACHE INDEX
- CHECK TABLE
- CREATE INDEX
- CREATE TABLE
- DROP INDEX
- LOAD INDEX
- OPTIMIZE TABLE
- REPAIR TABLE
- TRUNCATE TABLE
- DROP TABLE
此外,还包括任何打开的游标。
Group Replication:为了更好地诊断和排除网络不稳定性,MySQL Group Replication在此版本中增加了一些变量,为每个Group Replication成员提供网络、控制消息和数据消息的统计信息。这使得可以直接观察Group Replication操作中的各个步骤所花费的时间。
Group Replication还在Performance Schema replication_group_communication_information表中添加了一个新的MEMBER_FAILURE_SUSPICIONS_COUNT列,显示每个组成员在本地节点看到的可疑次数。例如,在一个有三个成员的组中,该列的值可能如下所示:
{
"d57da302-e404-4395-83b5-ff7cf9b7e055": 0,
"6ace9d39-a093-4fe0-b24d-bacbaa34c339": 10,
"9689c7c5-c71c-402a-a3a1-2f57bfc2ca62": 0
}
这些改进还有助于准确定位用户发起或后台操作消耗的时间和网络资源,然后可以将其与整体性能进行关联。
其他功能:
包含curl而不是链接到系统curl库的二进制软件包已升级为使用curl 8.1.1。
MySQL现在实现了客户端端的Server Name Indication (SNI),这是TLS协议的一个扩展。客户端应用程序可以通过新的MYSQL_OPT_TLS_SNI_SERVERNAME选项将服务器名称传递给libmysqlclient C API库的mysql_options()函数。同样,每个MySQL客户端程序现在都包含一个--tls-sni-servername命令选项,用于传递一个名称。新的Tls_sni_server_name服务器状态变量在会话中显示设置的名称。
现在,默认情况下在MySQL客户端中启用了注释。要禁用它们,请使用--skip-comments选项启动mysql。
在调试版本中实现了一个SHOW PARSE_TREE语句,用于显示SELECT语句的JSON格式解析树。此语句不支持发布版本,仅在调试版本中可用,或者通过使用-DWITH_SHOW_PARSE_TREE编译服务器。
在之前的版本中,无效的SSL服务器和CA证书直到服务器启动后或在运行时加载无效证书后才被识别为有问题。现在,新增了一个名为tls-certificates-enforced-validation的系统变量,允许数据库管理员(DBA)在服务器启动时或使用ALTER INSTANCE RELOAD TLS语句在运行时重新加载证书时强制执行证书验证。启用强制执行后,如果发现无效的证书,服务器在启动时会停止调用,防止在运行时加载无效证书,并发出警告信息。
现在新增了一些服务器系统变量,用于控制使用LDAP插件认证连接到MySQL服务器的MySQL账户在LDAP服务器宕机或无响应时必须等待的时间。以下是针对简单认证和基于SASL的LDAP认证的默认超时时间,这些系统变量分别为:
- authentication_ldap_simple_connect_timeout
- authentication_ldap_simple_response_timeout
- authentication_ldap_sasl_connect_timeout
- authentication_ldap_sasl_response_timeout
连接和响应超时仅在Linux平台上可通过系统变量进行配置。
之前,MySQL服务器通过插件API生成和发出活动监控事件。现在,服务器使用组件API发出事件。同时,为了提供与使用审计插件API(如audit_log、MYSQL_FIREWALL、CONNECTION_CONTROL、Rewriter等)的插件的向后兼容性,服务器还实现了一个中间层,通过插件API生成所需的事件。与此相关的一些错误消息可能会有一个EVENT_TRACKING_前缀,而不是当前的MYSQL_AUDIT_前缀。
Bug修复
期待后面的文章