什么是重做?
- 重做日志包含所有数据产生的历史改变记录.
- 重做日志目的是保证数据的安全,如果数据因特殊原因没有写到磁盘上,可以通过重做日志来恢复.
- 重做日志文件通常用于
- 恢复(实例恢复和介质恢复)
- 日志挖掘:可以通过oracle工具分析日志里面的内容
- 流:通过分析redo,从redo获取实时数据,应用到远程数据库.
- 数据库产生的每个改动:
- 写入数据库缓存之前,先写入重做日志--内存
- 写入数据文件之前先写入日志文件 ----数据文件
- 内存里操作,重做日志的内存区叫Redo buffer
- 当提交后,日志缓冲被刷入重做文件里.还有其他触发条件.
redo有2种
- undo产生的redo
- 数据块本身产生的redo
REDO写入过程 轮询 从上到下写,第一个写完后就写第二个,第二个写完后就写第三个,第三个写满后就写第一个.如果第一个还没有写入到磁盘,此时会报错,不允许覆盖. |
REDO-- 日志组 DISK A DISK B GROUP1里面有2个redo log,作用是冗余. LGWR同时写入一个组的log文件中.. |
REDO 和归档 LGWR写第一个组,第一个组写完后,就会写第二个组,然后ARCH会将第一个组归档成一个归档文件. |
REDO 的内容 ---改变向量 redo的内容并不是sql语句,他是放的一些改变,叫改变向量. 数据库恢复的时候并不是执行sql语句,而是一个物理的过程,是一个数据块的覆盖.是改变数据块的大小. 创建2个表 SQL> create table t1(x char(1)); SQL> create table t2(x char(2000)); 获取当前会话的sid: SQL> select distinct sid from v$mystat; 开三个会话 SQL> select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name=‘redo size‘ and sid in(475,241); 表1中字符长度为1,表2长度为2000,所以他产生的redo更多一些. 所以redo里面保存的不是sql语句,也不是插入的数据值,只是和数据块改变的大小/多少有关系. SQL> create table t1(x char(1)); Table created. SQL> create table t2(x char(2000)); Table created. SQL> select distinct sid from v$mystat; SID ---------- 475 SQL> select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name=‘redo size‘ and sid in(475,241); SID NAME ---------- ---------------------------------------------------------------- VALUE ---------- 241 redo size 0 475 redo size 27280 SQL> col name for a10; SQL> select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name=‘redo size‘ and sid in(475,241); SID NAME VALUE ---------- ---------- ---------- 241 redo size 0 475 redo size 27280 这两个会哈的redo size不一样大,我们quit退出,重新进一下 SQL> select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name=‘redo size‘ and sid in(475,241); SID NAME VALUE ---------- ---------- ---------- 241 redo size 0 475 redo size 0 同时向2张表插入数据 SQL> select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name=‘redo size‘ and sid in(475,241); SID NAME VALUE ---------- ---------- ---------- 241 redo size 2668 475 redo size 672 |
REDO --undo 的redo |