一.安全方面增强
1.mysql.user表变化
- mysql.user表中的plugin更改成not null
- 少了一个字段Password
- 多了三个字段
password_last_changed
,password_lifetime
,account_locked
- 5.7开始不再支持mysql_old_password的认证插件,推荐全部使用mysql_native_password。
- 可以设置账号的过期时间
- 可以对账号执行加锁或者解锁功能。
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表来记录同步复制的信息