【MySQL】5.7新特性之四

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 写在前面  本系列文章基于5.7.12 版本讲述MySQL的新特性。从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍5.7 的新特性和功能。
写在前面
 本系列文章基于5.7.12 版本讲述MySQL的新特性。从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍5.7 的新特性和功能。同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化。前面写了一篇文章介绍 innodb 的特性,囿于相关知识点比较多 ,本文继续介绍5.7版本的innodb 新特性。
4.1 innodb buffer dump 功能增强     
      5.7.5 新增加innodb_buffer_pool_dump_pct参数,来控制每个innodb buffer中转储活跃使用的innodb buffer pages的比例。之前的版本默认值是100%,当触发转储的时候 会全量dump innodb buffer pool中的pages。如果启用新的参数比如40 ,每个innodb buffer pool instance中有100个 ,每次转储每个innodb buffer 实例中的40个pages。
    注意:当innodb发现innodb 后台io资源紧张时,会主动降低该参数设置的比例。

4.2 支持多线程刷脏页  
      MySQL 5.6.2版本中,MySQL将刷脏页的线程从master线程独立出来,5.7.4版本之后,MySQL系统支持多线程刷脏页,进程的数量由innodb_page_cleaners参数控制,该参数不能动态修改,最小值为1 ,最大值支持64,5.7.7以及之前默认值是1 ,5.7.8版本之后修改默认参数为4。当启用多线程刷脏也,系统将刷新innodb buffer instance脏页分配到各个空闲的刷脏页的线程上,如果设置的innodb_page_cleaners>innodb_buffer_pool_instances,系统会自动重置为innodb_buffer_pool_instances大小。

4.3 动态调整 innodb buffer size
    从5.7.5版本, MySQL支持在不重启系统的情况下动态调整innodb_buffer_pool_size。resize的过程是以chunk(每个chunk的大小默认为128M)的为单位迁移pages到新的内存空间,迁移进度可以通过Innodb_buffer_pool_resize_status 查看。记住整个resize的大小是以chunk为单位的。innodb_buffer_pool_chunk_size的大小,计算公式是innodb_buffer_pool_size / innodb_buffer_pool_instances,新调整的值必须是 innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的整数倍。如果不是整数倍,则系统则会调整值为大于两者乘积的最大值。 
例子
  1. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
  2. +----------------------------------+----------------------------------------------------------------------+
  3. | Variable_name | Value |
  4. +----------------------------------+----------------------------------------------------------------------+
  5. | Innodb_buffer_pool_resize_status | Size did not change (old size = new size = 268435456. Nothing to do. |
  6. +----------------------------------+----------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> set global innodb_buffer_pool_size=128*1024*1024;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
  11. +----------------------------------+----------------------------------------------------+
  12. | Variable_name | Value |
  13. +----------------------------------+----------------------------------------------------+
  14. | Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 160702 23:53:51. |
  15. +----------------------------------+----------------------------------------------------+
  16. 1 row in set (0.00 sec)
  17. mysql> set global innodb_buffer_pool_size=256*1024*1024;
  18. Query OK, 0 rows affected (0.00 sec)
  19. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
  20. +----------------------------------+----------------------------------------------------+
  21. | Variable_name | Value |
  22. +----------------------------------+----------------------------------------------------+
  23. | Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 160702 23:54:19. |
  24. +----------------------------------+----------------------------------------------------+
  25. 1 row in set (0.00 sec)
online调整bp size的log 记录大致过程 
a 计算要调整的bpsize
b 禁止AHI,清理所有的索引缓存
c Withdrawing block是遍历freelist 确定可以使用的空闲block
d 锁住整个buffer pool 
e 迁移重新分配chunk/删除可以释放的chunk 
f 设置innodb_buffer_pool_size为新的值
g 重新开启AHI 
  1. 2016-07-02T15:40:44.724495Z 0 [Note] InnoDB: Resizing buffer pool from 134217728 to 268435456 (unit=134217728).
  2. 2016-07-02T15:40:44.724546Z 2 [Note] InnoDB: Resizing buffer pool from 134217 (new size: 268435456 bytes)
  3. 2016-07-02T15:40:44.724559Z 0 [Note] InnoDB: Disabling adaptive hash index.
  4. 2016-07-02T15:40:44.724979Z 0 [Note] InnoDB: disabled adaptive hash index.
  5. 2016-07-02T15:40:44.725029Z 0 [Note] InnoDB: Withdrawing blocks to be shrunken.
  6. 2016-07-02T15:40:44.725040Z 0 [Note] InnoDB: Latching whole of buffer pool.
  7. 2016-07-02T15:40:44.725210Z 0 [Note] InnoDB: buffer pool 0 : resizing with chunks 1 to 2.
  8. 2016-07-02T15:40:44.735439Z 0 [Note] InnoDB: buffer pool 0 : 1 chunks (8192 blocks) were added.
  9. 2016-07-02T15:40:44.735511Z 0 [Note] InnoDB: Completed to resize buffer pool from 134217728 to 268435456.
  10. 2016-07-02T15:40:44.735561Z 0 [Note] InnoDB: Re-enabled adaptive hash index.
  11. 2016-07-02T15:40:44.735586Z 0 [Note] InnoDB: Completed resizing buffer pool at 160702 23:40:44.
这个特性是最令众多MySQL DBA 期待的特性之一。以后线上动态扩容,缩容就无需做数据库切换了,间接增强了系统的稳定性和DBA的生活幸福感。当然本文中介绍的略显粗略。详细内容请参考《 官方文档》 

4.4 支持 全局表空间  
     全局表空间可以被所有的数据库的表共享,而且相比于 file-per-table tablespaces. 使用共享表空间可以节约元数据方面的内存。(需要更深入的了解共享表空间 主要是大小 收缩问题) 
  1. mysql> CREATE TABLESPACE `youzan_com`
  2.     -> ADD DATAFILE 'youzan_com.ibd' FILE_BLOCK_SIZE = 16k;
  3. Query OK, 0 rows affected (0.02 sec)
  4. mysql> use yang
  5. Database changed
  6. mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8 TABLESPACE youzan_com ;
  7. Query OK, 0 rows affected (0.04 sec)
  8. mysql> create database youzan default charset utf8;
  9. Query OK, 1 row affected (0.02 sec)
  10. mysql> use youzan
  11. Database changed
  12. mysql>
  13. mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8 TABLESPACE youzan_com ;
  14. Query OK, 0 rows affected (0.03 sec)
4.5 行格式默认为DYNAMIC
     从MySQL 5.7.9 开始,行格式DYNAMIC 取代COMPACT 成为innodb存储引擎默认的行格式,MySQL提供了新的参数innodb_default_row_format来控制Innodb 行格式,详细的信息请参考《 Specifying the Row Format for a Table

4.6 支持原生的分区表
      在MySQL 5.7.6之前的版本中,创建分区表时MySQL为每个分区创建一个ha_partition handler,自MySQL 5.7.6之后,MySQL支持原生的分区表并且只会为分区表创建一个partition-aware handler,这样的分区表功能增强节约分区表使用的内存。对于老版本创建的分区表在升级到新的版本之后怎么处理呢?莫慌,5.7.9之后,MySQL提供了如下升级方式解决这个问题:
  1. ALTER TABLE ... UPGRADE PARTITIONING.
当然友情提示:从我个人的理解来看,在没有合适的自动化维护分区表系统的基础上,不推荐使用分区表。四年的工作经历已经数次在分区表上掉坑里了。

4.7 支持truncate undo logs 
     MySQL 5.7.5版本开始支持truncate undo 表空间中的undo log。启用该特性必须设置innodb_undo_log_truncate=[ON|1]。大致原理是系统必须设置至少两个undo 表空间(初始化的时候设置 innodb_undo_tablespaces=2 ) 用于清理undo logs的切换。该特性的好处是 解决了 ibdata 文件一直增大的问题,减轻系统的空间使用。 详细信息参考《 官方文档

小结
      到这里 innodb 部分算是基本完成,但是依然有很多其他的特性需要"探索 " ,自己在写《MySQL 5.7 新特性》系列文章的时候,或深入或简单阅读官方文档,深刻的感觉到5.7 有很多新的变化,同时也感到自己对于5.6版本的官方文档并未阅读透彻,并没有之前学习Oracle的时候的学习方式---官方文档是最好的教材。在这里仅以过来人 DBA 老司机的角度给MySQL DBA新人的建议 多阅读官方文档,胜过市面上99%的书籍。
    后面会继续探索MySQL 5.7 新特性。
参考文章
[1] 《 MySQL 5.7 官方文档
[2] 《 MySQL 5.7 初探
[3] 《 MySQL 5.7新特性之一
[4] 《 MySQL 5.7新特性之二
[5] 《 MySQL 5.7新特性之三
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
1月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
1月前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
3月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
170 10
MySQL 8.0 新特性
|
3月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
748 18
|
2月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
60 2
|
4月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
4月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
202 1
|
6月前
|
关系型数据库 MySQL 测试技术
深入探索MySQL 8:隐藏索引与降序索引的新特性
深入探索MySQL 8:隐藏索引与降序索引的新特性
|
6月前
|
关系型数据库 MySQL 数据库
MySQL 8.0 新特性之不可见主键
【6月更文挑战第9天】MySQL 8.0 引入了不可见主键特性,提供更灵活的数据库管理方式。不可见主键能减少业务逻辑干扰,提高数据安全性和隐私,同时在某些场景下更适用。示例展示了如何创建和使用不可见主键,但需要注意它可能带来的理解和调试难题。此特性增加了设计和管理数据库的选项,适用于对数据隐私有高要求的场景。随着技术发展,不断学习和探索新特性将提升数据库性能和功能。
94 9