前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 5.7 新特性之四

MySQL 5.7 新特性之四

作者头像
用户1278550
发布2018-08-09 14:07:45
6970
发布2018-08-09 14:07:45
举报
文章被收录于专栏:idbaidba

前言

本系列文章基于5.7.20 版本讲述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的整数倍。如果不是整数倍,则系统则会调整值为大于两者乘积的最大值。 例子 从4G 扩大到8G内存

代码语言:javascript
复制
(none) [RW] 03:05:05 >SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_buffer_pool_resize_status |       |
+----------------------------------+-------+
1 row in set (0.02 sec)

(none) [RW] 03:07:39 >set global innodb_buffer_pool_size=8*1024*1024*1024;
Query OK, 0 rows affected (0.04 sec)

(none) [RW] 03:08:08 >SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+----------------------------------------------------+
| Variable_name                    | Value                                              |
+----------------------------------+----------------------------------------------------+
| Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 180325 15:08:05. |
+----------------------------------+----------------------------------------------------+
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

日志输出如下:

代码语言:javascript
复制
2018-03-25T15:08:04.320401+08:00 0 [Note] InnoDB: Resizing buffer pool from 4294967296 to 8589934592 (unit=134217728).
2018-03-25T15:08:04.320460+08:00 0 [Note] InnoDB: Disabling adaptive hash index.
2018-03-25T15:08:04.329706+08:00 0 [Note] InnoDB: disabled adaptive hash index.
2018-03-25T15:08:04.329742+08:00 0 [Note] InnoDB: Withdrawing blocks to be shrunken.
2018-03-25T15:08:04.329757+08:00 0 [Note] InnoDB: Latching whole of buffer pool.
2018-03-25T15:08:04.329804+08:00 0 [Note] InnoDB: buffer pool 0 : resizing with chunks 4 to 8.
2018-03-25T15:08:04.343708+08:00 0 [Note] InnoDB: buffer pool 0 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:04.343747+08:00 0 [Note] InnoDB: buffer pool 1 : resizing with chunks 4 to 8.
2018-03-25T15:08:04.351134+08:00 325631 [Note] InnoDB: Requested to resize buffer pool. (new size: 8589934592 bytes)
2018-03-25T15:08:04.357650+08:00 0 [Note] InnoDB: buffer pool 1 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:04.357691+08:00 0 [Note] InnoDB: buffer pool 2 : resizing with chunks 4 to 8.
2018-03-25T15:08:04.371670+08:00 0 [Note] InnoDB: buffer pool 2 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:04.371716+08:00 0 [Note] InnoDB: buffer pool 3 : resizing with chunks 4 to 8.
2018-03-25T15:08:04.385639+08:00 0 [Note] InnoDB: buffer pool 3 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:04.385690+08:00 0 [Note] InnoDB: buffer pool 4 : resizing with chunks 4 to 8.
2018-03-25T15:08:05.573040+08:00 0 [Note] InnoDB: buffer pool 4 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:05.573100+08:00 0 [Note] InnoDB: buffer pool 5 : resizing with chunks 4 to 8.
2018-03-25T15:08:05.586931+08:00 0 [Note] InnoDB: buffer pool 5 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:05.586987+08:00 0 [Note] InnoDB: buffer pool 6 : resizing with chunks 4 to 8.
2018-03-25T15:08:05.600831+08:00 0 [Note] InnoDB: buffer pool 6 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:05.600876+08:00 0 [Note] InnoDB: buffer pool 7 : resizing with chunks 4 to 8.
2018-03-25T15:08:05.614575+08:00 0 [Note] InnoDB: buffer pool 7 : 4 chunks (32764 blocks) were added.
2018-03-25T15:08:05.614672+08:00 0 [Note] InnoDB: Completed to resize buffer pool from 4294967296 to 8589934592.
2018-03-25T15:08:05.614691+08:00 0 [Note] InnoDB: Re-enabled adaptive hash index.
2018-03-25T15:08:05.614704+08:00 0 [Note] InnoDB: Completed resizing buffer pool at 180325 15:08:05.

这个特性是最令众多MySQL DBA 期待的特性之一。以后线上动态扩容,缩容就无需做数据库切换了,间接增强了系统的稳定性和DBA的生活幸福感。当然本文中介绍的略显粗略。详细内容请参考《官方文档》

4.4 支持全局表空间

全局表空间可以被所有的数据库的表共享,而且相比于 file-per-table tablespaces. 使用共享表空间可以节约元数据方面的内存。(需要更深入的了解共享表空间 主要是大小 收缩问题)

代码语言:javascript
复制
mysql> CREATE TABLESPACE `youzan_com`
    -> ADD DATAFILE 'youzan_com.ibd' FILE_BLOCK_SIZE = 16k;
Query OK, 0 rows affected (0.02 sec)
mysql> use yang
Database changed
mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8 TABLESPACE youzan_com ;
Query OK, 0 rows affected (0.04 sec)
mysql> create database youzan default charset utf8;
Query OK, 1 row affected (0.02 sec)
mysql> use youzan
Database changed
mysql>
mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8 TABLESPACE youzan_com ;
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提供了如下升级方式解决这个问题: 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 新特性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 小结
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档