为什么要引入LGWR后台进程和redo log buffer
如果使用前台进程来将redo的信息写入到redo日志文件组中,那么会导致并发的前台进程对redo日志文件组的争用,从而使用后台进程LGWR之后,不会产生前台程序的争用情况
引入redo log buffer是为了提高数据库的性能,从而前台进程只要将生成的redo信息写入到redo log buffer中
oracle在提高性能的方面,将redo的block块大小和操作系统的块大小设置为一样大,从而不会产生碎块的问题
LGWR将redo log buffer中的内容写入到redo日志文件组中,从而LGWR的触发条件如下:
1、当事物进行commit的时候
2、当redo log buffer中的内容到达1M的时候
3、当达到redo log buffer中的内容的1/3的时候
4、每隔3S
当事物进行commit的时候触发LGWR写操作,是为了确保当用户提交事物的时候,如果数据库发生了故障不会丢失数据,此时redo日志组的信息已经写入到redo log files中,从而数据不会产生丢失
当内容达到1M或者是内容达到1/3或者3S的时候触发,是为了防止当数据库的事物提交的很少,但是每次都产生大量的redo日志信息的时候,防止redo log buffer中的信息积压,从而每次定时的唤醒LGWR进程,将日志信息写入
在LGWR写的时候,会发生一个事件,那就是log file sync等待时间,可能发生为两种情况:
1、当前台进程产生了redo日志时,redo log buffer中的内容满了,从而没有空间来保存新的生成的redo信息,这个时候前台进程必须等待LGWR将buffer中的内容写入到redo日志文件组中,从而发生的等待
2、当用户提交事物时,等待LGWR将日志信息写入到日志文件组中,此时也会发生log file sync等待事件
总的来说:log file sync等待事件就是等待LGWR将redo log buffer中的内容写入到redo日志文件组中发生的等待事件
如何来解决大量的log file sync事件
1、增加redo log buffer的大小,在此时可能需要调整_log_io_size的大小,防止大量的redo信息的堆压
2、将redo日志文件放到IO性能比较好的磁盘上,从而增加LGWR写日志的速度
日志切换
日志切换是一个昂贵的操作,alter system switch logfile;