innodb 核心配置参数介绍, 双一标准

说明:配置参数存放在my.cnf文件中,有需求可自定制。

# 表空间模式(即.ibd文件,存放了行数据,索引及LSN号。该文件成为独立表空间):

  参考:https://www.cnblogs.com/quzq/p/12833272.html

  innoda_file_per_table=1,1代表独立表空间,5.6版默认模式;0代表共享表空间,5.6之前的默认模式

  5.6版之前表空间没有独立出来,存放在ibdata1文件中。设为1后创建的表会在data目录中生成表名.ibd文件,

  设置为0后创建的表不会生成该文件,会把.ibd中的内容存放到ibdata1文件中。

# 存储引擎配置:

  default_storage_engine=innodb(5.6的默认引擎)

# 配置共享表空间文件个数和大小(即ibdata1文件,该文件成为共享表空间):

  参考:https://www.cnblogs.com/quzq/p/12833135.html

  innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend

  该配置通常在初始化之前配好,会生成两个文件

# 双一标准的其中一个(默认是1)

  innodb_flush_log_at_trx_commit=1,用于控制redo log buffer中数据写入磁盘redo log文件的。

  值1代表什么呢?(redo log buffer,data buffer poll, undo log buffer都是存在于mysql内存中的)

    mysql启动后会向操作系统申请专用的内存空间,配置为1代表在commit命令后会立即把redo log buffer

    递交到操作系统内存中,然后由操作系统再立即写入到磁盘的redo log文件中。

  值0代表每秒执行一次把redo log buffer递交到操作系统内存,操作系统内存也每秒往redo log中写入一次。

    因为是每秒一次,如果在1秒内发生大量的事务递交,突然宕机,会造成1秒间隔内发生的事务数据丢失

  值2代表每次commit后立即把redo log buffer数据递交到操作系统内存,然后操作系统每秒往redo log中写入一次

    缺点和0一样,只不过能好一点,如果只是mysql服务宕机的话,提交到操作系统内存的事务还不会丢失。

  补充:无论哪个值,redo log buffer递交到操作系统内存的日志都会包含所有,无论该事务是否commit.

# 双一表中的另一个

  sync_binlog=1    每次事务递交都立即把二进制日志刷写到磁盘。

  双一标准都是用来控制mysql内存数据刷写到磁盘的频率,一个用来控制redo log, 一个用来控制二进制日志的

  二进制日志相关参考:https://www.cnblogs.com/quzq/p/12866410.html

# 控制mysql内存中logs到磁盘的过程

  innodb_flush_method=o_direct或fsync或o_dsync, 控制的是redo log buffer和data buffer pool,过程如下:

  默认使用的是fsync模式,建议使用o_direct模式

  

   

  

 # 结合上两个参数给出个建议配置如下:

  1. 最高安全模式:

    innodb_flush_log_at_trx_commit=1

    innodb_flush_method=o_direct

  2. 最高性能模式(安全不是特别重要场景):

    innodb_flush_log_at_trx_commit=0

    innodb_flush_method=fsync

# 三个和redo日志设置有关的参数:

  1. innodb_log_buffer_size=16777216,  设置redo log buffer内存区的大小

  2. innodb_log_file_size=50331648, 设置redo log的两个文件大小

    参考: https://www.cnblogs.com/quzq/p/12833381.html

  3. innodb_log_files_in_group=3,控制redo log的文件数,默认是0和1两个文件

    参考:https://www.cnblogs.com/quzq/p/12833381.html

# 脏页刷写策略:

  innodb_max_dirty_pages_pct=75, 75为百分比,控制data buffer pool中脏页数据占比达到75%时自动触发CKPT

    和WAL机制把data buffer pool中的信息刷写到ibd文件中,当然日志也是优先于数据写入到redo log中的。

  补充:哪些场景会触发脏页数据写入ibd文件(CKPT)呢?

    1. CSR机制。 参考:https://www.cnblogs.com/quzq/p/12839958.html

    2. redo文件满了。通常redo log中的信息当脏页数据写回ibd后,redo log中的日志就没用了,可以被覆盖写掉。

原文地址:https://www.cnblogs.com/quzq/p/12864886.html