重做日志文件
简介:
重做日志文件通常也被称为日志文件,它是保证数据库安全和数据库安全和数据库备份/恢复的基本保障。管理员可以根据日志文件和数据库备份文件,将崩溃的数据库恢复到最近一次记录日志时的状态。
重做日志文件由重做记录组成,重做记录又被称为重做条目,它由一组变更向量组成。每个变更向量都记录了数据库中某个数据块所做的修改。例如用户使用UPDATE语句对某张表的一条记录进行修改,同时生成一条重做记录。这条重做记录可能由多个变更向量组成,在这些变更向量中记录了所有被这条语句修改过的数据块中的信息,被修改的数据块包括表中存储这条记录的数据块,以及回滚中存储的相应回滚条目的数据块。如果由于某种原因导致这条UPDATE语句执行失败,这时事务就可以通过与这条UPDATE语句对应的重做记录找到被修改之前的结果,然后将其复制到各个数据块中,从而完成对数据的恢复。
重做日志文件用于记载事务操作引起的数据变化,当执行DDL或DML操作时,由LGMR进程将缓冲区中与该事务相关的重做记录全部写入重做日志文件。当丢失或损坏数据库中的数据时,Oracle会根据重做日志文件中的记录恢复丢失的数据。
在创建Oracle数据库的过程中,默认创3个重做日志文件组,每个日志文件组中包含两个日志文件成员,并且每个日志文件组都有内部序号,Oracle按照序号从小到大的顺序向日志文件组中写入日志信息。当一个重做日志文件组被写满后,后台进程将开始向下一个重做日志文件组中写入日志信息;当LGWR进程将所有的重做日志文件组都写满后,它将再次转向第一个日志文件进行重新覆盖。
正在被LGWR进程写入的重做日志文件处于"当前状态"(CURRENT),正在被实例用于数据库恢复的重做日志文件处于"活动状态"(ACTIVE),其他的重做日志文件处于"未活动状态"(INACTIVE),用户通过查询数据字典视图v$logfile可以获取重做日志文件的状态。
增删实现:
1,添加新的重做日志文件组,使用ALTER DATABASE ADD LOGFILE语法
SQL>alter database add logfile (D:\xxxx\xxxx\REDO4_A.LOG.E:\xxx\xxx\REDO4_B.LOG) size 20M;
解释:上述语句中添加了两个不同磁盘位置的日志成员,大小均为20MB,通常情况下,重做日志文件的大小最好为10~50MB,Oracle默认的日志文件大小是50MB,另外这个语句中并没有给新创建的重做日志组指定编号,这种情况下,Oracle会自动为新建的重做日志组设置编号,一般是在当前最大组号之后递增,如果要指定编号,可以在后面加group关键字,使用ALTER DATABASE ADD LOGFILE GROUP number语句
SQL>alter database add logfile group 5 (D:\xxxx\xxxx\REDO4_A.LOG.E:\xxx\xxx\REDO4_B.LOG) size 20M;
-
如果要创建一个非复用的重做日志文件即单一日志文件:
SQL> alter database add logfile 'D:\xxx\xxx\REDO6.LOG' reuse;
解释:需要使用reuse关键字,它会覆盖原来得已存在得文件,在使用这个关键字得情况下,不能设置日志文件得大小,它的大小由已存在的日志文件的大小决定。
2,创建日志成员文件,使用ALTER DATABASE ADD LOGFILE MEMBER语句,为第4个重做日志文件组添加一个新的日志文件成员。
SQL>alter database add logfile member 'E:\xxx\xxx\REDO4_C.LOG' to group 4;
-
通过指定第5个重做日志组中的一个成员,来向该组中添加一个新的重做日志文件
SQL>alter database add logfile member 'E:\xxx\xxx\REDO1_new.LOG' to ('E:\xxx\xxx\REDO01.LOG');
3,删除重做日志文件需要使用ALTER DATABASE DROP LOGFILE MEMBER语句,执行该语句要求用户具有ALTER DATABASE系统权限
SQL>alter database drop logfile member 'E:\xxx\xxx\REDO4_C.LOG';
解释:上述语句只是在数据字典和控制文件中将重做日志文件成员删除,而对应的物理文件并没有删除,还需要手动删除。
-
删除日志文件组,注意:
-
1,无论日志组中有多少个成员,一个数据库至少需要两个日志组,删除时不能超过此限制。
-
2,只能删除处于INACTIVE状态的日志组。如果要删除处于CURRENT状态的重做日志组,必须手动切换日志,将它切换到INACTIVE状态。
-
3,如果数据库处于归档模式,则在删除重做日志组之前必须确定它已经被归档,用户可以通过查询v$log数据字典视图来查看重做日志文件组的状态以及它们是否已经被归档。
SQL>alter database drop logfile group 5;
-
4,清空重做日志文件实际上就是将日志文件中的内容清空,这相当于删除原有的日志文件,重新创建新的日志文件。即使数据库只有两个重做日志文件组,甚至要清空的日志组处于CURRENT状态下,也都可以成功执行清空操作。
SQL>alter database clear logfile group 4;
注意:如果要清空的重做日志文件组尚未被归档,则必须再使用ALTER DATABASE CLEAR UNARCHIVED LOGFILE语句。
更改重做日志文件的位置或名称
1,关闭数据库
SQL>shutdown
2,手动复制源文件到目标位置,甚至可以对复制后的文件进行重命名
3,再次启动数据库实例,加载数据库,但不打开数据库
SQL>startup mount;
4,使用ALTER DATABASE RENAME FILE语句重新设置重做日志文件的路径及其名称
SQL>alter database rename file 'D:\xxx\xxx\REDO1_NEW.LOG','D:\xxx\xxx\REDO4_A.LOG' to 'E:\xxx\xxx\REDO1_NEWa.LOG','E:\xxx\xxx\REDO4a.LOG';
5,打开数据库
SQL>alter database open;
6,打开数据库后,新的重做日志文件的位置和名称将生效,通过查询v$logfile字典视图就可以获知数据库现在所使用的重做日志文件。
查看重做日志信息
1,查看日志信息常用的数据字典视图及其说明:
-
v$log:显示控制文件中日志文件的信息
-
v$logfile:日志组和日志成员信息
-
v$log_history:日志历史信息
2,在SQL*Plus环境中,使用DESC命令显示v$log数据字典视图的结构:
-
GROUP#:日志文件组编号
-
SEQUENCE#:日志序列号
-
STATUS:日志组的状态,3种:CURRENT,INACTIVE和ACTIVE
-
SQL>desc v$log;