数据库日志


prtyaa
prtyaa 2023-12-28 15:59:41 63903
分类专栏: 资讯

事务的ACID 是基于日志实现和保证的,D持久性就是通过redo log日志文件来保证的,持久化嘛,和redis一样, A原子性 是通过undo

bin log是在server端的,而redo undo 是在存储引擎端的的、

Redo日志-innodb存储引擎的日志文件

  • 当发生数据修改的时候,innodb引擎会先将记录写到redo log中,并更新内存,此时更新就是完成了,同时innodb引擎会在合适的时机将记录操作到磁盘中
  • Redo log是固定大小的,是循环写的过程
  • 有了 Redo log之后,innodb就可以保证即使数据库发生异常重启后,之前的记录也不会丢失,叫做crash-safe

Undo log

  • 为了实现事务的原子性,在innodb存储引擎中,还用UndoLog实现多版本并发控制MVCC
  • 在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方就是Undo log),然后进行数据的修改。如果出现了错误或者用户执行了rollback,系统可以利用undo log中的备份数据恢复到事务开始之前的状态。

注意:undo log是逻辑日志,

  • 当delete一条记录时,undo log中会记录一条对应的insert记录
  • 当insert一条记录时,undo log中会记录一条对应的delete记录
  • 当update一条记录时,undo log中会记录一条相反的update记录

binlog--server端的日志文件

和redo区别:

1、redo是innodb独有的,binlog是所有引擎都可以使用的

2、redo是物理日志,记录的是在某个数据页上做了什么修改,binlog是逻辑日志,记录的是这个语句的原始逻辑

3、redo是循环写,空间会用完,binlog是可以追加写,不会覆盖之前的日志信息。

Binlog中会记录所有的逻辑,并且采用追加写的方式

一般在企业中db会有备份系统,可以定期执行备份,备份周期可以自己设置

恢复数据的过程:

  • 1、找到最近一次的全量备份数据
  • 2、从备份的时间点开始,将备份的binlog取出来,重放到要恢复的那个时刻

redo log 是什么?

一个固定大小,“循环写”的日志文件,记录的是物理日志——“在某个数据页上做了某个修改”。

binlog 是什么?

一个无限大小,“追加写”的日志文件,记录的是逻辑日志——“给 ID=2 这一行的 c 字段加1”。

redo log 和 binlog 有一个很大的区别就是,一个是循环写,一个是追加写。也就是说 redo log 只会记录未刷盘的日志,已经刷入磁盘的数据都会从 redo log 这个有限大小的日志文件里删除。binlog 是追加日志,保存的是全量的日志。

当数据库 crash 后,想要恢复未刷盘但已经写入 redo log 和 binlog 的数据到内存时,binlog 是无法恢复的。虽然 binlog 拥有全量的日志,但没有一个标志让 innoDB 判断哪些数据已经刷盘,哪些数据还没有。

举个栗子,binlog 记录了两条日志:

  1. 给 ID=2 这一行的 c 字段加1
  2. 给 ID=2 这一行的 c 字段加1

在记录1写入磁盘后,记录2未写入磁盘时,数据库 crash。重启后,只通过 binlog 数据库无法判断这两条记录哪条已经写入磁盘,哪条没有写入磁盘,不管是两条都恢复至内存,还是都不恢复,对 ID=2 这行数据来说,都不对。

但 redo log 不一样,只要刷入磁盘的数据,都会从 redo log 中抹掉,数据库重启后,直接把 redo log 中的数据都恢复至内存就可以了。这就是为什么 redo log 具有 crash-safe 的能力,而 binlog 不具备。

当数据库 crash 后,如何恢复未刷盘的数据到内存中?

根据 redo log 和 binlog 的两阶段提交,未持久化的数据分为几种情况:

  1. change buffer 写入,redo log 虽然做了 fsync 但未 commit,binlog 未 fsync 到磁盘,这部分数据丢失。
  2. change buffer 写入,redo log 做了fsync 但未 commit,binlog 已经 fsync 到磁盘,先从 binlog 恢复 redo log,再从 redo log 恢复 change buffer。
  3. change buffer 写入,redo log 和 binlog 都已经 fsync,直接从 redo log 里恢复。

执行流程是:

  • 1、执行器从引擎中找到数据,如果在内存中直接返回,如果不在内存中,查询后返回
  • 2、执行器拿到数据后会先修改数据,然后调用引擎接口重新写入数据
  • 3、引擎将数据更新到内存,同时写数据到redo log中,此时处于prepare阶段,并通过执行器执行完成,随时可以操作
  • 4、执行器生成这个操作的binlog
  • 5、执行器调用引擎的事务提交接口,引擎把刚刚写完的redo改成commit状态,更新完成

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31746
赞同 0
评论 0 条
prtyaaL1
粉丝 1 发表 2554 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1487
银河麒麟打印带有图像的文档时出错  1405
银河麒麟添加打印机时,出现“server-error-internal-error”  1194
统信操作系统各版本介绍  1116
统信桌面专业版【如何查询系统安装时间】  1114
统信桌面专业版【全盘安装UOS系统】介绍  1069
麒麟系统也能完整体验微信啦!  1026
统信【启动盘制作工具】使用介绍  672
统信桌面专业版【一个U盘做多个系统启动盘】的方法  616
信刻全自动档案蓝光光盘检测一体机  526
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!