本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • MySQL
  • MySQL基础教程(10)Redo log与Undo log

MySQL基础教程(10)Redo log与Undo log

发布:TangLu2020-1-4 11:39分类: MySQL 标签: mysql

一、MySQL常用存储引擎

存储引擎可以理解为是数据库自己的文件系统,不同类型的存储引擎有不同的特点。存储引擎位于表级别,也就是说可以为每张表设置不同的存储引擎进行使用。常见的存储引擎有MyISAM、InnoDB、Memory、TokuDB、CSV等。

· MyISAM:数据存放在.frm、.MYD、.MYI三种类型的文件中,可以直接拷贝表文件到其他数据库中进行使用。表级锁、不支持热备,最关键不支持事务,因此从MySQL 8.0开始对该引擎进行了淘汰。

· MEMROY:数据存放在内存中,不会持久化

· TokuDB:压缩比可以达到25倍,对数据的插入和删除速度也很快。适用于有大量插入或者删除操作的场景,如Zabbix

· InnoDB:MySQL 5.5版本以后默认的存储引擎。支持MVCC(多版本并发控制)、群集索引(聚簇索引)、事务、行级锁、热备。数据存放在.frm、.ibd两种类型的文件中,5.6开始默认会开启独立表空间,每张表都会有一个独立.ibd文件。由于InnoDB还依赖共享表空间文件ibdata1存放undo log,以及ib_logfile存放redo log,所以不能直接拷贝.ibd到其他数据库进行使用。

show engines  #查看当前MySQL所支持与默认的存储引擎

set global default_storage_engine=innodb  #在线修改全局配置

#写入到配置文件中的配置
[mysqld]
default_storage_engine=innodb


二、Redo log(事务重做日志)

1、Redo log作用

InnoDB引擎独有的物理级别日志,记录了数据页上所做的修改当MySQL遇到数据需要更新的时候,InnoDB会先把更新记录顺序写到redo log的buffer内存空间(这种也叫WAL日志先行机制)。由于内存速度远高于磁盘,此刻如果有客户端请求数据时会把内存里更新的数据返回给客户端。随后InnoDB会在合适的时机将这些脏页(内存页数据和磁盘页数据不一致的时候,内存页的数据就叫脏页)按照随机写的方式flush到磁盘,让内存和磁盘中的数据保持一致,成为干净页。如果一切正常会写入到binlog中传递给从库。当数据库异常重启需要crash-recovery时会通过Redo log将已经提交事务的更改写到数据文件(这也是为什么强烈建议配置双1参数的原因,保证了数据的安全,实现数据库宕机的自动恢复(crash-safe)。如果在写binlog之前数据库发生了崩溃(crash),此刻数据状态不满足两阶段提交,事务会被回滚。由于binlog还没写也不会传到从库。总结下来就是MySQL进行数据更新的时候会先修改buffer pool缓存、然后修改undo log、redo log buffer。当提交事务的时候一定会把redo log、binlog刷盘,最后完成redo log中的事务commit标记;最后IO线程把脏数据刷入磁盘。


2、flush脏页的几种场景

· 当Redo log写满时,系统会停止数据库所有更新操作,开始flush内存数据到磁盘,flush完成后Redo log继续滚动写入。此刻flush操作会让所有更新都阻塞,如果有监控的话,更新数基本为0

· 当系统内存不太够但又出现一个查询操作需要申请内存时也会触发flush操作。此刻如果需要淘汰的脏页太多也会影响服务性能。

· 当MySQL空闲时自动flush,默认每秒一次

· 停止MySQL服务时会自动flush内存中的数据到磁盘


3、Redo log参数配置项

innodb_flush_log_at_trx_commit=1 #redolog写入策略,双1参数之一。0表示不主动将redolog buffer落盘,而是依靠Innodb每秒刷新到磁盘,存在丢失一秒数据的风险;1表示每次事务提交时都将redo log刷到磁盘;2表示每次事务提交时把redo log写到系统缓存,由系统决定落盘时间,系统宕机的话会丢失部分数据
innodb_log_file_size=6G  #设置redo log文件大小,文件会自动命名为ib_logfile0~ib_logfileN,如果设置太小会导致数据库因为经常flush而间歇性性能下降
innodb_log_files_in_group=2  #设置redo log文件个数
innodb_log_group_home_dir=./  #设置redo log文件路径
# innodb_io_capacity=2000 #设置脏页刷新速度,单位为页。磁盘速度越快就设置越大,建议和磁盘IOPS一样
# innodb_flush_neighbors=0  #刷脏页时是否把数据页旁边的脏页也刷掉,1为一起刷,SSD磁盘建议为0,8.0开始默认为0

三、Undo log(事务回滚日志)

1、Undo log作用

Undo log记录了每个事务的反向操作,当数据库发生异常错误时可以根据Undo log回滚到事务之前的数据状态,保证了事务的原子性。另外MVCC特性也是通过Undo log来计算出历史版本的数据。Undo log会写入到ibdata和ibtmp文件中。当数据库重启进行crash-recovery时会通过Redo log将已经提交事务的更改写到数据文件,而还没有提交的就通过Undo log进行roll back。


2、undo log相关参数配置

innodb_data_home_dir = /data/mysql/  #共享表空间文件存放路径,文件名为ibdata1
innodb_data_file_path 	= ibdata1:1024M:autoextend  #共享表空间文件大小,可以写多个文件进行拆分


3、

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《MySQL基础教程(10)Redo log与Undo log
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-597.html  [生成短网址]

已有 0/380 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~