MySQL5.7版本新特性(三)

第三章InnoDB引擎增强

一、支持缓冲池大小在线变更

MySQL5.7之前
要变更innodb_buffer_pool大小必须更改my.cnf文件后重启数据库服务器。在生产环境中要重启数据库服务器几乎是不可能的,除非有一些特殊的维护窗口,否则我们很难去重启数据库服务器。
MySQL5.7之后
Innodb_buffer_pool_size变为动态参数,可以在线调整innodb缓冲池的大小。

首先我们来看一下innodb_buffer提供了哪些参数。

1.png

2.png

可以看到,innodb_buffer_pool的大小是以chunk为单位的,每次调整一个chunk,它的默认大小是134217728个字节,换算成MB就是128MB,我们在调整缓冲池大小的时候,一定要是128MB的倍数。

3.png

Innodb_buffer_pool_instances的值为4,就是说我们要把innodb的缓冲池分成4份。如果遇到这种参数的话,缓冲池的大小就是chunk的大小乘以实例的数量的倍数。那么以此时的情况为例,我们缓冲池的大小就要是128MB*4的倍数,我们可以缓冲池调整为1024MB或2048MB,只要是512MB的倍数就可以了。而如果不是512MB的倍数,它也会自动调整为512MB的倍数。

我们在重设缓冲池的时候,可能会影响到一些事务的运行,所以如果我们有重设缓冲池的需求的话,一定要赶在一个数量比较小的时候,最好是在凌晨,来进行innoDB缓冲池大小的变更。

二、增加innodb_buffer_pool导入导出功能
对于一个繁忙的数据库系统来说,每次服务器的重启都会涉及到一个温机时间的概念,在服务器重启之前,它的所有数据基本上都是保存在内存中的,这时的读写效率是相当高的。一旦这样的数据库不小心重启了,那存在内存中的数据就会被清空,在数据库温机之前,也就是说在把我们需要访问的数据装到内存之前,数据库的执行效率会大大的下降。所以说在MySQL5.7版本之前,我们要重启数据库服务器,大多数DBA都会对数据库进行温机的操作,也就是人为的把一些经常要访问的热数据装载在内存中。而在MySQL5.7之后,为了避免这种温机操作所带来的时间和影响,特意增加了对缓冲池进行导入导出的功能,这个功能允许DBA把一定比例的缓冲池中的数据导出到磁盘中进行备份,避免在数据库重启之后或者在需要的时候把备份好的缓冲池重新装载在内存中,这个功能是通过下面这些参数来实现的。

buffer_pool提供了dump和load等这些参数,dump_at_shutdown和load_at_startup都是on的状态,这两个数据决定了我们的数据库在宕机和重启的时候要导出及导入相关的常用执行数据。而导出多少呢,则是由dump_pct这个变量来决定的,这些变量决定了导出或者导入的缓冲池大小的百分比,默认的参数是25,也就是说它会默认的把最热的25%的数据导出到磁盘上,并且在启动的时候会把这些数据装载在内存中。

innodb_buffer_pool_filename是我们要导出的文件名,默认的是ib_buffer_pool。

4.png

5.png

现在我们来做一个实验,在data目录下,存在着ib_buffer_pool这么一个文件,修改时间是10月23日的20:35。

6.png

如果我们人为导出会是什么样子的呢?

7.png

8.png

9.png

这时我们再来看,ib_buffer_pool这个文件的修改时间变为了10月24日的15:20,也就是说我们刚刚进行了innodb_buffer的导出操作。

10.png

这就方便了DBA在需要的时候,比如说一旦需要对数据库的数据进行批量操作,在操作之前,我们可以把缓冲数据导出来,而批量操作之后,由于已经把大量的不需要的那些老数据装载到了内存中,这时就可以使用innodb的load的功能,把之前备份的热数据装载到内存中。

11.png

12.png

三、支持innodb表建立表空间
MySQL5.7之前
具有系统表空间,即可以为每个表建立一个独立的表空间。
MySQL5.7之后
支持CREATE TABLESPACE语法为一个表或多个表建立共用的表空间。

下面我们来建立一个表空间。

13.png

这时候数据库中就多了ts1这个表空间。

14.png

当然了,我们也可以指定不同的目录来建立表空间,有时候innodb的表空间的建立不一定要在数据目录中,也可以在其他的目录中,但是一定要注意如果我们不建立在数据本身的目录中,也不要建立在数据目录下的子目录中,因为它的子目录通常是一个数据库的名字。

下面我们来利用这个表空间来建立一个表。

15.png

16.png

我们就可以看到t2使用的是ts1这个表空间,也就是刚刚建立的那个公用表空间。

那么使用公用表空间有什么优点呢?首先,公用表空间也是一个空白表空间,它可以被一个表或多个表所共享。其次,innodb放在公用表空间的表要比放在独立表空间的表更加节约内存。另外,公用表空间的文件可以不放在数据目录下。

当然它也有一些缺点,比如说它同系统表空间一样,不能使用DROP TABLE或TRUNCATE TABLE这样的语句对表空间进行回收。大家知道,系统表空间的回收是一个非常让人头疼的问题,可以说如果我们要使用通用表空间的话,也应该注意到一个问题,不能简单的回收磁盘空间。而如果每个表是使用独立表空间的话,当这个表被DROP或者TRUNCATE的时候,我们就可以非常容易的收回此磁盘空间。

Last modification:May 24th, 2019 at 10:09 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment