欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

存储结构之重做日志文件

程序员文章站 2022-05-26 20:01:27
...

重做日志文件,可分在线重做日志文件和归档重做日志文件。它是个数据库的事务日志。目的在于失败时恢复已提交的事务。你在oracle

重做日志文件,可分在线重做日志文件和归档重做日志文件。它是个数据库的事务日志。目的在于失败时恢复已提交的事务。你在Oracle中完成的每个操作几乎都会生成一定的redo信息,并写入在线重做日志文件。

当主机掉电时,你可借助在线重做日志文件,将系统恢复到掉电前的时刻;当磁盘损坏时,你可借助归档重做日志文件恢复到适当的时点;当你误删了某些重要的信息并且提交时,你同样可借助他们去帮你恢复到误删前的那个时刻。

“在重用重做日志之前,失败时应该不需要的重做日志文件的内容”,如果oracle不能肯定这一点,就会暂时挂起数据库,建立检查点,将缓冲区缓存内的redo保护的数据安全地写入磁盘。oracle并非把database_buffer_cache内修改的数据写入磁盘,相反地,它是把redo log buffer里的redo entry flush到在线重做日志文件中。只要修改的块,被缓存而未被写入磁盘,数据库失败时,就需要重做日志文件的内容,然则,却是不可以重用重做日志文件。比如,日志却的时候,填满日志1却换到日志2时,DBWn会建立检查点,把日志1所保护的所有脏块写入磁盘,在这之前,oracle不能重用这个日志文件。否则,在alert日志会报,检查点未完成。出现这个消息时,数据库会挂起,DBWn正忙于完成它建立的检查点。

每个oracle数据库,分散风险的做法是设置3路磁盘通道。每路在设置上该注意什么呢?主要是从高峰负载,平均恢复时间,大量用户修改相同块这几个因素入手。
1)日志组的数量?
太少会有等待事件
2)日志成员大小?
太小了,会频繁却换,产生检查点,性能低;太大了,不安全,数据都在一个地方存放
3)成员对称否?
成员应该设置成同样大小,镜像的数量也应该一致。否则,算法会有剧烈抖动。(注意了,这里是应该,而不是一定哦)

确定有多少个日志组?
SQL> select group# from v$log;

GROUP#
----------
1
2
3
有多少个镜像?
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_7xzskcdd_.log
/u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_7xzskh9o_.log
/u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_7xzsk47l_.log
/u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_7xzsk7of_.log
/u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_7xzsjx1g_.log
/u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_7xzsk0ph_.log

增加一个日志组?若使用OMF,则添加一个组后,oracle会自动为你添加成员。
alter database add logfile group 4(‘filename’,‘filename’) size 100;
如:
SQL> alter database add logfile group 4 size 100m;

Database altered.

SQL> select group# from v$log;

GROUP#
----------
1
2
3
4

删除时把add换成drop即可。current的重做日志文件不能删除,若要删除,,可以使用alter system switch logfile。删除后,操作系统的文件是仍然存在的(OMF除外),把操作系统上的文件一块删除才会比较干净的除去。

如何添加一个成员?
alter database add logfile member
'filename' to group 1,
'filename' to group 2,
'filename' to group 3;

刚加的组的状态是unused。
SQL> select group#,bytes/1024/1024 m from v$log;

GROUP# M
---------- ----------
1 50
2 50
3 50

SQL> alter database add logfile group 5 size 50m;

Database altered.

SQL> select group#,status from v$log;

GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
5 UNUSED

日志成员有几个状态在此稍微说明一下:
active:被RBA指针覆盖的,但不在这里面写。RBA挪开,则是inactive。
current:被RBA指针覆盖的,但正在写。
inactive:表示实例恢复已不再需要这组重做日志文件了。
unused:表示oracle从没用过该重做日志文件组。
日志却会有active。

如果组内只有一个成员,则组与成员的概念没有区别。组就是成员,成员就是组。总之,组间却换,组内镜像。

server process负责把redo entry写到redo log buffer中,而LGWR则负责将redo entry flush到在线重做日志文件。那么LGWR什么时候会写呢?
1)每3秒
2)1/3满
3)1M redo entry
4)commit
5)DBWn写之前写

存储结构之重做日志文件