5.7新特性(总结)

一.安全方面增强

1.mysql.user表变化

  1. mysql.user表中的plugin更改成not null
  2. 少了一个字段Password
  3. 多了三个字段password_last_changedpassword_lifetimeaccount_locked
  4. 5.7开始不再支持mysql_old_password的认证插件,推荐全部使用mysql_native_password。
  5. 可以设置账号的过期时间
  6. 可以对账号执行加锁或者解锁功能。

2.数据库初始化方式变更

  • mysql5.7之前使用的是/scripts/mysql_install_db,默认root账号没有密码
  • mysql5.7之后使用的是bin/mysqld
    • 默认会生成一个root的随机密码
    • 不再创建匿名用户
    • 不再创建test database

二.sql模式改变

默认启用严格的sql模式

  • mysql5.6
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
  • mysql5.7
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

三.DDL语法改进

ALTER TABLE现在支持重命名索引的RENAME INDEX子句

  • mysql5.6(不支持这种语法,执行报错)
mysql> alter table test4 rename index idx_data to idx_data1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index idx_data to idx_data1' at line 1
  • mysql5.7
mysql> alter table test4 rename index idx_data to idx_data1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

四.Innodb引擎增强

1.online ddl改进

VARCHAR列大小可以使用一个in-place ALTER表来增加,如下例所示:

ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;


以下两种情况的修改字段长度的ddl,可以使用in-place方式

  • VARCHAR列大小从0增加到255字节(utf8一个字符为3个字节,也就是从varchar(0)到85)
mysql>   alter table sbtest4  ALGORITHM=INPLACE,modify test1 varchar(85) not null default '';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>   alter table sbtest4  ALGORITHM=INPLACE,modify test1 varchar(86) not null default ''; 
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  • 从256字节增加到更大的大小(utf8一个字符为3个字节,也就是从varchar(86)到更多)
mysql> alter table sbtest4 add test2 varchar(86) not null default '';
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>   alter table sbtest4  ALGORITHM=INPLACE,modify test2 varchar(200) not null default '';   
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

其他情况还是要使用copy方式,拷贝整个表(速度慢,堵塞dml)

mysql> show create table sbtest2;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                         |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest2 | CREATE TABLE `sbtest2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  `test1` varchar(85) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `idx_k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8 MAX_ROWS=1000000

mysql> alter table sbtest2 modify test1 varchar(86) not null default '';                   
    Query OK, 9998981 rows affected (4 min 3.38 sec)
Records: 9998981  Duplicates: 0  Warnings: 0

2.InnoDB缓冲池转储和加载操作得到了增强

  • mysql5.6
mysql> show variables like '%dump%';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| innodb_buffer_pool_dump_at_shutdown | OFF   |
| innodb_buffer_pool_dump_now         | OFF   |
+-------------------------------------+-------+
2 rows in set (0.00 sec)
  • mysql5.7
mysql> show variables like '%dump%';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| innodb_buffer_pool_dump_at_shutdown | ON    |
| innodb_buffer_pool_dump_now         | OFF   |
| innodb_buffer_pool_dump_pct         | 25    |
+-------------------------------------+-------+
3 rows in set (0.00 sec)

一个新的系统变量innodb_buffer_pool_dump_pct允许您指定每个缓冲池中要读取和转储的最近使用页面的百分比。默认25%

3.支持缓冲池大小在线变更

innodb_buffer_pool_size参数是动态的,允许您在不重启服务器的情况下调整缓冲池的大小。调整大小的操作(包括将页面移动到内存中的新位置)是以块的形式执行的。块大小可以使用新的innodb_buffer_pool_chunk_size配置选项进行配置。可以使用新的Innodb_buffer_pool_resize_status变量监视调整大小的过程。

4.支持回收(收缩)undo log回滚日志物理文件空间

可以truncate驻留在undo表空间中的undo日志。这个特性是使用innodb_undo_log_truncate配置选项启用的。

5.支持为innodb表建立通用表空间

InnoDB支持使用CREATE TABLESPACE语法创建通用表空间。

CREATE TABLESPACE `tablespace_name`
  ADD DATAFILE 'file_name.ibd'
  [FILE_BLOCK_SIZE = n]

一般表空间可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表。

五.引入JSON列类型及相关函数

从MySQL 5.7.8开始,MySQL开始支持一种原生JSON类型。JSON值不存储为字符串,而是使用允许快速读取文档元素的内部二进制格式。每当插入或更新JSON列中存储的JSON文档时,都会自动验证它们,而无效的文档会产生错误。JSON文档在创建时是标准化的,可以使用大多数比较操作符进行比较,比如=、<、<=、>、>=、<>、!=和<=>

六.新增sys这个database

MySQL发行版现在包括sys模式,它是一组对象,帮助dba和开发人员解释性能模式收集的数据。sys schema对象可用于典型的调优和诊断用例。

七.支持为表增加计算列

MySQL现在支持在CREATE TABLE和ALTER TABLE语句
中生成列的规范。生成列的值从列创建时指定的表达式计算。生成的列可以是虚拟的(在读取行时“动态计算”),也可以是存储的(在插入或更新行时计算)。

八.支持多源复制

现在可以进行多源复制。MySQL多源复制增加了从多个主服务器复制到从服务器的能力。MySQL多源复制拓扑可用于将多个服务器备份到单个服务器,合并表碎片,并将多个服务器的数据合并到单个服务器
作为MySQL多源复制的一部分,添加了复制通道。复制通道允许从服务器打开多个连接进行复制,每个通道都是到主服务器的连接。

九.支持mgr

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性,总结MGR特点如下
高一致性:基于分布式paxos协议实现组复制,保证数据一致性
高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作,内置防脑裂保护机制
高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致
高灵活性:提供单主模式和多主模式,单主模式在主库宕机后能够自动选主,所有写入都在主节点进行,多主模式支持多节点写入。

十.支持基于组提交的并行复制

MySQL 5.7才可称为真正的并行复制,这其中最为主要的原因就是slave服务器的回放与主机是一致的即master服务器上是怎么并行执行的slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。
MySQL 5.7并行复制的思想简单易懂,一言以蔽之: 一个组提交的事务都是可以并行回放 ,因为这些事务都已进入到事务的prepare阶段,则说明事务之间没有任何冲突(否则就不可能提交)。

为了兼容MySQL 5.6基于库的并行复制,5.7引入了新的变量slave-parallel-type,其可以配置的值有:

  • DATABASE:默认值,基于库的并行复制方式
  • LOGICAL_CLOCK:基于组提交的并行复制方式

十一.支持无损半同步复制

  • mysql5.6
    after_commit,可能会丢数据
  • myql5.7
    支持无损半同步复制,after_sync,不会丢数据

MySQL5.7在Master事务提交的时间方面做了改进(rpl_semi_sync_master_wait_point
:AFTER_COMMIT\AFTER_SYNC【默认】),事务是在提交之前发送给Slave(默认,after_sync),当Slave没有接收成功,并且Master宕机了,不会导致主从不一致,因为此时主还没有提交,所以主从都没有数据。

十二.gtid复制改进

  • mysql5.6
开启gtid复制方式后,必须开启log_slave_updates参数,否则启动会报错,因为需要在binlog里面找到同步复制的信息
  • mysql5.7
不需要开启log_slave_updates参数,因为用一张gtid_executed表来记录同步复制的信息

你可能感兴趣的:(5.7新特性(总结))