insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控

https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cnblogs.com/MYSQLZOUQI/p/5602206.html https://yq.aliyun.com/articles/222

主从不一致性的3种可能原因
1、binlog format是不是row
2、session级关闭binlog
3、人工在slave修改数据
set sql_log_bin=0
session级别关闭binlog,有可能导致主从不一致
kill 实例很久都没有停下来,查看error log并发出来
kill -9
查看 show engine innodb status undo是否太大
查看三个表innodb_trx 、 innodb_locks 、 innodb_lock_waits
mysql5.7
innodb_status_output=1
innodb_status_output_locks=1
相当于开了mysql5.5 的innodb_lock_monitor
死锁
innodb_print_all_deadlocks=1
无法打印涉及死锁的两个sql的整个事务里的语句无法打印出来,只能打印sql
20课:InnoDB引擎
1、避免行溢出,每行平均长度最好不高于8KB,针对page size是16KB
2、5.6及以上版本,最好使用独立undo表空间
3、共享表空间初始化时稍微大一些,比如1GB
使用独立表空间设置
innodb_file_per_tables=1
4、不用compressed行格式,压缩带来性能有限,使用dynamic行格式
5、少用select * text、blob
6、innodb表最好使用自增类型列做主键
7、innodb_flush_log_at_trx_commit
0,事务提交时不将redo log buffer写入磁盘
1,事务提交时将redo log buffer写入磁盘
2,事务提交时仅将redo log buffer写入操作系统缓存
通常建议设置为1,并且设置sync_binlog=1,以保证数据可靠性
8、innodb_log_file_size ib_logfile* 一般设置为512MB – 4GB
purge 线程
删除辅助索引中不存在的记录
删除已被打了delete-marked标记的记录
删除不再需要的undo log
从5.6开始,将purge thread独立出来
--innodb_purge_threads = 1 5.6只能有一个,5.7可以设置多个
--innodb_max_purge_lag = 0
--innodb_purge_batch_size = 300
除非unpurge的list太大了,否则没必要调整,增大innodb_purge_batch_size
show engine innodb status里的History list length(unpurge的list)
select min(userid) from t 很慢 锁等待,等待delete会话提交事务,释放排他锁
select max(userid) from t 很快
背景事件:删除大量数据后
背景:删除大量旧数据后
delete from t where pkid<3000万 order by pkid
后续逐渐清理
max不影响
采用小步快跑
扫描history list,确认每个记录对应的事务版本号,在其他事务中,是否还需要被用到
innodb的purge过程
update_undo产生的日志会放到history list中,当这些旧版本无人访问时
需要进行清理操作
另外页面进行标记删除操作也需要从物理上清理掉
后台purge线程负责这些工作
具体过程
确认可见性(创建readview,类似基准点)
确认需要purge的记录(确认哪些是旧事务,可purge的)
执行purge
清理history list,释放undo segment
insert buffer/change buffer
作用是
将非唯一辅助索引上的IUD操作从随机I/O变成顺序I/O,提高I/O效率
工作机制
先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入
若不在,则先放入到一个Insert Buffer对象中
当读取辅助索引页到缓冲池,将insert buffer中的记录合并到辅助索引页
相关的2个选项:
--innodb_change_buffer_max_size 默认为 25%
--innodb_change_buffering 默认为all (insert\delete\purge\change\all\none)
show engine innodb status里查看下
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 1289, seg size 1291, 316623 merges
merged operations:
insert 249806, delete mark 1123127, delete 85482
--seg size:当前插入缓冲区的大小 1291*16KB
-- insert buffer的效果 = merges / (insert + delete mark + delete)= 316623 / (249806+1123127+85482)= 21.71%
-- size 1 => 正在使用的page
-- free list len 1289 => 空闲的page
-- seg size => size + (free list len + 1) = 1 + (1289 + 1) = 1291
double write buffer,双写
innodb存在partial write问题
目的/作用:保证数据写入的可靠性
防止数据页损坏,又无从修复
因为InnoDB有partial write问题
16K的页只写入了部分数据时发生crash
redo里记录的是逻辑操作,不是物理块,无法通过redo log恢复 crash recovery
操作系统的block是4KB,innodb页面是16KB,那么需要4次IO才能写入一个完整的页面
怎么解决partial write问题
双写,doublewrite
2个1M的空间,共2M(既有磁盘文件,也有内存空间)
页在写入时首先顺序地写入到doublewrite
然后再刷新回磁盘
double write
性能损失
double write写入是顺序的,性能损失很小
slave上可关闭
btrfs,zfs文件系统支持原子写,不用打开double write
ssd等支持原子写的存储设备不用打开double write
innodb_doublewrite=0
status
innodb_dblwr_pages_written
innodb_dblwr_writes
innodb_dblwr_pages_written:innodb_dblwr_writes=64:1(一次刷新64个脏页),当系统写入压力并不是很高时,应小于64:1
adaptive hash index(AHI)
目的:提高buffer pool的检索效率
buffer pool本身其实也是个B+树
O(B+Tree高度) vs O(1)
对热点buffer pool建立AHI,非持久化
只支持等值查询,比如:
idx_a_b(a,b)
WHERE a=xxx
WHERE a=xxx and b=xxx
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Hash table size 42499381, node heap has 68063 buffer(s)
1640.60 hash searches/s, 3709.46 non-hash searches/s
1640/(1640+3709) = 30.6%
innodb的crash recovery
通常的恢复做法:先redo、后undo
redo,redo结束后,server开始对外提供服务,后面过程放在后台线程继续工作
当实例从崩溃中恢复时,需要将活跃事务从undo中提取出来,对于active状态的事务直接回滚,对于prepare状态的事务,如果该事务对应的binlog已经记录,则提交,否则回滚事务
change buffer merge
purge
xa recover
加快crash recovery速度
升级到5.5以后版本
提供IO设备性能
适当调低innodb_max_dirty_pages_pct,50以下
设置innodb_flush_log_at_trx_commit=1,让每个事务尽快提交,避免有其他事务等待,产生大量undo,增加purge工作量
innodb重要参数
innodb_stats_on_metadata=0
执行show table status ,show index from xx 时是否更新统计信息
innodb监控
innodb_lock_table
innodb_lock_monitor
innodb_table_monitor
innodb_tablespace_monitor
sys schema
P_S、I_S、sys
3个系统视图
insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控的更多相关文章
- innodb double write buffer
两次写是innodb的一个重要特性,目的是为了保证在异常down机或者没电的情况下,保证数据的安全可靠.一次是往内存的double write buffer中写,一次是在刷共享表空间的连续128个页. ...
- Double write Buffer的配置
InnoDB和XtraDB使用称为doublewrite缓冲区的特殊功能来提供数据损坏的强大保证.想法是在写入数据文件之前将数据写入主表空间中的顺序日志.如果发生部分页面写入(换句话说,写入损坏),I ...
- 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式
Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- MYSQL的DOUBLE WRITE双写
期待未来超高速大容量的固态硬盘普及时,只需要CHECKPOINT,而不再需要各种各样的BUFFER,CACHE了 DOUBLE WRITE 在InnoDB将BP中的Dirty Page刷(flush) ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- SQLMAP-Tamper之较为通用的双写绕过
前言 21年省决赛的SQLITE注入就是用的双写绕过,当时是手搓代码打的,这几天想起来了,寻思着写个tamper试试. 一开始以为很简单,后来才发现有很多要注意的点,折磨了挺久. 等弄完才明白为什么s ...
- 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis ...
- nodeEE双写与分布式事务要点一二
数据库与缓存双写问题 计算机领域任何一个问题都可以通过增加一个抽象"层"来解决. 业务中为了减少热点数据不必要的db查询,往往会增加一层缓存来解决I/O性能.可是I/O多了一层也就 ...
随机推荐
- tcpdump抓包代码
tcpdump - tcp[:]=:]=0x4854 or tcp 抓出来的包可以导入wireshark分析 以上代码曾经在ios越狱机器上使用,用于抓包,具体也记不起来了 导入wireshark效果
- 简介Python中用于处理字符串的center()方法
简介Python中用于处理字符串的center()方法 这篇文章主要介绍了简介Python中用于处理字符串的center()方法,是Python入门中的基础知识,需要的朋友可以参考下 center() ...
- Delphi下Treeview控件基于节点编号的访问1
有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下: function GetGlobeNumCode(inNode:T ...
- C#反射回顾笔记
一 .反射概述 反射提供描述程序集.模块和类型的对象(Type 类型). 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问其字段和属性. 如果代码中 ...
- 【C# 开发技巧】如何防止程序多次运行
一.引言 最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c0 ...
- 数据结构与算法学习(二)——Master公式及其应用
本篇文章涉及公式,由于博客园没有很好的支持,建议移步我的CSDN博客和简书进行阅读. 1. Master公式是什么? 我们在解决算法问题时,经常会用到递归.递归在较难理解的同时,其算法的复杂度也不是很 ...
- 分布式消息通信之RabbitMQ_Note
目录 1. RabbitMQ 安装 2. RabbitMQ 应用场景,特性 3. 官网入门指引 4. RabbitMQ 工作模型 5. RabbitMQ 主要的几种交换机类型 6. Java API的 ...
- Java面试 - final、finally、finalize的区别?
final:用于声明属性, 方法和类,分别表示属性不可变.方法不可覆盖.被其修饰的类不可继承. finally:异常处理语句结构的一部分,表示总是执行. finalize:Object 类的一个方法, ...
- [转帖]Linux系列之SAR命令使用详解
Linux系列之SAR命令使用详解 sar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工 ...
- Android MTK6580 客制化关机充电动画
1.客制化关机充电图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/xxx 找到对应分辨率替换 2.调整显示图片位置.大小 ...