oracle世界有3种数据:undo,redo和data
 
redo日志的作用:
1.记录oracle数据库的变化
2.可以避免数据提交后直接写入数据文件
3.实例恢复和介质恢复       --这里是两种恢复,要搞清楚
 
redo是按照线程来组织的
redo机制是私有的
rac中,redo是共享的
借助redo,进行数据前滚
不管怎么回复,首先是redo,redo完了才是undo
 
redo记录了数据库的  所有历史变更,不包含参数文件和控制文件的变更
因为参数文件是启动数据库,先是nomount启动参数文件,参数文件定位控制文件,控制文件才open数据库
控制文件以后才是redo,所以说redo是在他们之后
 
dataguard是容灾,就是通过redo来实现的
也可以通过redo归档以后产生的日志做dg
所以oracle的 方方面面都用到了redo
 
redo 日志文件的工作方式:
1.按顺序循环写的方式
2.写入下一组的过程称为  日志切换
3.切换时发生 检查点过程,检查点就是把信息同时写入到控制文件
 
日志切换的触发条件,即 LGWR进程 触发条件   
1.用户提交
2.有1/3 重做日志缓冲区 未被写入磁盘
3.有大于1M的 重做日志缓冲区 未被写入磁盘
4.3秒超时
5.dbwr需要写入的数据的scn大于lgwr记录的scn,dbwr触发lgwr写入
 
oracle中为什么引入了  log buffer
解决  I/O开支大  和  redo争用  问题
LGWR:     log buffer ——>redo file
二者的由来,有二:
1.redo records 的产生十分频繁
2.server process 每次产生的量却不大
 
倘若每次产生的redo就须由大量高并发sp写入redo log file,则存在两个问题:(sp,就是服务器进程)
1) I/O 开支大
2) redo file 争用
由此,oracle在redo机制中引入了log buffer和LGWR
redo log buffer缓存了sp产生的redo records,提高了oracle高并发的性能
LGWR则将log buffer中的records 批量flush 到redo file,对于oracle 而言,只要对数据的改变写入到 redo log file,那么相关的事务绝不丢失
 
日志及日志组的删除:
删除日志组的时候,要保证组成员只有一个,才可以删除
并且状态如果是【ACTIVE】不能删除,要变成【INACTIVE】s才能删除,就需要多切换几次
 
1.先删日志成员:
alter database drop logfile member 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO042.LOG'
2.再删除日志组:
alter database drop logfile group 4;
 
附:
 
日志切换的场景:
1.当前日志文件满了之后
2.alter system switch logfile; 当前实例
3.alter system archive log current; --切换多个节点(日志)的命令
 
日志切换的过程:较难理解
a.读控制文件,选择下一个日志文件,并清除控制文件中的相关记录。如果DBWR进程正在进行日志切换检查点,或者ARCHn进程正在归档日志内容,那么LGWR会等待这些操作完成才进行日志切换工作
 
b.把当前没有存盘的所有LOG BUFFER都写入磁盘,然后把最后一个REDO记录的SCN写入LOG文件的头块中,完成这些操作后,LGWR关闭当前日志文件
 
c.进行第二次读控制文件,把下一个日志文件的状态设置为CURRENT,老的日志文件修改为ACTIVE,当DBWR完成日志切换检查点和归档操作后,这个日志文件的状态被改为 INACTIVE
 
d.打新日志文件的所有成员(如果组中有超过1个成员),并在文件头写入一个新的日志序列号和low SCN,然后修改 SGA控制变量,允许生产REDO印象。要注意的是,因为写入文件头的信息包括文件编号,因此写文件头的操作不是并行操作,对于同组的不同成员,写入的数据不是完全一致的。
 
 
 
重做日志组,生产环境的话,要多加几组,文件大小 最少200M一个,200M到2G都不过分
 
 
 
 
 

posted on 2022-02-11 21:43  水语者9  阅读(1154)  评论(0编辑  收藏  举报