1、 重做日志文件概述:
1)重做日志文件的概念
重做日志文件,保存了用户对数据库所作的更新操作(DDL、DML),包含的主要信息是记录事务的开始和结束、事务中每项操作的对象和类型、更新操作前后的数据值等。查询不会记录到重做日志文件中。
重做日志文件是由重做记录构成的,每个重做记录由一组修改相量组成。
用户对数据库所做的修改都是在数据库的数据高速缓冲区中进行的,同时将产生的重做记录写入重做日志缓冲区。在一定条件下由DBWR进程将数据高速缓冲区中修改后的结果成批写回数据文件中,而重做日志缓冲区中的重做记录由LGWR进程周期性的写入重做日志文件。
利用重做日志文件恢复数据库是通过事务的重做(REDO)或回退(UNDO)实现的。
2)重做日志文件的工作过程
每个数据库至少需要两个重做日志文件,采用循环写的方式进行工作。当一个重做日志文件写满后,进程LGWR就会移到下一个日志组,称为日志切换,同时信息会写到控制文件中。为了保证LGWR进程的正常进行,通常采用重做日志文件组(GROUP),每个组中包含若干完全相同的重做日志文件成员(MEMBER),这些成员文件相互镜像。 如下图:
2、 重做日志文件的管理
(1)添加重做日志文件组
语法:
ALTERDATABASE ADD LOGFILE……
示例:
SQL>ALTERDATABASE ADD LOGFILE GROUP 4
('D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\
REDO04a.LOG', 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\
ORCL\REDO04b.LOG') SIZE 4M;
注意:
分配给每个重做日志文件的初始空间至少为4 MB。
如果没有使用GROUP 子句指定组号,则系统会自动产生组号,为当前重做日志文件组的个数加1。
在Oracle10.2.0之前的版本中,数据库最多允许的重做日志文件组的数量由控制文件中的MAXLOGFILES参数决定。每个重做日志文件组中最多成员文件数量由控制文件中的MAXLOGMEMBERS参数决定。
(2)添加重做日志文件组成员
语法:
ALTER DATABASE ADD LOGFILE MEMBER… TO GROUP…
示例:
SQL>ALTER DATABASE ADD LOGFILE MEMBER
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\
ORCL\REDO01C.LOG' TO GROUP 1,
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\
REDO04C.LOG' TO GROUP 4;
注意:
同一个重做日志文件组中的成员文件存储位置应尽量分散。
不需要指定文件大小。新成员文件大小由组中已有成员大小决定。
(3)改变重做日志文件组成员名称或位置
语法:
ALTER DATABASE RENAME FILE…TO
注意 :只能更改处于INACTIVE或UNUSED状态的重做日志文件组的成员文件的名称或位置。
示例:将重做日志文件REDO01C.LOG重命名为REDO01B.LOG,将REDO04C.LOG移到D:\ORACLE\PRODUCT\10.2.0\ORADATA目录下。
1)检查要修改的成员文件所在的重做日志文件组状态
SQL>SELECT group#,status FROM v$log;
如果要修改的日志文件组不是处于INACTIVE或UNUSED状态,则需要进行手动日志切换。
2)重命名重做日志文件或将重做日志文件移到新位置
打开D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL文件夹,将REDO01C.LOG更名为REDO01B.LOG,同时将REDO04C.LOG移到 D:\ORACLE\PRODUCT\10.2.0\ORADATA文件夹下。
3)执行ALTERDATABASE RENAME FILE…TO语句
SQL>ALTER DATABASE RENAME FILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01C.LOG',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO4C.LOG'TO
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO001B.LOG',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO04C.LOG';
(4)删除重做日志文件组成员
语法:
ALTER DATABASE DROP LOGFILE MEMBER
注意:
只能删除状态为INACTIVE或UNUSED的重做日志文件组中的成员;若要删除状态为CURRENT的重做日志文件组中的成员,则需执行一次手动日志切换。
如果数据库处于归档模式下,则在删除重做日志文件之前要保证该文件所在的重做日志文件组已归档。
每个重做日志文件组中至少要有一个可用的成员文件,即VALID状态的成员文件。如果要删除的重做日志文件是所在组中最后一个可用的成员文件,则无法删除。
如:删除REDO4c.LOG日志文件
SQL>ALTER DATABASE DROP LOGFILE MEMBER
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO4c.LOG';
(5)删除重做日志文件组
语法:
ALTER DATABASE DROP LOGFILE GROUP
注意事项:
无论重做日志文件组中有多少个成员文件,一个数据库至少需要使用两个重做日志文件组。
如果数据库处于归档模式下,则在删除重做日志文件组之前,必须确定该组已经被归档。
只能删除处于INACTIVE状态或UNUSED状态的重做日志文件组,若要删除状态为CURRENT的重做日志文件组,则需要执行一次手动日志切换。
如:删除Group 4文件组
SQL>ALTER DATABASE DROP LOGFILE GROUP 4;
(6)重做日志文件组切换
当LGWR进程结束对当前重做日志文件组的使用,开始写入下一个重做日志文件组时,称为发生了一次“日志切换”。
通常,只有当前的重做日志文件组写满后才发生日志切换,但是可以通过设置参数ARCHIVE_LAG_TARGET控制日志切换的时间间隔,在必要时也可以采用手工强制进行日志切换。
如果需要将当前处于CURRENT状态的重做日志组立即切换到INACTIVE状态,必须进行手工日志切换。
当发生日志切换时,系统将为新的重做日志文件产生一个日志序列号,在归档时该日志序列号一同被保存。日志序列号是在线日志文件和归档日志文件的唯一标识。
手动日志切换的语法 :
ALTER SYSTEM SWITCH LOGFILE
查看日至切换状态
SQL>SELECT * FROM V$LOGFILE;
(7)清除重做日志文件组
基本概念:
在数据库运行过程中,联机重做日志文件可能会因为某些原因而损坏,导致数据库最终由于无法将损坏的重做日志文件归档而停止,此时可以在不关闭数据库的情况下,手工清除损坏的重做日志文件内容,避免出现数据库停止运行的情况。
清除重做日志文件就是将重做日志文件中的内容全部清除,相当于删除该重做日志文件,然后再重新建立它。清除重做日志文件组是将该文件组中的所有成员文件全部清空。
语句:
ALTERDATABASE CLEAR LOGFILE GROUP …
在下列两种情况下,清除重做日志文件组的操作将无法进行。
1)数据库只有两个重做日志文件组;
2)需要清除的重做日志文件组处于CURRENT状态。
如果要清空的重做日志文件组尚未归档,则必须使用UNARCHIVED子句,以避免对这个重做日志文件组进行归档。
SQL>ALTERDATABASE CLEAR UNARCHIVED LOGFILE GROUP 4;
(8)查看重做日志文件信息
数据字典视图
V$LOG:包含从控制文件中获取的所有重做日志文件组的基本信息。
V$LOGFILE:包含重做日志文件组及其成员文件的信息。
V$LOG_HISTORY:包含关于重做日志文件的历史信息。
查询重做日志文件组的信息
SQL>SELECT GROUP#, SEQUENCE#, MEMBERS, STATUS, ARCHIVED FROMV$LOG;
查询重做日志文件的信息
SQL>SELECT GROUP#, TYPE, MEMBER FROM V$LOGFILE ORDER BY GROUP#;