当前位置: 移动技术网 > IT编程>数据库>MSSQL > 2. SQL 更新语句如何执行

2. SQL 更新语句如何执行

2020年10月08日  | 移动技术网IT编程  | 我要评论
1. 重要的日志模块 redo logWAL,Write-Ahead Logging, 先写日志,再写磁盘。具体的话,当有一条记录要更新的时候,InnoDB引擎会先把记录写到redo log 里面,并更新内存。同时在系统空闲的时候,将这个操作记录更新到磁盘里。有了redo log ,InnoDB 可以保证数据库发生异常重启,之前提交的记录都不丢失,这个能力称为crash-safe。redolog 是InnoDB引擎的特有日志。2. 重要的日志模块 binlogServer层也有自己的日志,binl

1. 重要的日志模块 redo log

WAL,Write-Ahead Logging, 先写日志,再写磁盘。具体的话,当有一条记录要更新的时候,InnoDB引擎会先把记录写到redo log 里面,并更新内存。同时在系统空闲的时候,将这个操作记录更新到磁盘里。

有了redo log ,InnoDB 可以保证数据库发生异常重启,之前提交的记录都不丢失,这个能力称为crash-safe。

redolog 是InnoDB引擎的特有日志。

2. 重要的日志模块 binlog

Server层也有自己的日志,binlog。

3. redo log 和binlog的区别

  • redo log 是InnoDB引擎特有的;binlog 是MySQL的Server层实现的,所有引擎都可以使用
  • redo log 是物理日志,记录的是在某个数据页上的操作;binlog 是逻辑日志,记录的是这个语句的原始逻辑。

4. 执行器和InnoDB引擎在执行update语句时的流程

update T set c=c+1 where ID=2
  1. 执行器先找引擎去ID=2这一行。ID是主键,若果在内存中,直接返回;否则先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上1,得到新的一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录,记录到redo log,此时redolog 处于prepare状态,然后告知执行器执行完了,随时可以提交事务。
  4. 执行器生成操作的binlog,将binlog写入磁盘
  5. 执行器调用引擎的提交事务接口,引擎把刚写入的redo log 改成提交状态,更新完成。

redo log 将写入拆分成了两个步骤:prepare和commit,这就是两阶段提交。

5. 怎样将数据库恢复到半个月内任意一秒的状态

如果有一次误删表的操作,需要找回数据

  • 首先,找到最近的一次全量备份,从这备份恢复到临时库
  • 从备份的时间点开始,将备份的binlog依次取出来,重放到中午删除表之前的那个时刻
  • 这样临时库和误删之前的线上库一样了,然后把表数据从临时库取出来,按需恢复到线上库。

5. 两阶段提交

两阶段提交,将redolog 和 binlog 一起提交,让这两个状态保持逻辑上的一致。
若不采用两阶段提交,其中任何一个失败都会导致数据出错。

本文地址:https://blog.csdn.net/huatangzhithree/article/details/108962957

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网