首页 > MySQL与IO

MySQL与IO

         数据库作为存储系统,所有业务访问数据的操作都会转化为底层数据库系统的IO行为(缓存系统也可以当做是key-value的数据库),本文主要介绍访问mysql数据库的IO流程以及IO相关的参数。

一 MySQL 的文件

首先简单介绍一下MySQL的数据文件,MySQL 数据库包含如下几种文件类型:

数据文件 (datafile) 存放表中的具体数据的文件。 数据字典 记录数据库中所有innodb表的信息。

重做日志 (redolog) 记录数据库变更记录的文件,用于系统异常crash(掉电)后的恢复操作,可以配置多个比如 ib_logfile0、 ib_logfile1,

回滚日志 (undolog) 也存在于mysql 的ibdata文件,用户记录事务的回滚操作。

归档日志 (binlog) 事务提交之后,记录到归档日志中。

中继日志 (relaylog) 从master 获取到slave 的中转日志文件,sql_thread 则会应用relay log 

其他日志 slowlolg, errorlog, querylog

    对于以上文件的IO访问顺序可以分为顺序访问 比如binlog ,redolog ,relay log是顺序读写,datafile,ibdata file是随机读写,这些IO访问的特点决定了在os 配置磁盘信息时候,如何考虑分区 ,比如顺序写可以的log 可以放到SAS 盘 ,随机读写的数据文件可以放到ssd 或者fio 高性能的存储。

二 数据访问流程 数据库访问分为两种类型, 一种是读操作,另外一种是写操作。
1 读操作    
  create table t (
      id int not null primary key ,
      k1 int not null,
      data varchar(50),
      key ind_k1(k1)
     ) engine=innodb default charset=utf8;
    以 select * from tab where k1=1 ;为例
                                         
图-1 读操作的 IO 流程
1 查看缓存中是否存在id,  
2 如果有 则从内存中访问,否则要访问磁盘,  
3 并将索引数据存入内存,利用索引来访问数据,  
4 对于数据也会检查数据是否存在于内存,
5 如果没有则访问磁盘获取数据,读入内存。  
6 返回结果给用户。

2 写操作    
为了保证数据写入操作的安全性,数据库系统设置了 undo,redo  保护机制,避免因为os或者数据库系统异常导致的数据丢失或者不一致的异常情况发生。
    以 insert into t values(1,1,'shuiyi');为例                                   图-2 写操作的 IO 流程 我们假定数据在内存中,不考虑从磁盘中获取数据的情形。大致的写操作步骤:   
1 先写undo log    
2 在内存更新数据   
3 记录变更到redo log,prepare    
4 写入binlog   
5 redo log 第二阶段,commit     
6 返回给client  
如果有slave   
第4步之后 经过slave 服务线程 io_thread 写到从库的relay log ,再由sql thread 应用relay log 到从库中。

关于性能     
写undo redo log ,binlog的过程中都是顺序写,都会很快的完成,随机写操作,inset_buffer 功能
    对于非聚集类索引的插入和更新操作(5.5 版本及以上支持Update/Delete/Purge等操作的buffer功能),不是每一次都直接插入到索引页中,而是先插入到内存中。具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入插入缓冲区中,再以一定的频率和索引页合并,就可以将同一个索引页中的多个插入合并到一个IO操作中,改随机写为顺序写,大大提高写性能。
  关于数据安全,这是数据库写入的重点
          1,2,3  过程失败 就是事务失败,因为此时还未写入磁盘,对磁盘中的数据无影响,返回事务失败给client,从库也不会受到影响。     
4,5 过程失败的时候或者已经将写成功返回给客户,可以根据redo log 的记录来进行恢复,如果出现部分写失效 请参考《double write》     
mysql的写redo log的第一个阶段会把所有需要做的操作做完,记录数据变更,第二阶段的工作比较简单 ,只做事务提交确认。如果写入binlog 成功,而第二阶段失败,mysql 启动时也会将事务进行重做,最终更
新到磁盘中。     
5.5 +的 smei sync 可以更好的保障主从的事务一致性。  
三 文件访问方式    
IO 访问的方式分为两种顺序读写和随机读写, 在mysql 的io过程中可以以此来将数据库文件分类      
顺序读写:     
重做日志  ib_logfile*,binlog file      
随机读写      
innodb 表数据文件,ibdata文件。  
根据系统的访问类型,对硬件做如下分类  
读多 SSD+RAID  
写多 FIO(flashcache)  
容量密集 fio + flashcache  
由于随机io会严重降低系统的性能,在当前的硬件水平下,可以考虑选择奖数据库服务器配置ssd/fusionio。   
四 影响IO的参数和策略    
影响mysql io 的参数有很多个,这里罗列几个重要的参数。 
    innodb_buffer_pool_size    
该参数控制innodb 缓存大小,用于缓存应用访问的数据,推荐配置为系统可用内存的80%。    
binlog_cache_size    
该参数控制二进制日志缓冲大小,当事务还没有提交时,事务日志存放于cache,当遇到大事务cache不够用的时,mysql会把uncommitted的部分写入临时文件,等到committed的时候才会写入正式的持久化日志文件。     innodb_max_dirty_pages_pct    
该参数可以直接控制Dirty Page在BP中所占的比率,当dirty page 达到了该参数的阈值,就会触发MySQL 系统刷新数据到磁盘       
innodb_flush_log_at_trx_commit    
该参数确定日志文件何时write、flush。
为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.
为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
注意:  
由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”。    
sync_binlog    
sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。    
innodb_flush_method    
该参数控制日志或数据文件如何write、flush。可选的值为 fsync, o_dsync ,o_direct,littlesync,nosync  
fdatasync 模式:写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。  
O_DSYNC 模式:写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成  
O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲  
注意:关于mysql 和io相关的参数,并不是一成不变的,需要根据自身业务系统和硬件系统做相应调整,系统上线之前,测试出一个最佳值。
五 小结
    数据库的io是一个很复杂和细致的知识层面,涉及数据库层和OS层面的IO写入策略,也和硬件的配置有关,本文主要针对MySQL 层面做分析,可能分析的不够全面,请各位朋友指点。、
想要Java视频资料的请加   731661047 
六 参考文档
http://www.percona.com/doc/percona-server/5.6/scalability/innodb_io.html
http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/
原文链接:http://blog.itpub.net/22664653/viewspace-1146808/

转载于:https://www.cnblogs.com/maibaodexiaoer/p/8625983.html

更多相关:

  • 本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...

  • 我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...

  • 作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...

  • 这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...

  • 这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...

  • 一次手贱更新了上面这个驱动,结果: Fn+F2/F3不能控制亮度win+X弹出来的下面这个窗口“显示器亮度”不见了 电源选项里面底部“屏幕亮度”也不见了 我研究了三天,各种骚操作都试过了,最后找到解决方案: win+R 输入 devmgmt.msc 回车,按照下图操作,瞬间亮度恢复正常 ...

  • 第一种:需要刷新当前页面重复执行的操作——使用场景:刷点击率 、秒杀活动、抢沙发   //自动化循环操作方法 var doLoop = function (dom) {dom || (dom = document);//这里写循环操作的代码dom.querySelector("sel").innerHTML = "舒工的骚操作!!...

  • Ubuntu常用操作外观操作修改应用icon图标终端美化内存管理内存查询分区管理日志清理操作执行自动执行多条命令...

  • 文章目录前言工业级 LRU Cache1. 基本架构2. 基本操作2.1 insert 操作2.2 高并发下 insert 的一致性/性能 保证2.3 Lookup操作2.4 shard 对 cache Lookup 性能的影响2.4 Erase 操作2.5 内存维护3. 优化...

  • 最近利用vim做一些文本处理时 发现vim 支持的键盘宏是一个好东西啊,高效优雅得处理大量需要重复性操作的文本,让人爱不释手!!! 希望接下来对键盘宏的分享能够实际帮助到大家。 后文中描述的一些vim操作会汇集成指令字符串,方便大家参考。 1. 场景描述 在分享键盘宏之前,先看这样一个文本操作需求: 对如下文本增加ma...

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...