What's New In MySQL 8.0(MySQL 8.0 新特性)

 

 

 

 

因为8.0内有不少C++11特性。须要gcc4.8版本以上。Rhel6系列默认gcc是4.7。在安装gcc6.1以后仍然检查不过。html

缘由多是6.1版本不必定高于4.7,暂不讨论。鉴于升级gcc耗时较长,与测试目的不符。暂用官方rpm包安装。以便达到快速测试目的。mysql

如下新功能介绍中,跟平常工做强相关大都通过测试。时间有限,未能面面俱到,有兴趣自行测试。正则表达式

如下大部分来源自 https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html。其中部分以此引伸出来。测试版本为MySQL8.0.11 GA版。sql

 水平有限,有问题多多指教。qq 475982055shell

 

一 MySQL 8.0发行说明及特性

Ⅰ 安全以及帐户管理方面

认证加密插件变动

除了sha256_password认证插件。可用一种新的caching_sha2_password认证插件。后者可使用缓存解决链接时的延时问题。数据库

它还支持更多的链接协议,而且不须要与基于RSA密钥对的密码交换功能的OpenSSL进行连接。json

 对比能够看出。MySQL8.0中默认新建用户使用caching_sha2_password,而不是原生的加密策略。这样客户端使用原有方式链接就会出现问题。缓存

Windows nivicat客户端链接问题安全

 

Linux 客户端下链接服务器

 

 

这是因为两边默认密码插件不匹配致使没法加解密的缘由。有两种方法解决。一种是服务端降级加密方式,一种是客户端升级加密方式。

第一种方式以安全代价换便捷。第二种相反。我想服务端应该是有全局参数控制新建用户使用什么插件进行加密的。以下:

 

这样一来客户端就能常规方式链接。可是以前建立的用户依然会报那样的错。解决方法是alter 语句修改。

注意的一点5.6的set password 的方式已经完全被淘汰。且password函数已经被删除。

 

默认配置启动。初始化启动后,使用生成的密码登陆不能作任何事,可是能够set命令。

因为密码强度之强,使得多数状况下的修改validate_password.policy参数。(这点伤透了个人心,之前是下划线“_”。有点面向对象的味道)

 

总结:也就是说加密方式改变致使账号链接改变。亦能够经过默认恢复到先前方式。

 

新增角色特性

同Oracle同样,用来将权限打包。再赋给拥有用户。

详见:http://dev.mysql.com/doc/refman/8.0/en/create-role.html

 

用户密码方面

MySQL之前有密码强度策略,过时时间。如今还维护有关密码历史记录的信息,从而限制重复使用之前的密码(社会工程学)。
存在mysql.password_history表中。也就是说若是是从老版本升级到8.0.3版本之上。须要同时升级这些系统表(废话)。
mysql.user 表中多出了几个关于密码重用的列。(相关表已确认,未测试功能。)

用户权限方面

新增多个管理权限。 

 

 

Ⅱ InnoDB加强

自增列方面

         自增列方面。如今自增列计数器会在每次值修改时,将值写到REDO LOG中,而且在CHECKPOINT时写到存储引擎私有的系统表中。

这就消除了以往重启实例自增列不连续的问题(这也可能造成了一个新的竞争点(盖国强会上提问InnoDB开发者))。

        

Btree索引方面

         Btree索引被损坏。InnoDB会向REDO LOG中写入一个损坏标志。同时也会CHECKPOINT时将内存中损坏页的数据记录到存储引擎私有的系统表中。

这也就促成了恢复时。两边一致的情形。索引不可用,并不会形成实例起不来。这很大程度上下降了以前使用innodb_force_recovery和innodb_fast_shutdown的必要。

提高了一致性。(对于通常DBA来讲透明,知道有这么回事就好)

 

NoSQl操做

InnoDB memcached插件支持多个get操做(在单个memcached查询中获取多个键/值对)

和范围查询。(我的认为这个挺牛逼,有点像NoSQL,不只仅是NoSQL)。

须要安装daemon_memcached插件,其中多了一个innodb_memcache schema,这个schema中有几张表,其中一张containers用来与InnoDB表之间作映射,,

而后经过接口访问Innodb表。而后会有一个11211的端口打开,用于创建链接。

好处是经过减小客户端和服务器之间的通讯流量,在单个memcached查询中获取多个键/值对的功能能够提升读取性能。

对于InnoDB来讲,也意味着更少的事务和开放式表操做。

 

死锁检测

新的动态配置选项innodb_deadlock_detect可用于禁用死锁检测,默认打开。 在高并发系统上,当大量线程等待相同的锁时,死锁检测会致使速度降低。 有时,在死锁发生时,

禁用死锁检测并依赖innodb_lock_wait_timeout设置进行事务回滚可能更有效。记得以前版本遇到死锁会自动回滚。如下截图来自MySQL5.7,与8.0默认相同。

(也就是说即使MySQL5.7也是有死锁检测的,而且自动回滚权重较小的事务(套死除外))。

尝试更改innodb_deadlock_detect参数为OFF。则遇到死锁时两个工做线程都会被堵塞。直到innodb_lock_wait_timeout设定的锁超时。

 

新的INFORMATION_SCHEMA.INNODB_CACHED_INDEXES表保存了Innodb索引缓存在Innodb buffer pool中的页数。

如今,全部InnoDB临时表都将在共享临时表空间ibtmp1中建立。

加密特性

支持REDO和UNDO表空间加密。

共享锁方面

InnoDB在 SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE锁定读语句上 支持不等待( NOWAIT)和跳过锁(SKIP LOCKED)的选项。也就是说以往加了共享锁以后必须手动释放。

这里若是没有锁就返回结果,若是有就报下面错误。

若是是用有锁就跳过,则无数据。

根据场景使用。反正都是秒回。下降了排查数据库超时的可能。

 

与MySQL 5.7使用上的不一样。首先初始化的日志言简意赅(前三条)

重启日志以下:

 

InnoDB使用本身的MySQL服务层的数据字典,再也不保留本身的数据字典。有利于事务的原子性。

MySQL系统表和数据字典表如今建立在MySQL数据目录中名为mysql.ibd的单个InnoDB表空间文件中。

之前,这些表是在mysql数据库目录中的各个InnoDB表空间文件中建立的。

 

数据字典

如今将表对象信息等数据字典存在内部事务表中。而不是以前的.frm 文件。

mysql schema多出的表:(相比MySQL5.7)

component

default_roles

global_grants

password_history

role_edges

    移除的表

       Proc

ndb_binlog_index

event

因为存储引擎层再也不保留本身的数据字典。因此表的.frm文件也不存在了。

 

 

原子性DDL

联合上述改变的数据字典更新。实现了DDL的原子性。之前版本中,不具有。

 

Ⅲ UNDO表空间的改变

(基本上不须要DBA配置关于UNDO表空间的参数了)

 

在线修改UNDO表空间数量

UNDO表空间数量能够在线修改。或者在实例重启时使用本来只能初始化以前设定的innodb_undo_tablespaces参数。

 

默认值更改

innodb_undo_log_truncate默认被打开。

 

innodb_undo_tablespaces 表空间数量默认由0变为2.而且被设置为0已经不被容许。

         UNDO默认名有UNDONNN变成UNDO_NNN

参数改变

innodb_rollback_segments 配置选项定义每一个UNDO表空间的回滚段数量。之前,这是一个针对MySQL实例的一个全局设定,单个写。

此次的改变是,事务写撤销日志时能够并发写入。innodb_undo_logs 被移除了。该参数代替。

 

Innodb_available_undo_logs状态变量被移除。要查看可用回滚段可用SHOW VARIABLES LIKE 'innodb_rollback_segments';

 

Ⅳ BUFFER POOL的改变

       参数默认值改变

 

 innodb_max_dirty_pages_pct_lwm 从0变为10

 

 innodb_max_dirty_pages_pct 从75到90.

控制INNODB BUFFER POOL预写,刷盘动做参数改变。我想应该是这些年来硬件的提高。

 

INNODB自增加锁模式变成2。基于语句对此很敏感,很显然这是全面基于行的象征。

 

支持使用 ALTER TABLESPACE ... RENAME TO 语句为通用表空间更名。

自动内存管理

新配置选项innodb_dedicated_server能经过服务器内存总量控制innodb_buffer_pool_size

innodb_log_file_size

innodb_flush_method

大小和方式。详见

默认。

 打开该参数事后

 

 

 

INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF记录表空间信息。

当系统不在线时,能够移除或者转存系统表空间到其余机器上。这对备份恢复又开辟一条路。必须是停机状态有点差强人意。

 

提取表空间

SDI(序列化字典信息)存在于除临时表空间和撤消表空间文件以外的全部InnoDB表空间文件中。 SDI数据的存在提供元数据冗余。
若是数据字典变得不可用,字典对象元数据可能从表空间文件中提取。 使用ibd2sdi工具执行SDI提取。

以下:其中SDI数据以JSON格式存储。这个工具,在线或者离线均可以使用。回头看看如何将这个json数据导入(MySQL高版本已经支持JSON)。

 

Ⅴ REDO方面优化

并行写入

一、  用户线程如今能够并发写入日志缓冲区,之前是串行写入。

特性添加

一、  用户线程如今能够按照relaxed的顺序将脏页添加到flush列表中。

二、  如今专用的日志线程负责将日志缓冲区写入系统缓冲区,将系统缓冲区刷新到磁盘,将写入和刷新的重作通知用户线程,维持放宽的清空列表顺序所需的延迟,

并写检查点。之前就是read,write进程负责后台读写。如今有点想Oracle的DBWR进程。

 

一些系统变量增长了。控制刷新REDO的CPU等待方式。

innodb_log_wait_for_flush_spin_hwm
innodb_log_spin_cpu_abs_lwm
innodb_log_spin_cpu_pct_hwm

动态修改log buffer

三、  innodb_log_buffer_size配置选项如今是动态的。

 

Ⅵ 其余关键特性

资源管理

MySQL8.0有了资源组(详情点击连接)的概念。也就是说能够建立并管理一个资源组。

将工做线程分配给特定的组。以便DBA限制,调配资源。目前只针对CPU。

INFORMATION_SCHEMA.RESOURCE_GROUPS表显示有关资源定义。Performance Schema threads表显示了每一个线程的资源组分配。

有SQL接口支持资源组管理。这些操做不会被记录到binlog中,也就是说不会被复制。

字符集

官方建议用utf8mb4代替utf8(utf8如今是utf8mb3的别名)。默认也是utf8mb4

 

JSON 加强

         鉴于没见到有用,不说起了。

 

优化器加强

一、  支持不可见索引。优化器不会使用不可用索引。索引默认是可见的。这个在索引优化的时候很是有用。不须要删除一个索引来增长系统负担。

二、  MySQL如今支持降序索引:索引定义中的DESC再也不被忽略,会致使键值以降序存储。 之前,索引可能会以相反顺序扫描,但性能会受到影响。

能够按照顺序扫描降序索引,这是更高效的。 降序索引还使得优化器能够在最有效的扫描顺序混合某些列的升序和其余列的降序时使用多列索引。

 

通用表表达式

    也就是说能够将不少表的不一样列取出来做为新表,而后在作关联联合等等操做。我的认为这个对编写含有大量子查询的SQL有很大帮助,以及行转列。 

 

窗口函数

支持大量窗口函数

相似如下数据。尝试窗口函数的特性。Oracle有这些特性叫作分析函数等。

 

聚合函数的窗口函数

AVG()

BIT_AND()

BIT_OR()

BIT_XOR()

COUNT()

MAX()

MIN()

STDDEV_POP(), STDDEV(), STD()

STDDEV_SAMP()

SUM()

VAR_POP(), VARIANCE()

VAR_SAMP()

 

示例:若是每列包含总利润,且包含当前行所在国家利润和。以下结果

 

若是利用传统SQL实现.以下,得写一堆表关联、聚合。

SELECT

         t1. YEAR,t1.country,t1.product,t1.profit,t2.total_profit,t3.country_profit

FROM

         (

                   SELECT YEAR,country,product,profit

                   FROM

                            sales

         ) t1

LEFT JOIN (

         SELECT

                   sum(profit) AS total_profit

         FROM

                   sales

) t2 ON 1 = 1

LEFT JOIN (

         SELECT

                   country,sum(profit) AS country_profit

         FROM

                   sales

         GROUP BY

                   country

) t3 ON t1.country = t3.country

ORDER BY

         country,YEAR,product,profit;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

窗口函数实现:

SELECT

     year, country, product, profit,

     SUM(profit) OVER() AS total_profit,

     SUM(profit) OVER(PARTITION BY country) AS country_profit

FROM sales

         ORDER BY country, year, product, profit;

 

 
 
 
 
 
 
 
 
非聚合函数的窗口函数

CUME_DIST()

DENSE_RANK()

FIRST_VALUE()

LAG()

LAST_VALUE()

LEAD()

NTH_VALUE()

NTILE()

PERCENT_RANK()

RANK()

ROW_NUMBER()

 

示例:

还有一种比较常见的操做。上述表中,同一个国家的利润排行。

以下所示: 

 

常规实现须要将每一个城市的利润排序,在union 到一块儿。过于繁琐。

 

 

 

窗口函数实现

SELECT YEAR,country,product,profit,

         ROW_NUMBER () OVER (

                   PARTITION BY country

                   ORDER BY

                            profit DESC

         ) AS row_num2

FROM sales;

 

 

 

 

 

 

 

 

 

正则表达式支持

以前MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符(REGEXP,RLIKE) ,如今支持强大的正则表达式.

如:函数REGEXP_INSTR,REGEXP_REPLACE和REGEXP_SUBSTR函数可用于查找匹配位置并分别执行子字符串替换和提取。

日志记录

除了传统错误日志外。另外,还有一个可加载的JSON日志记录器。 要控制启用哪些日志组件,使用 log_error_services 系统变量。更多信息参见错误日志

备份锁

一种新的备份锁容许在线备份期间的DML,同时防止可能致使快照不一致的操做。 新备份锁由LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE语法支持。

SET命令加强

相似Oracle,可用改变当前且用于下次重启生效的SET PERSIST,以及PERSIST_ONLY(更改仅仅应用下次重启。)不一样的是,不像Oracle 记录到spfile参数文件中。(此特性已经测试)

命令行部分补全功能

比较爽的是,命令支持表补全功能。待补的对象不是所在Schema下的表。而是Schema所对应的

 

二 MySQL 8.0中弃用的

一、validate_password插件已被从新实现以使用服务器组件基础结构。 

 

二、 ALTER TABLESPACE 和 DROP TABLESPACE ENGINE 子句被弃用。

 

三、JSON_MERGE函数在8.0.3中被弃用,使用 JSON_MERGE_PRESERVE()代替.

 

三 MySQL 8.0中移除的

一、如下information Schema中的视图被更名

Old Name

New Name

INNODB_SYS_COLUMNS

INNODB_COLUMNS

INNODB_SYS_DATAFILES

INNODB_DATAFILES

INNODB_SYS_FIELDS

INNODB_FIELDS

INNODB_SYS_FOREIGN

INNODB_FOREIGN

INNODB_SYS_FOREIGN_COLS

INNODB_FOREIGN_COLS

INNODB_SYS_INDEXES

INNODB_INDEXES

INNODB_SYS_TABLES

INNODB_TABLES

INNODB_SYS_TABLESPACES

INNODB_TABLESPACES

INNODB_SYS_TABLESTATS

INNODB_TABLESTATS

INNODB_SYS_VIRTUAL

INNODB_VIRTUAL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、不能使用grant 语句建立用户了。只能赋权。Identified 子句移除。

 

3transaction_isolation 和 transaction_read_only 用来替代

tx_isolation 和tx_read_only

 

四、由于没有.frm文件了,sync_frm系统变量移除了。 ignore_db_dirs也被移除。

 

五、have_query_cache仍然保持弃用状态, SQL_CACHE和SQL_NO_CACHE子句被弃用,且不起做用。这些在未来版本会被删除。

 

6、log_warnings被移除了,log_error_verbosity代替

 

7、加密相关的函数ENCODE() 和 DECODE()以及ENCRYPT() 等都被移除了。

 

8、存储过程的ANALYSE() 语法被移除。

 

9、INFORMATION_SCHEMA.INNODB_LOCKSINNODB_LOCK_WAITS表被移除。使用 Performance Schema.data_locksdata_lock_waits 的表代替。

 

10、InnoDB文件格式相关配置选项已经不存在了。它们是MySQL5.1的产物,如今5.1的产品时代已经终结。

 

11、innodb_support_xa系统变量被移除,MySQL老是支持分布式事务。