迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:


写在前面

MySQL 5.7版本于2015年10月份左右GA,至今已经大半年了,但作为MySQL DBA的我却一直没时间follow它的特性,实在惭愧,以后会花时间来研究5.7版本的特性并针对部分优化功能做出压力测试。

 

本系列基于5.7.12版本来讲述MySQL的新特性,同时也建议大家跟踪官方blog和文档,以尽快知悉其新的变化。

MySQL 5.7的目标是成为发布以来最安全的MySQL服务器,其在SSL/TLS和全面安全开发方面有一些重要的改变。

 

1、5.7版本的用户表mysql.user要求plugin字段非空,且默认值是mysql_native_password,并且不再支持mysql_old_password。

 

2、增加密码过期功能

 

DBA可以设置任何用户的密码过期时间,具体详见官方文档《密码过期策略》(

 

 

可能大家都有如果业务系统的账号某一天突然过期了,业务受到影响怎么办? 别担心,可以设置密码永不过期。

 

default_password_lifetime=0

 

3、DBA可以通过对用户加锁/解锁进一步控制其访问db

 

例子:

 

4、SSL特性

 

MySQL 5.7版本提供了更为简单的SSL安全访问配置,并且默认连接就采用SSL的加密方式。细心的朋友在看官方文档的时候,会注意到安装步骤中多了一安装SSL的步骤,具体关于SSL是什么,请参考《图解SSL和加密》

 

以下推荐两篇延伸阅读,关于SSL特性我相信绝大多数数据库都没有开启,姜承尧文章中的测试案例显示弱开启SSL性能开销在25%左右。大家在尝试新的特性的时候,根据自己的业务做评估。

 

《MySQL的SSL加密连接与性能开销》

《SSL/TLS in MySQL 5.7》

 

5、使用更安全的初始化方式

 

逐步废弃mysql_install_db的安装方式使用initialize代替(mysql_install_db <5.7.6<= mysqld  —initialize) ,使用initialize参数初始化数据库有如下特性:

  1. 只创建一个 root账号,并且生成一个临时的标记为过期密码

  2. 不创建其他账号

  3. 不创建test 数据库

 

特别强调与—initialize不同,初始化的时候使用参数。

 

 

则会生成一个无密码的root账号。

6、SQL_MODE的变化

 

官方文档上表述,5.7 版本默认的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, and NO_ENGINE_SUBSTITUTION" 。而实际上我自己的测试环境中默认添加了STRICT_TRANS_TABLES 属性。

 

 

STRICT_TRANS_TABLES 意思是说要存储的字段的长度大于字段定义的大小,直接报错而非像5.6版本以及之前,截断数据进行存储,同时抛出一个warning。注意同一个会话调整 sql_mode必须退出之后在进入sql_mode才会生效。详细了解SQL_MODE请移步《sql_mode官方文档》。注意5.7对于null,'00000000 00:00:00' 这类default值的影响。

 

 

7、online ddl支持rename index name

 

个人感觉这个功能比较鸡肋,通常改变索引名称的时候,本身索引的结构需要增删字段,新建的索引名称也要修改合适的名称。

 

 

8、新增内置的full text 插件,支持中文、韩文、日文全文索引

 

之前的版本,只能依赖单词之间空格进行分词,对于依赖于语义分词而非空格分词的其他语言种类,5.7版本的引入支持解析中文、韩文、日文的全文索引--ngram full-text parser解决了该问题。具体请移步《ngram Full-Text Parser》。

 

9、动态修改varchar长度大小

 

可以通过ALTER TABLE语句以in place方式修改varchar的大小且无需table-copy。但存在限制:表示varchar长度的字节数不能变化(如果变更前使用1个字节表示长度,变更后也必须使用1个字节表示),即只支持0~255内的或者255以上的范围变更(增大),如果字段的长度从254增到256时就不能使用in-place算法,必须使用copy算法,否则报错。需要注意的是,减小varchar(N)长度的大小必须使用copy类型,如:

 

 

10、临时表性能优化

 

MySQL 5.7对临时表做了极大的改动,提升性能。

 

通过优化CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE语句的执行逻辑,提升临时表的性能(这个是从官网翻译的,还没找到除了alter之外的其他资料说明详细的优化过程)。

 

InnoDB临时表元数据不再存储于InnoDB系统表而是存储在INNODB_TEMP_TABLE_INFO,包含所有用户和系统创建的临时表信息。该表在第一次在其上运行select时被创建。

 

 

11、新增临时表空间

 

为所有非压缩的innodb临时表提供一个独立的表空间,默认的临时表空间文件为ibtmp1,位于数据目录。我们可通过innodb_temp_data_file_path参数指定临时表空间的路径和大小。

 

 

MySQL每次重新启动时,会重新创建临时表空间。

 

注意:从5.7.5开始,新增一个系统选项internal_tmp_disk_storage_engine可定义磁盘临时表的引擎类型为InnoDB,而在这以前,只能使用MyISAM。而在5.6.3以后新增的参数default_tmp_storage_engine是控制create temporary table创建的临时表的存储引擎,在以前默认是MEMORY,不要把这二者混淆了。

 

 

12、优化临时表

 

从MySQL 5.7.2针对正常和压缩的临时及相关对象引入新的"non-redo" undo log,因为临时表在数据库崩溃后不需要恢复,也就无需redo logs,避免了写relog相关的io,从而提高了性能。必须指出操作临时表需要undo log用于MySQL运行时的回滚、MVCC等。

 

13、支持新的DATA_GEOMETRY空间类型的数据

 

InnoDB现在支持MySQL-supported空间数据类型。之前的空间数据是以binary BLOB数据存储的,现在空间数据类型被映射到了一个InnoDB内部数据类型DATA_GEOMETRY。

 

14、升级innochecksum

 

innochecksum--离线的InnoDB文件校验工具,新增选择项或扩展的功能,如:

  1. 支持使用指定校验算法;

  2. 支持只重写校验值而不进行验证;

  3. 可指定允许的校验和不匹配量;

  4. 显示各类页的个数、导出页类型信息、输出至日志、从标准输入读取数据等;

  5. 从5.7.2起可支持校验超过2G的文件。

 

15、online DDL语句重建普通表和分区表

 

OPTIMIZE TABLE、ALTER TABLE … FORCE、ALTER TABLE … ENGINE=INNODB等DDL操作使用inplace算法,减少了重建时间和对应用的影响。

 

16、针对Fusion-io NVM文件系统的优化

 

Linux系统中Fusion-io Non-Volatile Memory (NVM)文件系统提供了原子写能力,使InnoDB的doublewrite变得冗余。因此,MySQL5.7.4以后,如果Fusion-io设备支持原子写, MySQL系统会自动关闭doublewrite,减少IO,提升性能。

 

更多新特性解析未完待续……敬请期待~

 

作者介绍  杨奇龙

  • 前阿里数据库团队资深DBA,主要负责淘宝业务线,经历多次双十一,有海量业务访问DB架构设计经验。

  • 目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化,故障诊断,性能压测。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-06-27

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
1019 2
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
4月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
4月前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
118 1
|
6月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
224 10
MySQL 8.0 新特性
|
6月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
1158 18
|
5月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
123 2
|
7月前
|
关系型数据库 MySQL Linux
在Linux中,新安装mysql后怎样提升mysql的安全级别?
在Linux中,新安装mysql后怎样提升mysql的安全级别?
|
7月前
|
安全 关系型数据库 MySQL
揭秘MySQL海量数据迁移终极秘籍:从逻辑备份到物理复制,解锁大数据迁移的高效与安全之道
【8月更文挑战第2天】MySQL数据量很大的数据库迁移最优方案
1055 17
|
7月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
7月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
305 1