文章概述:
了解和掌握Oracel数据库重做日志文件和归档日志文件的结构、工作过程以及如何管理重做日志和归档日志。重做日志文件是用于数据库故障恢复的文件,依然是Oracle数据库3类重要物理文件之一。
文章要点:
- 重做日志的结构和用途
- 日志切换和检查点的概念
- 复用重做日志文件
- 获取重做日志文件的信息
重做日志文件的工作原理
Oracle作为大型关系型数据库管理系统,必须通过合理的机制确保在任何情况下都不会出现数据丢失、合理地配置重做日志,可以实现并完成这项任务。利用重做日志文件,在数据库发生故障时,可以重新处理事务,每个事务在处理的同时也会写入重做日志缓冲区,然后由YGWR进程写入到重做日志文件。
重做日志文件结构
Oracle服务器最少需要两个联机重做日志文件组,属于同一日志文件的每个文件被称为被称为日志成员,并且同一日志组不同的日志成员护卫镜像,即组内的每个成员都有相同的日志序列号和相同大小。多个重做日志组是循环使用的。具体流程如图所示:
当日志组1写满后,LGWR进程会切换到日志组2,并将事务变化写入日志组2的两个成员中,如此循环。
日志序列号和日志切换
Oracle服务器对数据库所做的所有更改按顺序记录到重做缓冲区中,LGWR进程吧重做日志条目从日志缓冲区写入联机重做日志组的其中一个组,改组叫做当前重做日志组。LGWR在以下情况下写入;
- 当提交事务处理时。
- 当重做日志缓冲区被写满1/3时。
- 当重做日志缓冲区内的已更改记录超过1MB时。
- 每隔3S。
- 在DBWn将数据库缓冲区中修改的块写入数据文件之前。
日志操作
DBA会在创建数据库时按照计划创建所需重做日志组和各个组成员日志文件。然而有些情况下,会需要通过手工方式为数据库添加新的重做日志组和成员。
增加日志组
通过文件说明来指定成员名称和位置,也可以选择每个重做日志文件组的GROUP参数值,如果省略该参数,Oracle服务器会自动生成其值。
实例①:为Oracle Server 增加一个重做日志组,组中包含两个成员,大小为4MB,并
# 管理员身份登录
conn / as sysdba;
# 创建新日志组
alter database add logfile group4('/opt/oracle/oradata/db01/redo4a.log',
'/opt/oracle/oradata/db01/redo4b.log') size 4M;
# 查询动态视图以确认
select * from v$logfile;
若没指定group子句,这是Oracle将自动为新建的重做日志组设置组好,一般是当前组后递增,若使用group子句,有以下两点需要注意:①重做日志组的组号不能大于MAXLOGFILES参数所指定的值;②编号时不能有中断。
增加成员
假如磁盘发生损坏,导致每个重做日志组都丢失了一个成员日志文件,就需要手动添加一个新日志成员文件。使用日志文件成员的绝对路径名,否则将在数据库服务器缺省的目录下创建该文件,如果文件已存在,其大小必须与指定值一样,加上REUSE选项。
实例②:为group4重做日志组增加一个成员。
alter database add logfile member '/opt/oracle/oradata/db01/redo4c.log' to group4;
tips:创建成员日志时,不能使用size参数来指定文件大小,因为新建的重做日志文件必须与组内其他的文件一样大小。
删除日志
当重做日志组不再需要使用时,可以将整个重做日志组删除,在删组时,其成员日志文件都被删除,所以当删组时需要考虑到:
- 无论组内有多少员,一个数据库至少使用两个重做日志文件。
- 只能删除处于INACTIVE状态的重做,如果要删除CURRENT状态的重做日志组,必须执行一次手工切换,把它切换到INACTIVE状态。
- 如果数据库处于归档模式下,在删组前,必须确定它已经被归档。
所以删组前,必须通过查询V$LOG动态性能视图来获取各个重做日志组的状态。
实例③:删掉日志组3.
# 查看V$LOG查看状态
select group#,archive,status from v$log;
# 删组
alter database drop group 3;
tips:删除日志组时并不删除操作系统文件
除了删除组外,更常见是仅删除日志组内的某个成员文件,例如,由于存放日志文件的硬盘发生物理损坏,为防止Oracle继续写入,需要把它删除。
实例④:删除日志组4中的第三个日志成员。
alter database drop logfile member '/opt/oracle/oradata/db01/redo4c.log';
删除成员时有以下限制:
- 如果要删除的是组内最后一个有效成员,则不能删除该成员。
- 如果该组是当前组,那么必须强制切换日志文件,才可以删除该成员。
- 如果数据库正在运行在ARCHIVELOG模式下并且该成员所属日志文件组归档,则无法删除该成员。
- 删除联机重做日志文件成员时,如果没有使用OMF功能,则不会删除操作系统文件。
清除日志
清空重做日志文件是指将重做日志文件中的内容全部初始化,相当于删除该重做日志文件,然后各方面重建它。
在数据库运行过程中,联机重做日志文件可能会因为某些原因损坏,则数据库会由于无法将损坏的重做日志文件归档而停止,如果发生这种情况,可以在不关闭数据库的情况下,手动清空损坏的重做日志文件的内容,来避免数据库停止运行。
实例⑤:清空日志组5
alter database clear logfile group5;
执行命令后,Oracle会自动将日志组5中的重做日志文件全部初始化。但如果日志组5尚未归档,必须指定UNARCHIVED子句。
alter database clear unarchived logfile group5;
查询日志信息
实例⑥:查询返回控制文件中关于联机重做日志文件的信息。
select group#,sequence#,bytes,members,status from v$log;
status列的状态:UNUSE( 重未使用过的 ),CURRENT( 当前联机 ),ACTIVE( 活动的 )。
重做日志的归档
归档日志的作用
Oracle能将已经写满的重做日志文件在被覆盖之前保存到指定位置上,被保存的重做日志文件的集合称为‘归档重做日志’ ,该操作过程就是“归档” ,根据是否进行归档,数据库可以运行归档模式(ARCHIVELOG)和非归档模式(NOARCHIVELOG) 。
使用归档日志的好处:
- 恢复:数据库备份连同联机重做日志文件和归档重做日志文件可共同确保恢复所欲已经提交的事务处理。
- 备份:可在数据库打开时执行备份。
设置日志归档
修改日志操作后,必须重新备份数据库。只有在数据库处于MOUNT状态下才可以修改日志操作模式。
实例⑦:查看数据库日志操作模式,然后将数据改为归档模式。
# 查看当前数据库的日志模式
archive log list;
# 关闭数据库
shutdown;
# 数据库打开至MOUNT状态
startup mount;
# 修改日志操作模式
alter database archivelog;
# 打开数据库
alter database open;
# 查看当前数据库的日志模式
archive log list;
本章内容主要参考《Oracle数据库系统管理实例化教程》第八章,以上是我个人的见解,有问题欢迎提出交流。