1.1innodb核心参数讲解:
InnoDB Buffer Pool:
innodb_buffer_pool_size ## MySQL中最大的内存结构,设置建议在百分之50-75
innodb_buffer_pool_chunk_size ##分配单元的大小,默认就好
innodb_buffer_pool_instances ##可以给内存分为几个实例,可以尝试设置一些参数,调解内存的争用
show global status like ‘%innodb%wait%’; ##要具体真对每个服务器配置,进行压测,看平均IO延时,然后取得当前最佳值。如歌 wait_free这个参数里面有值,就代表现在的内存不够用。
redo-log:
innodb_log_buffer_size=33554432 ##磁盘文件大小 512M到4G左右
innodb_log_file_size ##log大小redo日志文件的大小。
innodb_log_files_in_group
innodb_log_group_home_dir
mysql> show variables like ‘%log_file%’;
+—————————————-+——————————————————+
| Variable_name | Value |
+—————————————-+——————————————————+
| general_log_file | /data/3306/data/localhost.log |
| innodb_log_file_size | 50331648 | ##单个大小
| innodb_log_files_in_group | 2 | ##组数
| slow_query_log_file | /data/3306/data/localhost-slow.log |
+—————————————-+——————————————————+
重启生效:
[root@db01 data]# /etc/init.d/mysqld restart
show global status like ‘%innodb%log%’;
change buffer:
innodb_change_buffer_max_size 默认25% 辅助索引的内存缓冲区,最多设置innodb_buffer_pool大小的50%
表空间:
innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend ##ibdat1这个文件,可以分配多个,每个是100M autoextend自动添加ibdata1
innodb_file_per_table=1
innodb_undo_tablespaces; ——>3-5个 #打开独立undo模式,并设置undo的个数。
innodb_max_undo_log_size; #undo日志的大小,默认1G。
innodb_undo_log_truncate; #开启undo自动回收的机制(undo_purge)。
innodb_purge_rseg_truncate_frequency; #触发自动回收的条件,单位是检测次数。
innodb_undo_directory ##undo存放的位置
innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:128M:autoextend:max:500M
innodb_io_capacity ##脏页刷新的数量
innodb_io_capacity_max ##脏页刷新最大的数量
innodb_max_dirty_pages_pct ##脏页达到百分之90进行刷新到磁盘
transaction_isolation=RC\RR ##一般互联网使用RC级别就可以了,可以减少锁的争用
innodb_lock_wait_timeout=10 ##行级锁超时,时间
innodb_flush_log_at_trx_commit=0/1/2 ## redo日志文件刷新策略
mysql 双1特性 redo日志刷新参数为1:
在每次事务提交都会进行刷盘,从内存,到内存缓冲区,立即刷新到磁盘,只有他落盘了才能证明commit成功提交了 1这个参数比较安全
redo日志刷新参数为2:
每次事务提交也会让内存缓冲区进行日志的刷新,每秒将内存缓冲区里面的数据写入到磁盘当中,这个有风险如果出现了宕机,会出现秒级别数据的丢失
1/2对比:
1只要数据提交成功了redo日志一定在磁盘当中足够的安全,会影响事务的并发量。
2只要刷新到内存缓冲区当中就认为提交成功了,可以支持很高的并发。
0每秒刷新到内存缓冲区,在以每秒的速度刷新到磁盘,也可能造成数据的丢失。
innodb_flush_method=o_direct/fsync ## 控制刷新的模式(redo日志,数据脏页)
o_direct:
在刷新数据页的时候,直接进行刷新到磁盘跳过内存缓冲区,redo日志进行落盘时,先刷新到内存缓冲区,在刷新到磁盘这样可以有效的减少磁盘IO,也可以减少内存缓冲区的争用。
fsync:
在刷新数据页的时候,先刷新到内存缓冲区,在刷新到磁盘 进行异步刷新,数据页数量很大时,会占用很多内存缓冲区会导致内存缓冲区不够用,可能会出现oom内存溢出的现象。
mysql> interactive_timeout ##交互式登录连接超时等待参数
mysql> wait_timeout ##非交互连接超时,连接超时 2880秒会进行超时断开,推荐设置7200秒
mysql> lock_wait_timeout ##MDL锁等待,默认是一年 推荐设置600秒十分钟
mysql> innodb_lock_wait_timeout ##行锁等待,行锁记录锁,gap,都会有超时推荐设置为10秒
扩展:Mini-TRansaction(MTR)
innodb_lock_wait_timeout=10
– 定义
• mini-transaction不属于事务;InnoDB内部使用
• 对于InnoDB内所有page的访问(I/U/D/S),都需要mini-transaction支持
– 功能
• 访问page,对page加latch (只读访问:S latch;写访问:X latch)
• 修改page,写redo日志 (mtr本地缓存)
• page操作结束,提交mini-transaction (非事务提交)
– 将redo日志写入log buffer
– 将脏页加入Flush List链表
– 释放页面上的 S/X latch
– 总结
• mini-transaction,保证单page操作的原子性(读/写单一page)
• mini-transaction,保证多pages操作的原子性(索引SMO/记录链出,多pages访问的原子性)
