点击上方“Java面试题精选”,关注公众号

面试刷图,查缺补漏

>>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅

阶段汇总集合:一百期面试题汇总

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。

其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

这里简单总结一下这三者具有一定相关性的日志。

重做日志(redo log)

作用:

  • 确保事务的持久性。
  • 防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

内容:

  • 物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

什么时候产生:

  • 事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

什么时候释放:

  • 当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

对应的物理文件:

  • 默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2
  • innodb_log_group_home_dir 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。
  • innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2

关于文件的大小和数量,由一下两个参数配置

  • innodb_log_file_size 重做日志文件的大小。
  • innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1

其他:

  • 很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。
  • 之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

  • Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。
  • 每个事务提交时会将重做日志刷新到重做日志文件。
  • 当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。   因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

更多面试题,欢迎关注公众号 Java面试题精选

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。   这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

回滚日志(undo log)

作用:

  • 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

内容:

  • 逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

什么时候产生:

  • 事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性

什么时候释放:

  • 当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

对应的物理文件:MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数,如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

更多面试题,欢迎关注公众号 Java面试题精选

关于MySQL5.7之后的独立undo 表空间配置参数如下

  • innodb_undo_directory = /data/undospace/ --undo独立表空间的存放目录
  • innodb_undo_logs = 128 --回滚段为128KB
  • innodb_undo_tablespaces = 4 --指定有4个undo log文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

其他:

  • undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。
  • 默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。
  • 因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。
  • 因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

二进制日志(binlog):

作用:

  • 用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
  • 用于数据库的基于时间点的还原。

内容:

  • 逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。
  • 但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,
  • 也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。
  • 在使用mysqlbinlog解析binlog之后一些都会真相大白。
  • 因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。

什么时候产生:

  • 事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。
  • 这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。
  • 因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。
  • 这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

什么时候释放:

  • binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

对应的物理文件:

  • 配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。
  • 对于每个binlog日志文件,通过一个统一的index文件来组织。

其他:

二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同

  • 作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。
  • 内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句
  • 另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。
  • 恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的binlog

关于事务提交时,redo log和binlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用binlog进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

总结:

MySQL中,对于以上三种日志,每一种细化起来都可以够写一个章节的,这里粗略地总结了一下三种日志的一些特点和作用,以帮助理解MySQL中的事物以及事物背后的原理。

参考:《MySQL技术内幕 Innodb 存储引擎》

作者:MSSQL123
cnblogs.com/wy123/p/8365234.html

与其在网上拼命找题? 不如马上关注我们~

mysql 表空间收缩_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...相关推荐

  1. mysql 表空间收缩_mysql表碎片清理和表空间收缩

    mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式) OPTIMIZETABLE [tablename],当然这种方式只 ...

  2. mysql表空间大小_浅谈mysql中各种表空间(tablespaces)的概念

    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...

  3. mysql表空间满_怎么解决数据库表空间不足

    一.数据库表空间不足导致了,插入操作会报出conn.msg = ORA-01653: 表 *******表名字********无法通过 8192 (在表空间 USERS 中) 扩展 ORA-06512 ...

  4. 事物的开始和结束命令分别是什么_什么是事务事务中的提交和回滚是什么意思...

    展开全部 1.事务就是指准备要做的或e5a48de588b662616964757a686964616f31333431356631所做的事情,在计算机语言中是指访问并可能更新数据库中各种数据项的一个 ...

  5. mysql 表结构反转_一道经典的MySQL面试题,答案出现三次反转

    前几天偶然看到大家在讨论一道面试题,而且答案也不够统一,我感觉蛮有意思,在此就做一个解读,整个过程中确实会有几处反转. 我们先来看下题目: 一张表,里面有ID自增主键,当insert了17条记录之后, ...

  6. mysql表名备注_「备注」mysql添加备注信息 - seo实验室

    备注 前言 这连天有人问我一些mysql的备注信息,不得已还是写一遍博客吧 1.创建表的时候,添加表名备注和字段备注 CREATE TABLE `healerjean_comment` ( `id` ...

  7. mysql表空间过大_详解MySQL表空间以及ibdata1文件过大问题

    ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...

  8. mysql ibdata1 解析_详解MySQL表空间以及ibdata1文件过大问题

    ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...

  9. mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法

    一种通过zabbix监控mysql表空间的方法[ 技术领域: ][0001]本发明涉及计算机自动化运维与监控领域,具体地说是一种通过ZABBIX监控MYSQL表空间的方法.[ 背景技术: ][0002 ...

最新文章

  1. Arduino产生PWM的3种方法
  2. jupyter nootbook本地使用指南
  3. MongoDB限制与阈值
  4. linux3.4.2移植总结(s3c2440)
  5. Office开发程序集版本及部署问题
  6. 分布式系统关注点(21)——构建「易测试」系统的“六脉神剑”
  7. 汇编分析golang循环
  8. XP停止服务,共建网络安全大环境
  9. 终于可以和 QQ 彻底说再见了!
  10. 计算机动漫与游戏制作画画教学,科普下动漫制作必须会画画吗
  11. ArcMAP 设置图层透明度
  12. 新edge保持百度账号登录
  13. Unity3d和连接MySQL数据库实现登陆注册等功能
  14. 十二位计算机的使用方法,Win10专业版12个使用技巧汇总
  15. 大数据重塑未来金融监管方式
  16. 最大的商业价值来自给人自由--------------解放生产力与互联网用户分析之我见
  17. 使用JBE(Java Bytecode Editor)修改Java字节码
  18. 控制翻页c语言,阅读器多种翻页的设计与实现
  19. Java培训机构出来好找工作吗?
  20. 过拟合欠拟合模拟 || 深度学习 || Pytorch || 动手学深度学习11 || 跟李沐学AI

热门文章

  1. 版本信息文件、虚拟环境创建
  2. -webkit-font-smoothing
  3. 分类算法:决策树(C4.5)
  4. 自学习 与 无监督特征学习
  5. 使用友盟的社会化组件,发新浪微博的 error:redirect_uri_mismatch的解决方法
  6. 用投资的观点学习编程
  7. linux 禁用ipv6 方法
  8. putty 配置导出
  9. linux 用户身份与进程权限
  10. golang range 遍历 索引和值