【体系结构】有一事一直不明,REDO方面

关于lgwr以及commit以及ckpt 他们之间的关系
我有个问题是这样的,如图

假如断电,那数据会不会丢.png

我通过v$log查看日志状态,当我执行了commit的时候,日志并没有刷新,因为是ACTIVE状态

我觉得日志写程序LGWR是和CKPT没有关系的,通过COMMIT来刷日志到硬盘,那就应该是IN ACTIVE状态;

如果LGWR和CKPT有关系,通过定期触发CKPT来指定LGWR写日志,那么当我提交了一个数据123,而且COMMIT了,但日志没有写到物理文件上,此时数据不就丢了吗?
{:soso_e104:}
标签: 暂无标签
王尼玛

写了 31 篇文章,拥有财富 125,被 1 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

guo
P4 | 发表于 2014-1-15 00:30:14
1、commit会触发lgwr , 将log buffer的日志写到redo log,redo就是硬盘上的文件。你的当前redo是50M,你修改一条数据产生的日志,还不足以让日志切换。
2、INACTIVE 状态,说明对应的buffer cache脏块已经写到磁盘。
3、ckpt会更新控制文件中的LRBA地址。另外对与ckpt和lgwr可以说他们有间接关系,ckpt进程,发现当checkpoit队列过长时,IO也不是很繁忙的时候,会适当的触发dbwr将最早脏的块写入磁盘,从而缩短检查点队列。在dbwr触发将脏块写入磁盘时,那么对应的log buffer中的日志一定确认是写到redo中,这也是官方文档中,lgwr触发的最后一个条件(如下)。
When do the LGWR writes to the online redo logs?
• At commit
• When one-third full
• When there is 1 MB ofredo
• Every three seconds
• Before DBWn writes

希望可以帮到你。
回复

使用道具

P4 | 发表于 2014-1-15 08:28:48
你发起提交只是把log buffer的数据写到redo文件,db buffer的数据还不一定写,当将来出问题的时候,通过日志可以把数据恢复回来
回复

使用道具

P3 | 发表于 2014-1-15 19:22:21
我这生产库上一跑数据日志组一分钟一组啊,各位老师有什么解决方案?
回复

使用道具

guo
P4 | 发表于 2014-1-15 19:39:16
mlovewt 发表于 2014-1-15 19:22
我这生产库上一跑数据日志组一分钟一组啊,各位老师有什么解决方案?

一般建议在业务正常运行的时间段,切换频率在15-30分钟 切换一次较为合理。
如果这时1分钟切换一次,那是过于频繁了。你需要添加大的redo日志组,删除原来小的。
回复

使用道具

P3 | 发表于 2014-1-16 08:43:56
guo 发表于 2014-1-15 19:39
一般建议在业务正常运行的时间段,切换频率在15-30分钟 切换一次较为合理。
如果这时1分钟切换一次,那是 ...

我们的系统主要是用于统计查询,基本没有新增修改和删除,但是现在处于试运行状态,每天大量的存储过程需要跑,基本上每月的数据都要几亿,现在很容易挂起,这周我已经把日志组增加到了5组,没组2G了,不知道日志组大了会有什么风险?数据丢失到时不怕,因为不是实时业务,都有基础数据会重新跑出来的。
回复

使用道具

guo
P4 | 发表于 2014-1-16 09:27:40
mlovewt 发表于 2014-1-16 08:43
我们的系统主要是用于统计查询,基本没有新增修改和删除,但是现在处于试运行状态,每天大量的存储过程需 ...

1、你这个是数据仓库系统,产生的redo ,大多都是没有用的。所以不用很大的redo。
2、但是,你产生的redo很多,势必会引起IO繁忙,条件允许的情况所以建议将数据和redo放到不同的高速存储上;如果条件不允许,放到不同的raid,使用不同控制器,但是不需要做条带化,因为redo是顺序写的,对与条带化不条带化都是没啥大的分别的。
3、对于你的挂起,是到底什么情况下挂起,是执行1条,还是10条,又或者是1w条。没有描述清楚。
4、日志组大了会有的风险,会导致实例恢复的时间很长。另外在极端倒霉的情况下,如果在数据恢复过程中,实例再次down掉,比如掉电,那会导致数据丢失。这个对于OLTP数据库是致命的。
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈