关于innodb mtr模块
mtr (mini-transaction)微事务
mtr作用
mtr模块主要保证物理操作的一致性和原子性
1 一致性:通过读写锁来保证
2 原子性:涉及到的物理更新,都记入redo日志
mtr何时使用
1 文件管理:innodb表空间以segment,extent,page的方式管理,segment,extent,page的申请释放,都会修改对应的控制信息。
如fseg_alloc_free_page_general 申请页
对表空间加锁
latch = fil_space_get_latch(space, &flags);
mtr_x_lock(latch, mtr);
fseg_alloc_free_page_low->fseg_alloc_free_page_low 写控制信息并记入redo, 部分代码如下
xdes_set_state(ret_descr, XDES_FSEG, mtr);
mlog_write_ull(ret_descr + XDES_ID, seg_id, mtr);
flst_add_last(seg_inode + FSEG_FREE,
ret_descr + XDES_FLST_NODE, mtr);
2 B树操作:(b树包括索引和insert buffer)
这里的读写锁有两种:btree lock,page lock
btree lock 为了防止B树分裂(不确定,还有些疑问?)
例如: 向聚集索引插入一行记录,row_ins_clust_index_entry_low
btree lock
mtr_s_lock(dict_index_get_lock(index), &mtr);
page lock
获取页 buf_page_get_gen
......
rw_lock_x_lock_inline(&(block->lock), 0, file, line);
......
mtr_memo_push(mtr, block, fix_type);
redo log
trx_undo_page_report_insert //先以redo log方式写入undo log
page_cur_insert_rec_write_log//写redo log
mtr中的锁
锁均为读写锁,原子操作完成后立即释放(mtr_commit),不需要事务结束时释放
遵守两阶段加锁协议,不会死锁。
mtr中redo log
mtr过程中的redo log会存入自己的动态数组mtr->log中,mtr_commit时将mtr->log刷入 redo log buffer中。
一些思考
1 redo log buffer的 block的大小为512,参见以下注释
/** The next value should be smaller or equal to the smallest sector size used
on any disk. A log block is required to be a portion of disk which is written
so that if the start and the end of a block get written to disk, then the
whole block gets written. This should be true even in most cases of a crash:
if this fails for a log block, then it is equivalent to a media failure in the
log. */ #define OS_FILE_LOG_BLOCK_SIZE 512
512 为普通磁盘的扇区大小,对于SSD来说扇区大小为4K
OS_FILE_LOG_BLOCK_SIZE 应设置为可调节参数,对SSD可以设为4096。如果不考虑binlog,可以一定程度上提升写redo的速度,加快commit。
经测试改为
#define OS_FILE_LOG_BLOCK_SIZE 4096
数据库可以正常使用
注:以上测试数据库需正常关闭,然后删除log file文件
2 代码优化
mtr_memo_pop_all 中有如下代码,这是一个O(n2)的查找遍历
offset = dyn_array_get_data_size(memo);
while (offset > 0) {
offset -= sizeof(mtr_memo_slot_t);
slot = static_cast<mtr_memo_slot_t*>(dyn_array_get_element(memo, offset));
mtr_memo_slot_release(mtr, slot);
}
其中dyn_array_get_element是一个遍历查找元素的过程。
改进后,是一个O(n)的遍历
element_size = sizeof(mtr_memo_slot_t);
block = dyn_array_get_first_block(memo);
while (block != NULL)
{
offset = dyn_block_get_used(block);
while (offset != 0) {
offset -= element_size;
slot = static_cast<mtr_memo_slot_t*>((void*)(block->data + offset));
mtr_memo_slot_release(mtr, slot);
}
ut_ad(offset == 0);
block = dyn_array_get_next_block(memo, block);
}
类似的代码出现在以下函数中
mtr_memo_contains (debug)
mtr_memo_pop_all
mtr_memo_note_modifications
mtr_memo_release
ps:以上分析基于5.6.10,最近看5.6.16这块已优化。
关于innodb mtr模块的更多相关文章
- 1009MySQL数据库InnoDB存储引擎Log漫游
00 – Undo Log Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atom ...
- MySQL · 引擎特性 · InnoDB 同步机制
前言 现代操作系统以及硬件基本都支持并发程序,而在并发程序设计中,各个进程或者线程需要对公共变量的访问加以制约,此外,不同的进程或者线程需要协同工作以完成特征的任务,这就需要一套完善的同步机制,在Li ...
- [转载]强烈推荐学习的blog
膜拜大牛 原文出处:http://hedengcheng.com/?p=676 ACM Queue (Architecting Tomorrow’s Computing) 网址:http://queu ...
- 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...
- MySQL InnoDB 日志管理机制中的MTR和日志刷盘
1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...
- 【转载】MySQL5.6.27 Release Note解读(innodb及复制模块)
新功能 问题描述(Bug #18871046, Bug #72811): 主要为了解决一个比较“古老”的MySQL在NUMA架构下的“swap insanity”问题,其表现为尽管为InnoDB ...
- zabbix 线路质量监控自定义python模块,集成ICMP/TCP/UDP探测,批量监控线路质量自定义阈值联动mtr保存线路故障日志并发送至noc邮箱
互联网故障一般表现为丢包和时延增大,持续性故障不难排查,难的是间歇性或凌晨故障,后者往往来不及等我们测试就已经恢复正常,得不到异常时的mtr无法判断故障点在哪里 故此有了根据丢包率和时延变换联动mtr ...
- MySQL · 引擎特性 · InnoDB Buffer Pool
前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...
- [小结]InnoDB体系结构及工作原理
参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...
随机推荐
- Elasticsearch5.3.1 IK分词,同义词/联想搜索设置
[大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置 原文地址:http://www.cnblogs.com/NextNight/p/6837407.html --题外话 ...
- IdentityServer-Setup and Overview
设置和概述 有两种方式创建一个IdentityServer 项目: 从零开始 使用Visual Studio的ASP.NET Identity模板 如果是从零开始,我们提供一序列的帮助及内存存储,所以 ...
- linux zip命令
linux zip 命令详解 功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串& ...
- win2003 远程连接限制
1.单击开始->运行,输入gpedit.msc,打开组策略编辑器,找到计算机配置 ->管理模版 -> Windows组件 ->终端服务.把限制连接数量的属性修改成我们需要的数字 ...
- LVS专题-(1)LVS基本介绍
LVS官方网站:http://www.linuxvirtualserver.org/zh/lvs1.html
- webpack4 自学笔记三(提取公用代码)
全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonT ...
- list双向链表容器(常用的方法总结)
特别注意,由于list对象的结点并不要求在一段连续的内存中,所以,对于迭代器,只能通过++或者--的操作将迭代器移动到后继或者前驱结点元素处.而不能对迭代器进行+n或者-n的操作,这点与vector等 ...
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; ...
- [android] 切换按钮-自定义控件-拖动效果
重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot ...
- Ubuntu安装完成后设置root密码
安装完ubuntu后没有默认的root密码,如果要设置root密码需要进行如下步骤: 1 sudo passwd 2 连续输入两次新密码