服务案例 大厂基本功 MySQL 三大日志 ( binlog、redo log 和 und 来源: 发表时间: 2022-07-04 来源:火狐体育最新官网登录入口 作者:火狐体育app

  错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志

  今天就来聊聊redo log(重做日志)、binlog(归档日志)、两阶段提交、undo log(回滚日志)。

  redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

  比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

  MySQL中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。

  后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。

  更新表数据的时候,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。

  然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。

  小贴士:每条 redo 记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成

  另外,InnoDB存储引擎有一个后台线秒,就会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用fsync刷盘。

  次的轮询操作,还有一种情况,当redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动刷盘。下面是不同刷盘策略的流程图。

  时, 只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失。如果事务执行期间

  挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。innodb_flush_log_at_trx_commit=2

  时, 只要事务提交成功,redo log buffer中的内容只写入文件系统缓存(page cache)。如果仅仅只是

  日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。比如可以配置为一组

  个文件,每个文件的大小是1GB,整个redo log日志文件组可以记录4G的内容。它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。

  加载日志文件组恢复数据时,会清空加载过的redo log记录,并把checkpoint后移更新。write pos

  追上checkpoint,表示日志文件组满了,这时候不能再写入新的redo log记录,MySQL得停下来,清空一些记录,把checkpoint推进一下。

  的作用和它的刷盘时机、存储形式。现在我们来思考一个问题:只要每次把修改后的数据页直接刷盘不就好了,还有

  ,刷盘比较耗时,可能就修改了数据页里的几Byte数据,有必要把完整的数据页刷盘吗?而且数据页刷盘是随机写,因为一个数据页对应的位置可能在硬盘文件的随机位置,所以性能是很差。

  ,一行记录可能就占几十Byte,只包含表空间号、数据页号、磁盘文件偏移 量、更新值,再加上是顺序写,所以刷盘速度很快。所以用

  形式记录修改内容,性能会远远超过刷数据页的方式,这也让数据库的并发能力更强。其实内存的数据页在一定时机也会刷盘,我们把这称为页合并,讲Buffer Pool

  是逻辑日志,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server层。不管用什么存储引擎,只要发生了表数据更新,都会产生

  数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

  语句,但是有个问题,update_time=now这里会获取当前系统时间,直接执行会导致与原库的数据不一致。为了解决这种问题,我们需要指定为

  ,这样可以为数据库的恢复与同步带来更好的可靠性。但是这种格式,需要更大的容量来记录,比较占用空间,恢复与同步时会更消耗

  SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。写入机制

  不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache。我们可以通过

  参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。binlog

  ,表示每次提交事务都会执行fsync,就如同binlog 日志刷盘流程一样。最后还有一种折中方式,可以设置为

  瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。同样的,如果机器宕机,会丢失最近

  与binlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的写入时机不一样。

  没写完就异常,这时候binlog里面没有对应的修改记录。因此,之后用binlog日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而原库因为redo log日志恢复,这一行c值是1,最终数据不一致。

  binlog时发生异常也不会有影响,因为MySQL根据redo log日志恢复数据时,发现redo log还处于prepare阶段,并且没有对应binlog日志,就会回滚该事务。

  是处于prepare阶段,但是能通过事务id找到对应的binlog日志,所以MySQL认为是完整的,就会提交事务恢复数据。undo log

  原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚

  回滚日志(undo log)实现的,所有事务进行的修改都会先先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用回滚日志

  的实现依赖于:隐藏字段、Read View、undo log。在内部实现中,InnoDB通过数据行的DB_TRX_ID和Read View来判断数据的可见性,如不可见,则通过数据行的DB_ROLL_PTR找到undo log中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建

  数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。作者:

  工具、资源和精选技术文章,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗

上一篇:内存卡里的照片显示已损坏不能预览这种情况还能恢复吗? 下一篇:万兴恢复专家:Wondershare Recoverit windows 中文
关注我们
©2022 火狐体育最新登录网址_官网app入口 京公网安备110177777720125 火狐体育最新登录网址|火狐体育app