oracle數據庫引入重做日志文件的目的:如果數據庫永遠不會損壞是不需要重做日志文件的。重做日志文件可以保證已經提交的數據都能被恢復,可以說是爲了恢復數據庫而產生。
重做日志文件組:重做日志文件需要頻繁的寫入,計算機文件越大,系統操作的效率就越低,所以文件應該盡可能得越小越好,但是如果一個日志文件很快就被寫滿了,這該怎麽辦呢?所以出現了重做日志文件組,一個日志文件寫滿后就能及時切換到下一個日志文件。
歸檔日志文件:如果想記錄的日志文件數據保存下來,又不影響數據庫的效率,就應該將數據直接保存在磁盤。所以出現了歸檔日志文件,歸檔日志文件是脫機的,數據庫運行時是不需要管理他們的。
为什么每个重做日志文件组都不止一个成员呢?
一个重做日志文件组中每一个重做日志文件的内容都是一样的,谁都不能保证磁盘永远不会损坏,所以将一个组中的成员放在不同的磁盘路径下,这样一个损坏了,另一个也可以用。如果重做日志组不是oracle服务器正在操作的组,那即使该组中的所有成员都损坏了,oracle服务器也照常工作。直到切换到这个损坏的组。
如何去设置联机重做日志组的个数以及成员的大小?
可以查看告警文件和lgwr的追踪文件信息。
如果显示联机重做日志组的切换过于频繁(一两分钟切换一次),这就说明可能要增加日志文件的大小;如果信息表明因为重做日志文件组不能及时归档,导致lgwr频繁等待,可能应该增加联机重组日志组的个数。
重做日志文件组的四个状态和含义:
inactive:表示实例恢复已经不需要用到。
active:不是当前正在使用的组,但是实例恢复还需要用到,比如目前正在归档。
current:当前正在使用。
unused:表示oracle服务器从来没有写过这个组。
这里还要说明一下,v$log视图可以查到每个重做日志组都有一个唯一的SEQUENCE以将来进行数据库恢复时使用。
重做日志文件的四个状态和含义:
空白:表示该文件正在使用。
stale:文件中的内容是不完全的。
invalid:文件不可以被访问。
deleted:文件已经不再有用。
添加和删除组:
SQL> alter database add logfile( '/usr/local/oradata/orcl/redo04.log', '/usr/local/oradata/orcl/redo05.log') size 50m;----添加日志文件组,没有指定添加到哪个组,默认新增一个连续组
SQL> alter database add logfile group 11 '/usr/local/oradata/orcl/redo11.log' size 50m;-----添加指定的组,新添加的组sequence为0 ,可以添加不连续的组号,例如当前的最大组号为5,可以添加组号为11的组
SQL> alter database drop logfile group 1 ;-----删除组,删除日志文件组会把里面的日志文件一起删除
添加和删除组成员:
SQL> alter database add logfile member '/usr/local/oradata/orcl/redo05.log' to group 4;----向指定的组中添加成员
SQL> alter database drop logfile member '/usr/local/oradata/orcl/redo05.log';
注意:删除重做日志文件组后,操作系统的文件依然存在,需要手动删除。当前正在使用的组不能删除,每个日志组中至少要有一个成员才能正常工作,所以如果要删除的文件是组中的最后一个有效文件那也是不能删除的,只能把这个组删除。可以使用OMF管理日志文件,在OMF中删除日志文件oracle会自动删除操作系统文件。
所谓的重做日志的维护和修复,就是把有问题的日志文件删除,然后再重建。所有重做日志文件的问题都会记录在告警文件中。
给日志文件重命名:
首先应该先关闭数据库,然后cp操作系统的文件,然后再将数据库启动到mount状态,再修改控制文件中的信息,最后需要删除原来的操作系统文件
SQL> alter database rename file '/usr/local/oradata/orcl/redo01.log' to '/home/oracle/redo01a.log';
清除联机重做日志文件:
有的情况下无法将有问题的重做日志文件删除,再重建。例如,数据库只有两个重做日志文件组,或者崩溃的就是当前重做日志组。
第一步:登录system或者sys用户,做一个全备份,因为数据文件,控制文件,日志文件都是放在一个路径下,所以可以一次性备份这三个文件。
第二步:使用命令初始化重做日志文件,初始化后,日志文件的内容将被清空,同时被初始化的组sequence会变成0,这样数据库是不能自动进行实例恢复的,实例恢复要求sequence是连续的。所以在执行命令后需要做一个全备份。
alter database clear logfile group 组号;--------在已经完成归档状态为inactive
alter database clear unarchived logfile group 组号;--------未完成归档