7.2 管理重做日志文件(redo log file) 

重做日志文件也称为日志文件,是数据库安全和恢复的最基本保障
重做日志文件记录DDL或DML操作

1、日志文件的内容及数据恢复
重做日志文件不仅可以恢复对数据文件的修改操作,还可以恢复对回滚段所作的操作

2、写入重做日志文件
创建oracle数据库的过程中,默认创建3个重做日志文件组,每个组包含两个日志文件,每个日志文件都有序号,按照序号从小到大向日志文件组中写入日志信息。循环覆盖写。
当前正在被LGWR进程写入日志记录的某组重做日志文件被称为“联机重做日志文件”(online redo log file)
重做日志文件的状态:
current:正在被LGWR进程写入的重做日志文件
active:正在被实例用于数据库恢复的重做日志文件
inactive:其他重做日志文件的状态
SQL> col member for a40;
SQL> select * from v$logfile;
    GROUP# STATUS TYPE    MEMBER IS_RECOVERY_DEST_FILE
----------    -------   -------  ---------------------------------------- ---------------------
         1                    ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2                    ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3                    ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO

7.2.5 查看重做日志文件信息
查询重做日志文件信息常用的数据字典视图
字典视图
说明
v$log日志组
v$logfile
日志文件
v$log_history
日志历史信息
SQL> desc v$log;
Name Type Nullable Default Comments
------------- ------------ -------- ------- --------
GROUP# NUMBER Y
THREAD# NUMBER Y
SEQUENCE# NUMBER Y
BYTES NUMBER Y
BLOCKSIZE NUMBER Y
MEMBERS NUMBER Y
ARCHIVED VARCHAR2(3) Y
STATUS VARCHAR2(16) Y
FIRST_CHANGE# NUMBER Y
FIRST_TIME DATE Y
NEXT_CHANGE# NUMBER Y
NEXT_TIME DATE Y

Status列中各值的意义:

Current:当前组。

Inactive:实例恢复已不需要这组日志了

Activie:这组日志是活动的,但非当前组。例如正在归档。

Unused:此组从未被写过。是日志刚被添加到DB中的状态

SQL> desc v$logfile;
Name Type Nullable Default Comments
--------------------- ------------- -------- ------- --------
GROUP# NUMBER Y
STATUS VARCHAR2(7) Y
TYPE VARCHAR2(7) Y
MEMBER VARCHAR2(513) Y
IS_RECOVERY_DEST_FILE VARCHAR2(3) Y

Status列中各值的含义:

空白:此文件正在使用。

Stale:该文件内容是不完全的。

Invalid:该文件不可以被访问。例如刚建立

Deleted:该文件已不再有用

SQL> desc v$log_history;
Name Type Nullable Default Comments
----------------- ------ -------- ------- --------
RECID NUMBER Y
STAMP NUMBER Y
THREAD# NUMBER Y
SEQUENCE# NUMBER Y
FIRST_CHANGE# NUMBER Y
FIRST_TIME DATE Y
NEXT_CHANGE# NUMBER Y
RESETLOGS_CHANGE# NUMBER Y
RESETLOGS_TIME DATE Y


7.2.2 增加日志组及其成员
一个oracle数据库中,至少需要两个重做日志文件组,每个组包含一个或多个重做日志文件成员

1、添加新的重做日志文件组
SQL> select * from v$log;
    GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- ----------- ------------ -----------
         1 1 70 52428800 512 1 NO INACTIVE 1389919 2013/12/9 1 1423244 2013/12/12
         2 1 71 52428800 512 1 NO INACTIVE 1423244 2013/12/12 1443812 2013/12/13
         3 1 72 52428800 512 1 NO CURRENT 1443812 2013/12/13 281474976710
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
SQL> alter database add logfile ('D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG','D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG') size 20M;
Database altered
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
SQL> select * from v$log;
    GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- ----------- ------------ -----------
         1 1 70 52428800 512 1 NO INACTIVE 1389919 2013/12/9 1 1423244 2013/12/12
         2 1 71 52428800 512 1 NO INACTIVE 1423244 2013/12/12 1443812 2013/12/13
         3 1 72 52428800 512 1 NO CURRENT 1443812 2013/12/13 281474976710
         4 1 0 20971520 512 2 YES UNUSED 0 0 

2、创建日志成员文件
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         6 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG N

SQL> alter database add logfile member 'D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_C.LOG' to group 4;
Database altered
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         6 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG NO
         4 INVALID ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_C.LOG NO
7 rows selected

7.2.3 删除重做日志
1、删除日志成员
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         6 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG NO
         4 INVALID ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_C.LOG NO
7 rows selected
SQL> alter database drop logfile member 'D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_C.LOG';
Database altered
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         6 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG NO
6 rows selected
SQL> host del D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_C.LOG;

2、删除日志文件组
删除日志组时需注意一下几点:
a、一个数据库至少需要两个日志组,删除时不能超过这个限制
b、只能删除处于inactive状态的日志组,如果要删除处于current状态的日志组,必须执行一个手动切换日志,将它切换到inactive状态。
c、如果数据库处于归档模式,在删除重做日志组前必须确定它已经被归档

SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         6 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_B.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG NO
6 rows selected
SQL> alter database drop logfile group 6;
Database altered
SQL> select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
         1 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO01.LOG NO
         2 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO02.LOG NO
         3 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO03.LOG NO
         4 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO04_A.LOG NO
         5 ONLINE D:\\APP\\ACIC\\ORADATA\\STONE\\REDO05.LOG NO

3、清空重做日志
将日志文件中的内容清空
SQL> alter database clear logfile group 5;
Database altered

7.2.4 更改重做日志的位置或名称

mv redo01.log redo01_01.log
ora11g@RHEL53 /oracle/u02/oradata/ora11g$mv redo02.log redo02_01.log
ora11g@RHEL53 /oracle/u02/oradata/ora11g$mv redo03.log redo03_01.log

    GROUP# STATUS  TYPE                 MEMBER                                     IS_
---------- ------- -------------------- ------------------------------------------ ---
         1         ONLINE               /oracle/u02/oradata/ora11g/redo01.log      NO
         2         ONLINE               /oracle/u02/oradata/ora11g/redo02.log      NO
         3         ONLINE               /oracle/u02/oradata/ora11g/redo03.log      NO
         4         ONLINE               /oracle/u02/oradata/ora11g/redo04_01.log   NO
         4         ONLINE               /oracle/u02/oradata/ora11g/redo04_02.log   NO
         1         ONLINE               /oracle/u02/oradata/ora11g/redo01_02.log   NO
         2         ONLINE               /oracle/u02/oradata/ora11g/redo02_02.log   NO
         3         ONLINE               /oracle/u02/oradata/ora11g/redo03_02.log   NO

NotConnected@>alter database rename file '/oracle/u02/oradata/ora11g/redo01.log' to '/oracle/u02/oradata/ora11g/redo01_01.log';

NotConnected@>alter database rename file '/oracle/u02/oradata/ora11g/redo02.log' to '/oracle/u02/oradata/ora11g/redo02_01.log';

NotConnected@>alter database rename file '/oracle/u02/oradata/ora11g/redo03.log' to '/oracle/u02/oradata/ora11g/redo03_01.log';

alter database open;

sys@ora11g> select * from v$log;

sys@ora11g> select * from v$logfile order by 1,4;

8 rows selected.
alter database backup controlfile to trace;

7.3 管理归档日志文件
归档日志文件保存重做日志文件
oracle有两种日志模式:
第一种:非归档日志模式(noarchivelog),原日志文件内容会被新的日志内容覆盖
第二种:归档日志模式(archivelog),先对原日志文件进行归档存储,归档未完成之前不允许覆盖原有日志

1、归档模式(archivelog)
归档日志的作用:
a.恢复数据库
b.更新备用数据库
c.使用logMiner获得数据库的历史信息

归档模式:
a.会对在线重做日志进行归档,因此被填满的日志文件只有被归档后才能使用。
b.在出现操作系统或磁盘故障时只要有数据库备份+在线和归档日志文件就能保证数据库能恢复所有已提交事务。
c.如果保存有归档日志,当数据处于开启状态时也能备份。
d.只要不断往备用库中应用归档日志就能保持备用库是最新的

归档操作由后台进程ARCN自动完成

2、非归档模式(noarchivelog)
非归档模式:
a.不能对在线重做日志进行归档,因此被填满的日志文件当出现日志交换时将会被LGWR再使用和覆盖,而不是等被填满的日志文
件归档后才能再使用。
b.不能使用在线表空间备份,只能使用备份整个数据库方式恢复已关闭的数据库,因此在非归档模式下,要定期进行整库备份。

7.3.2 管理归档操作
默认情况下,数据库处于非归档日志模式
显示当前数据库的归档信息:
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 D:\\app\\acic\\product\\11.2.0\\dbhome_3\\RDBMS
最早的联机日志序列 70
当前日志序列 72

1、日志模式切换
(1)查看当前日志模式
SQL> select log_mode from v$database;
LOG_MODE
------------------------------------
NOARCHIVELOG

(2)关闭并重新启动数据库
改变日志操作模式必须在mount状态下进行
改变日志模式时,关闭数据库不能使用shutdown abort命令
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 342388736 bytes
Fixed Size 2213216 bytes
Variable Size 209717920 bytes
Database Buffers 125829120 bytes
Redo Buffers 4628480 bytes
Database mounted.

(3)改变日志模式
SQL> alter database archivelog;
Database altered.
(4)打开数据库
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /ora/app/oracle/product/11.2.0/dbhome_1/dbs/arch
Oldest online log sequence 16
Next log sequence to archive 18
Current log sequence 18

2、配置归档进程
如果oracle系统的后台进程LGWR经常出现等待的状态,可以考虑启动多个ARCN进程,修改系统初始化参数log_archive_max_processes调整启动ARCN进程数量
SQL> col name for a20;
SQL> col type for a10;
SQL> show parameter log_archive_max_processes;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
log_archive_max_processes integer 4

SQL> alter system set log_archive_max_processes=3;
System altered.
SQL> show parameter log_archive_max_processes;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
log_archive_max_processes integer 3

7.3.3 设置归档文件位置
归档目标在初始化参数log_archive_dest_n中进行设置,其中n为1到31的整数,即可以为数据库指定1到31个归档目标。

1、本地归档目标(location )
SQL> alter system set log_archive_dest_1='location=/ora/app/oracle/oradata/stone1/archive1';
System altered.
SQL> alter system set log_archive_dest_2='location=/ora/app/oracle/oradata/stone1/archive2 optional';
System altered.
SQL> alter system set log_archive_dest_3='location=/ora/app/oracle/oradata/stone1/archive3 mandatory';
System altered.
SQL> alter system set log_archive_dest_4='location=/ora/app/oracle/oradata/stone1/archive4 mandatory reopen=400';
System altered.

选项含义如下:
optional:默认选项,无论归档是否执行成功,都可以覆盖重做日志文件
mandatory:强制进行归档,只有在归档成功后,重做日志文件才能被覆盖
reopen:设定重新归档的时间间隔,默认值为300秒,reopen属性必须跟在mandatory选项后

使用初始化参数log_archive_min_success_dest控制本地成功归档的“最小个数”,如果成功生成的归档日志文件少于“最小个数”,那么重做日志将不能被覆盖。
SQL> show parameter log_archive_min_succeed_dest;
NAME                                             TYPE         VALUE
------------------------------------ ---------- ------------------------------
log_archive_min_succeed_dest      integer     1
SQL> alter system set log_archive_min_succeed_dest=2;
System altered.
SQL> show parameter log_archive_min_succeed_dest;

NAME                                             TYPE         VALUE
------------------------------------ ---------- ------------------------------
log_archive_min_succeed_dest      integer     2

使用初始化参数log_archive_dest_state_n设置归档位置是否可用
为enable,表示激活相应的归档位置
为defer,表示禁用相应的归档位置
SQL> show parameter log_archive_dest_state_4;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
log_archive_dest_state_4 string enable
SQL> alter system set log_archive_dest_state_4=defer;
System altered.
SQL> show parameter log_archive_dest_state_4;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
log_archive_dest_state_4 string DEFER

一般归档日志所在的磁盘损坏或填满时,数据库管理员应该暂时禁用该归档位置
在设置禁用归档位置时,要求参数log_archive_dest_state_n的序号n的值要大于log_archive_min_succeed_dest的值

2、远程归档目标(server)
SQL> alter system set log_archive_dest_5='service=192.168.1.103';
System altered.

7.3.4 查看归档信息
两种方法:
(1)使用数据字典和动态性能视图
常用的包含各种归档信息的数据字典和动态性能视图如下表:
字典与视图
说明
v$database用于查询数据库是否处于归档状态
v$archived_log
包含控制文件中所有已经归档的日志信息
v$archive_dest
包含所有归档目标信息
v$archive_processes
包含已经启动的ARCN进程状态信息
v$backup_redolog
包含所有已经备份的归档日志信息

(2)使用archive log list命令
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /ora/app/oracle/oradata/stone1/archive4
Oldest online log sequence 17
Next log sequence to archive 19
Current log sequence 19