MySQL ( MGR ) 04-MYSQL5.7 InnoDB

2021-02-03  本文已影响0人  轻飘飘D
  1. innodb_buffer_pool_size
这个是Innodb最重要的参数,和MyISAM的key_buffer_size有相似之处,但也是有差别的。
这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。
该参数分配内存的原则:
这个参数默认分配只有8M,可以说是非常小的一个值。如果是一个专用DB服务器,那么他可以占到内存的70%-80%。
这个参数不能动态更改,所以分配需多考虑。分配过大,会使Swap占用过多,致使Mysql的查询特慢。
如果你的数据比较小,那么可分配是你的数据大小+10%左右做为这个参数的值。
例如:数据大小为50M,那么给这个值分配innodb_buffer_pool_size=64M
设置方法,在my.cnf文件里:
innodb_buffer_pool_size=2048M or 2G

在Mysql5.7版本之前,调整innodb_buffer_pool_size大小必须在my.cnf配置里修改,
然后重启mysql进程才可以生效。如今到了Mysql5.7版本,就可以直接动态调整这个参数(重启后依然读取my.cnf的配置值)

需要注意的地方:
在调整innodb_buffer_pool_size 期间,用户的请求将会阻塞,直到调整完毕,
所以请勿在白天调整,在凌晨3-4点低峰期调整。
调整时,内部把数据页移动到一个新的位置,单位是块。如果想增加移动的速度,
需要调整innodb_buffer_pool_chunk_size参数的大小,默认是128M。
说明: 2147483648 /1024*1024=2048M

root@127.0.0.1:(none) [03:38:23] 10 SQL->SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
|                2147483648 |
+---------------------------+

root@127.0.0.1:(none) [03:38:26] 11 SQL->SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
|                       134217728 |
+---------------------------------+

root@127.0.0.1:(none) [03:38:38] 12 SQL->select @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
|                              8 |
+--------------------------------+

监控Buffer Pool调整进程
root@127.0.0.1:(none) [03:52:59] 3 SQL-> 
SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_buffer_pool_resize_status |       |
+----------------------------------+-------+

root@127.0.0.1:(none) [03:53:19] 4 SQL->
root@127.0.0.1:(none) [03:53:20] 5 SQL->SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
|                2147483648 |
+---------------------------+

#因为 innodb_buffer_pool_instances=8 * innodb_buffer_pool_chunk_size=128M 结果为 1G
#故 innodb_buffer_pool_size 必须为 1G的整数倍(以下配置为2.5,但实际是3G)
root@127.0.0.1:(none) [03:53:37] 8 SQL->SET GLOBAL innodb_buffer_pool_size=2684354560;

root@127.0.0.1:(none) [03:57:03] 9 SQL->SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
|                3221225472 |
+---------------------------+

root@127.0.0.1:(none) [03:57:18] 10 SQL->SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+----------------------------------------------------+
| Variable_name                    | Value                                              |
+----------------------------------+----------------------------------------------------+
| Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 210131 15:57:03. |
+----------------------------------+----------------------------------------------------+


innodb_buffer_pool_chunk_size的大小,计算公式是innodb_buffer_pool_size/innodb_buffer_pool_instances
比如现在初始化innodb_buffer_pool_size为2G,innodb_buffer_pool_instances实例为8,innodb_buffer_pool_chunk_size设置为1G,那么会自动把innodb_buffer_pool_chunk_size 1G调整为256M.

[root@xag200 ~]#
mysqld --innodb_buffer_pool_size=2147483648 --innodb_buffer_pool_instances=8 --innodb_buffer_pool_chunk_size=1073741824;

root@127.0.0.1:(none) [03:45:07] 1 SQL->SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
|                2147483648 |
+---------------------------+

root@127.0.0.1:(none) [03:45:27] 2 SQL->SELECT @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
|                              8 |
+--------------------------------+

root@127.0.0.1:(none) [03:45:37] 3 SQL->SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
|                       268435456 |
+---------------------------------+
  1. innodb_additional_mem_pool_size
用来存放Innodb的内部目录,这个值不用分配太大,系统可以自动调。通常设置16M够用了,如果表比较多,可以适当的增大。
设置方法,在my.cnf文件里:
innodb_additional_mem_pool_size = 16M
  1. 关于日志方面
    3.1 innodb_log_file_size
作用:指定在一个日志组中,每个log的大小。
结合innodb_buffer_pool_size设置其大小,25%-100%。避免不需要的刷新。
注意:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。
一般取256M可以兼顾性能和recovery的速度。
分配原则:几个日志成员大小加起来差不多和你的innodb_buffer_pool_size相等。上限为每个日志上限大小为4G.
一般控制在几个Log文件相加大小在2G以内为佳。具体情况还需要看你的事务大小,数据大小为依据。
说明:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。
设置方法:在my.cnf文件里:
innodb_log_file_size = 256M

3.2 innodb_log_files_in_group

作用:指定你有几个日值组。
分配原则: 一般我们可以用2-3个日志组。默认为两个。
设置方法:在my.cnf文件里:
innodb_log_files_in_group=3

3.3 innodb_log_buffer_size:

作用:事务在内存中的缓冲,也就是日志缓冲区的大小, 默认设置即可,具有大量事务的可以考虑设置为16M。
如果这个值增长过快,可以适当的增加innodb_log_buffer_size
另外如果你需要处理大量的TEXT,或是BLOB字段,可以考虑增加这个参数的值。
设置方法:在my.cnf文件里:
innodb_log_buffer_size=3M

3.4 innodb_flush_log_at_trx_commit

作用:控制事务的提交方式,也就是控制log的刷新到磁盘的方式。
分配原则:这个参数只有3个值(0,1,2).默认为1,性能更高的可以设置为0或是2,
这样可以适当的减少磁盘IO(但会丢失一秒钟的事务。),游戏库的MySQL建议设置为0。主库请不要更改了。
其中:
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,
但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;
1:(默认为1)在每次事务提交的时候将logbuffer 中的数据都会写入到log file,
同时也会触发文件系统到磁盘的同步;
2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。
此外,每秒会有一次文件系统到磁盘同步操作。
说明:
这个参数的设置对Innodb的性能有很大的影响,所以在这里给多说明一下。
当这个值为1时:innodb 的事务LOG在每次提交后写入日值文件,并对日值做刷新到磁盘。这个可以做到不丢任何一个事务。
当这个值为2时:在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新,
在对日志文件的刷新在值为2的情况也每秒发生一次。但需要注意的是,由于进程调用方面的问题,并不能保证每秒100%的发生。
从而在性能上是最快的。但操作系统崩溃或掉电才会删除最后一秒的事务。
当这个值为0时:日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,
但是在一个事务提交不做任何操作。mysqld进程的崩溃会删除崩溃前最后一秒的事务。

从以上分析,当这个值不为1时,可以取得较好的性能,
但遇到异常会有损失,所以需要根据自已的情况去衡量。
设置方法:在my.cnf文件里:
innodb_flush_logs_at_trx_commit=1
  1. 文件IO分配,空间占用方面

4.1 innodb_file_per_table

作用:使每个Innodb的表,有自已独立的表空间。如删除文件后可以回收那部分空间。
默认是关闭的,建议打开(innodb_file_per_table=1)
分配原则:只有使用不使用。但DB还需要有一个公共的表空间。
设置方法:在my.cnf文件里:
innodb_file_per_table=1

4.2 innodb_file_io_threads

作用:文件读写IO数,这个参数只在Windows上起作用。在Linux上只会等于4,默认即可!
设置方法:在my.cnf文件里:
innodb_file_io_threads=4

4.3 innodb_open_files

作用:限制Innodb能打开的表的数据。
分配原则:这个值默认是300。如果库里的表特别多的情况,可以适当增大为1000。innodb_open_files的大小对InnoDB效率的影响比较小。但是在InnoDBcrash的情况下,innodb_open_files设置过小会影响recovery的效率。所以用InnoDB的时候还是把innodb_open_files放大一些比较合适。
设置方法:在my.cnf文件里:
innodb_open_files=800

4.4 innodb_data_file_path

指定表数据和索引存储的空间,可以是一个或者多个文件。最后一个数据文件必须是自动扩充的,
也只有最后一个文件允许自动扩充。这样,当空间用完后,自动扩充数据文件就会自动增长(以8MB为单位)以容纳额外的数据。
例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend 两个数据文件放在不同的磁盘上。
数据首先放在ibdata1 中,当达到900M以后,数据就放在ibdata2中。
设置方法,在my.cnf文件里:
innodb_data_file_path =ibdata1:1G;ibdata2:1G;ibdata3:1G1G:autoextend

4.5 innodb_data_home_dir

放置表空间数据的目录,默认在mysql的数据目录,设置到和MySQL安装文件不同的分区可以提高性能。
设置方法,在my.cnf文件里:(比如mysql的数据目录是/data/mysql/data,这里可以设置到不通的分区/home/mysql下)
innodb_data_home_dir = /home/mysql
上一篇下一篇

猜你喜欢

热点阅读