说明:配置参数存放在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中的日志就没用了,可以被覆盖写掉。