共计 5540 个字符,预计需要花费 14 分钟才能阅读完成。
本篇内容主要讲解“MySQL 5.7 新特性有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“MySQL 5.7 新特性有哪些”吧!
1. 背景
MySQL 5.7 在 2015-10-21 发布了 GA 版本,即 5.7.9,目前小版本已经到了 5.7.12。5.7 新增了许多新的 feature 和优化,接下来一个系列,我们就一起来尝尝鲜。首先这次主要是预览 feature 的变化以及兼容性问题。后面的系列,会针对重要的 feature 展开来学习。
2 安全相关的特性
2.1 认证插件
mysql.user 表中的 plugin 更改成 not null,5.7 开始不再支持 mysql_old_password 的认证插件,推荐全部使用 mysql_native_password。从低版本升级到 5.7 的时候,需要处理两个兼容性问题。
[兼容性]
需要先迁移 mysql_old_password 的用户,然后进行 user 表结构的升级:
1. 迁移 mysql_old_password 用户
MySQL 5.7.2 之前的版本,是根据 password 的 hash value 来判断使用的认证插件类型,5.7.2 以后的版本,plugin 字段为 not null,就直接根据 plugin 来判断了。新的密码从 password 字段中,保存到新的字段 authentication_string 中,password 字段废弃处理。
如果 user 是隐式的 mysql_native_password。直接使用 sql 进行变更:
UPDATE mysql.user SET plugin = mysql_native_password WHERE plugin = AND (Password = OR LENGTH(Password) = 41); FLUSH PRIVILEGES;
如果 user 是隐式的或者显示的 mysql_old_password,首先通过以下 sql 进行查询:
SELECT User, Host, Password FROM mysql.user WHERE (plugin = AND LENGTH(Password) = 16) OR plugin = mysql_old_password
如果存在记录,就表示还有使用 mysql_old_password 的 user,使用以下 sql 进行用户的迁移:
ALTER USER user1 @ localhost IDENTIFIED WITH mysql_native_password BY DBA-chosen-password
2. user 表结构升级
通过 mysql_upgrade 直接进行升级,步骤如下[5.6- 5.7]:
stop MySQL 5.6 实例
替换 5.7 的 mysqld 二进制版本
使用 5.7 启动实例
run mysql_upgrade 升级系统表
重启 MySQL 5.7 实例
2.2 密码过期
用户可以通过 ALTER USER jeffrey @ localhost PASSWORD EXPIRE; 这样的语句来使用户的密码过期。
并新增加 default_password_lifetime 来表示用户密码自动过期时间,从 5.7.10 开始,其默认值从 0 变更到了 360,也就是默认一年过期。
可以通过以下两种方法禁止过期:
1. SET GLOBAL default_password_lifetime = 0; 2. ALTER USER jeffrey @ localhost PASSWORD EXPIRE NEVER;
[兼容性]
只需要通过 mysql_upgrade 升级 mysql.user 系统表就可以使用密码过期新功能。
2.3 账号锁定
用户可以通过以下语法进行账号锁定,阻止这个用户进行登录:
ALTER USER jeffrey @ localhost ACCOUNT LOCK; ALTER USER jeffrey @ localhost ACCOUNT UNLOCK;
[兼容性]
只需要通过 mysql_upgrade 升级 mysql.user 系统表就可以使用密码过期新功能。
2.4 SSL 连接
如果 mysqld 编译使用的 openssl,在启动的时候,默认创建 SSL,RSA certificate 和 key 文件。
但不管是 openssl 还是 yassl,如果没有设置 ssl 相关的参数,mysqld 都会在 data directory 里查找 ssl 认证文件,来尽量打开 ssl 特性。
[兼容性]
不存在兼容性的问题
2.5 安装数据库
5.7 开始建议用户使用 mysqld –initialize 来初始化数据库,放弃之前的 mysql_install_db 的方式,新的方式只创建了一个 root@localhost 的用户,随机密码保存在~/.mysql_secret 文件中,并且账号是 expired,第一次使用必须 reset password,并且不再创建 test db。
[兼容性]
不存在兼容性的问题
3 sql mode 变更
5.7 sql_mode 的默认值变更为:
mode_no_engine_substitution |
mode_only_full_group_by |
mode_strict_trans_tables |
mode_no_zero_in_date |
mode_no_zero_date |
mode_error_for_division_by_zero |
mode_no_auto_create_user
而在 5.7 之前,sql_mode 的默认值都只有 mode_no_engine_substitution。
所以在 5.7 默认的情况下,比如 grant 不存在的用户的时候,会报一下错误:
ERROR 1133 (42000): Can t find any matching row in the user table
必须先使用 create user,然后再使用 grant user。
[兼容性]
默认 sql mode 发生变更会导致 sql 的行为不一致。
4. online alter table
支持 online rename index 操作,in_place 并且不需要 table copy。
[兼容性]
不存在兼容性的问题
5. InnoDB 增强
5.1 varchar 长度变更支持 inplace
变更 varchar 类型字段的长度支持 inplace 方法,但有一个限制,即用于表示 varchar 字段长度的字节数不能发生变化,也就是支持比如 varchar 的长度在 255 以下变更或者 255 以上的范围进行变更,因为从小于 255 变更到大于 255,其 size 的字节需要从 1 个增加到 2 个。
注意:减少 varchar 的长度,仍然需要 table copy。
5.2 优化 InnoDB 临时表
因为 InnoDB 临时表的数据不再不受 redo 保护,而 redo 只保护临时表的元数据,所以大幅提升了临时表的性能。
并且 InnoDB 临时表的元数据保存在一个新的系统表中即 innodb_temp_table_info,
临时表将建立一个统一的表空间,我们称之为临时表空间,其目录地址可以通过参数 innodb_temp_data_file_path 来设置。系统在启动的时候,都会新建这个表空间,重启会删除重建。
例如:
mysql show global variables like %temp_data_file_path% +----------------------------+-----------------------+ | Variable_name | Value | +----------------------------+-----------------------+ | innodb_temp_data_file_path | ibtmp1:12M:autoextend | +----------------------------+-----------------------+
并且 5.7 存储引擎默认都变更成 InnoDB 了:
mysql show global variables like %storage_engine% +----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+--------+
注意: 在开启 gtid 的情况下,非 auto commit 或者显示 begin 的 context 下,create 或者 drop 临时表,仍然和 5.6 一样:
ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.
另外,insert into t select * from t 也会遇到错误,不能在一个 sql 语句中 reference 两次临时表。
备注: 因为 InnoDB 临时表进行了比较大的变动,我们会专门进行一次详细的介绍。
5.3 InnoDB 原生支持 DATA_GEOMETRY 类型
并且支持在 spatial data types 上建立 index,加速查询。
5.4 buffer pool dump
buffer pool dump 和 load 支持一个新的参数 innodb_buffer_pool_dump_pct,即 dump 的比例,并且使用 innodb_io_capacity 来控制 load 过程中的 IO 吞吐量。
5.5 多线程 flush dirty
从 5.7.4 开始,innodb_page_cleaners 参数可以设置,支持多线程 flush dirty page,加快脏块的刷新。
5.6 NVM file system
MySQL 一直使用 double write buffer 来解决一个 page 写入的 partial write 问题,但在 linux 系统上的 Fusion-io Non-Volatile Memory (NVM) file system 支持原子的写入。
这样就可以省略掉 double write buffer 的使用,5.7.4 以后,如果 Fusion-io devices 支持 atomic write,那么 MySQL 自动把 dirty block 直接写入到数据文件了。这样减少了一次内存 copy 和 IO 操作。
5.7 InnoDB 分区表
MySQL 5.7 之前的版本,InnoDB 并不支持分区表,分区表的支持是在 ha_partition 引擎上支持的,从 5.7 开始,InnoDB 支持原生的分区表,并且可以使用传输表空间。
[兼容性]
mysql_upgrade 会扫描 ha_partition 引擎支持的 InnoDB 表,并升级成 InnoDB 分区表,5.7.9 之后,可以通过命令 ALTER TABLE … UPGRADE PARTITIONING. 进行升级。如果之前的版本大量使用了分区表,要注意使用 mysql_upgrade 会消耗非常长的时间来升级分区表。
5.8 动态调整 buffer pool size
MySQL 5.7.5 之后,可以 online 动态调整 buffer pool size,通过设置动态的参数 innodb_buffer_pool_size 来调整,并且根据 Innodb_buffer_pool_resize_status 状态来查看 resize 的进度,因为 resize 的过程是以 chunk 为大小,把 pages 从一个内存区域 copy 到另一片内存的。
5.9 加快 recovery
MySQL 5.7.5 之前,在 recovery 的过程中,需要扫描所有的 ibd 文件,获取元信息,5.7.5 之后,新加了一种 redo log 类型,即 MLOG_FILE_NAME,记录从上一次 checkpoint 以来,发生过变更的文件,这样在 recovery 的过程中,只需要打开这些文件就可以了。
[兼容性]
因为增加了新的 log record type,需要安全的关闭 5.7 之前的实例,清理掉 redo。
5.10 表空间管理
支持创建表空间,例如
CREATE TABLESPACE `tablespace_name` ADD DATAFILE file_name.ibd [FILE_BLOCK_SIZE = n]
并可以在创建表的时候,指定属于哪个表空间,
[兼容性]
因为可以任意指定空间目录,要注意升级过程中,不要漏掉目录。
5.11 InnoDB Tablespace Encryption
支持 InnoDB 数据文件加密,其依赖 keyring plugin 来进行秘钥的管理,后面我们单独来介绍 InnoDB 加密的方法,并且 RDS 也实现了一种 InnoDB 数据文件透明加密方法,并通过 KMS 系统来管理秘钥。例如:
create table t(id int) encryption= y
到此,相信大家对“MySQL 5.7 新特性有哪些”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!