重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改
撤消日志:当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态
网上找到一些解说:以便以后自己参考
有两个概念:前滚与回退
比如某一时刻数据库DOWN机了,有两个事务,一个事务已经提交,另一个事务正在处理
数据库重启的时候就要根据日志进行前滚及回退,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。
redo--> undo-->datafile
insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据.
redo->每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件
undo->记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据
redo->记录所有操作,用于恢复(redo records all the database transaction used for recovery)
undo->记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback)
redo->已递交的事务,实例恢复时要写到数据文件去的
undo->未递交的事务.
redo的原因是:每次commit时,将数据的修改立即写到online
redo中,但是并不一定同时将该数据的修改写到数据文件中。因为该数据已经提交,但是只存在联机日志文件中,所以在恢复时需要将数据从联机日志文件中找
出来,重新应用一下,使已经更改数据在数据文件中也改过来!
undo的原因是:在oracle正常运行时,为了提高效率,加入用户还没有commit,但是空闲内存不多时,会由DBWR进程将脏块写入到数据
文件中,以便腾出宝贵的内存供其它进程使用。这就是需要UNDO的原因。因为还没有发出commit语句,但是oracle的dbwr进程已经将没有提交
的数据写到数据文件中去了。
undo 也是也是datafile, 可能dirty buffer 没有写回到磁盘里面去。
只有先redo apply 成功了,才能保证undo datafile 里面的东西都是正确的,然后才能rollback
做undo的目的是使系统恢复到系统崩溃前(关机前)的状态,再进行redo是保证系统的一致性.
不做undo,系统就不会知道之前的状态,redo就无从谈起
所以instance crash recovery 的时候总是先rollforward, 再rollback
undo
回退段中的数据是以“回退条目”方式存储。
回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据
在每一个回退段中oracle都为其维护一张“事务表”
在事务表中记录着与该回退段中所有回退条目相关的事务编号(事务SCN&回退条目)
redo
重做记录由一组“变更向量”组成。
每个变更变量中记录了事务对数据库中某个块所做的修改。
当用户提交一条commit语句时,LGWR进程会立刻将一条提交记录写入到重做日志文件中,然后再开始写入与该事务相关的重做信息。
#事务提交成功后,Oracle将为该事备生成一个系统变更码(SCN)。事务的SCN将同时记录在它的提交记录和重做记录中。
commit
提交事务前完成的工作:
·在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。
·在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。
·在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。
提交事务时完成的工作:
·在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。
·LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。
·Oracle服务进程释放事务所使用的所有记录锁与表锁。
·Oracle通知用户事务提交完成。
·Oracle将该事务标记为已完成。
rollback
回退事务完成的工作:
·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。
·Oracle服务进程释放事务所使用的所有锁
·Oracle通知事务回退成功。
·Oracle将该事务标记为已完成
举个例子:
insert into a(id) values(1);(redo)
这条记录是需要回滚的。
回滚的语句是delete from a where id = 1;(undo)
试想想看。如果没有做insert into a(id) values(1);(redo)
那么delete from a where id = 1;(undo)这句话就没有意义了。
现在看下正确的恢复:
先insert into a(id) values(1);(redo)
然后delete from a where id = 1;(undo)
系统就回到了原先的状态,没有这条记录了。
select member from V$logfile
分享到:
相关推荐
MySQL为什么需要binlog、redo log和undo log的知识点总结 MySQL数据库管理系统需要binlog、redo log和undo log三个重要的日志系统,以确保数据的一致性和持久性。下面是对这些日志系统的详细解释: 为什么需要分层...
MySQL数据库中有多种日志文件,其中最重要的三种是重做日志(redo log)、回滚日志(undo log)和二进制日志(binlog)。重做日志确保事务的持久性,回滚日志用于事务回滚,而二进制日志则用于数据复制和恢复。 1. ...
在本文中,我们讨论了 MySQL 事务日志机制的原理和实现,包括 undo log、redo log 和 binlog 三种日志机制的作用和原理。我们还讨论了 MySQL 事务日志机制的应用场景,包括数据备份、主从复制和事务回滚等。
总的来说,redo log和undo log是MySQL中保证事务ACID特性的核心组件。redo log确保了事务的持久性,即使在系统故障后也能恢复数据的一致性状态;而undo log则提供了事务的原子性,允许回滚到事务开始前的状态。理解...
MySQL数据库之undo log和redo log工作原理.png,这是一份图例,画图表示undo log和redo log的工作原理
MySQL数据库系统中有三种日志文件,即binlog、redo log和undo log。这三种日志文件是 MySQL 实现主从复制、持久化和回滚的关键。 一、binlog binlog是用于记录数据库表结构和表数据变更的二进制日志。它记录了...
当然,除了redo log之外,数据库还使用其他类型的日志来记录操作,例如undo log,它用于回滚事务,以及binary log,用于复制和备份。每种日志都有其特定的格式和用途,在数据库中扮演着重要的角色。而文章结尾提到的...
这就需要用到如`py_innodb_page_info`这样的工具,它为我们提供了一扇窗口,让我们可以深入到InnoDB存储引擎的底层,直观地理解日志(redo log和undo log)以及数据文件的工作方式。本文将详细介绍`py_innodb_page_...
undo日志是MySQL的事务日志,包括redo log和undo log,redo log提供前滚操作,undo log提供回滚操作。 在分布式事务背景下,Seata可以提供跨服务分布式事务解决方案,解决跨数据库和跨服务的事务问题。Seata的解决...
redo log和undo log是MySQL事务中用于保证数据一致性的关键机制。redo log记录了事务的所有修改操作,即使在事务提交之前系统崩溃,也能通过redo log中的记录来恢复已经进行的修改。如果事务正常提交,redo log会被...
在Oracle数据库的Real Application Clusters (RAC)环境中,REDO和UNDO管理扮演着至关重要的角色,确保数据的安全性、事务处理以及数据恢复。在RAC架构中,多个实例共享同一物理数据库,这就需要对REDO和UNDO管理进行...
总的来说,MySQL的事务处理机制确保了数据的安全性和一致性,通过redo log和undo log提供了故障恢复能力,并通过binlog支持主从复制。理解并熟练掌握这些概念对于管理和维护高可用性的MySQL数据库至关重要。
常见的存储引擎如InnoDB支持事务处理,提供了Redo Log和Undo Log功能。InnoDB的Redo Log记录了数据修改操作,确保在异常情况下能恢复数据,而Undo Log则用于实现事务的原子性和MVCC。 7. **Redo Log**: Redo Log...
2. **InnoDB事务与日志实现**:InnoDB存储引擎使用redo log和undo log保证事务的ACID特性。redo log记录数据页的修改,先写入内存buffer,然后写入磁盘,确保事务的持久性。undo log用于事务回滚和崩溃恢复,存储...
首先,`innodb_flush_log_at_trx_commit` 参数是 InnoDB 存储引擎特有的,它控制着事务日志(redo log 和 undo log)何时以及如何被刷新到磁盘上的 ib_logfile 文件。此参数有三个可选值: 1. 当设置为 0 时,...
通过以上对BufferPool、B+树索引、Explain工具、MVCC、Redo Log、Undo Log以及Binlog的介绍,我们可以了解到MySQL InnoDB存储引擎在处理数据缓存、索引优化、事务控制等方面的技术细节和实现原理。这些知识点对于...