天天看点

Oracle的redo log(重做日志)Oracle的redo log(重做日志)

Oracle的redo log(重做日志)

Oracle日志文件是Oracle数据库存储信息的重要文件,主要用来存储数据库变化的操作信息。Oracle的重做日志分为在线重做日志和归档重做日志:

(1)online Redo log files(在线重做日志):又称联机重做日志,在线重做日志实时记录数据库的数据更新。

(2)Archive Redo log files(归档重做日志):简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。Oracle数据库在运行时,可以选择是否开启归档日志,在非归档日志的情况下,Oracle所有的操作日志都写在在线重做日志当中,当所有在线重做日志文件写满时(Oracle在线重做日志是分组的,默认是分为三组),那么就把前面的日志文件覆盖继续写入。而在开启归档日志模式情况下,当重做日志都写满时,继续要写入日志时,会把要覆盖的日志文件写入归档日志当中,然后再对重做日志进行覆盖。

重做日志对应于硬盘的重做日志文件(有在线和归档二种),重做日志文件以组(Group)的形式组织,一个重做日志组包含一个或者多个日志文件,一个重做日志组中的日志文件完全相同,互为镜像。

一、查看重做日志信息

1、查询日志组

SQL> select group#,sequence#,bytes,blocksize,members,archived,status,
first_change#,next_change# from v$log;

GROUP#  SEQUENCE#	BYTES  BLOCKSIZE  MEMBERS ARC STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------
	 1	  862	52428800	512	     1 YES INACTIVE		 11491572     11508773
	 2	  863	52428800	512	     1 NO  CURRENT		 11508773   2.8147E+14
	 3	  861	52428800	512	     1 YES INACTIVE		 11467611     11491572
           

2、查询日志文件

SQL> select group#,status,type,member,is_recovery_dest_file from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
           

3、查询历史日志

SQL> select sequence#,first_change#,next_change#,first_time from v$log_history where first_time>sysdate-5;

 SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# FIRST_TIME
---------- ------------- ------------ -------------------
       855	11368276     11386073 2020-02-27 22:00:58
       856	11386073     11406667 2020-02-28 15:40:36
       857	11406667     11420795 2020-02-28 22:01:02
       858	11420795     11451909 2020-02-29 12:21:25
       859	11451909     11453475 2020-02-29 17:40:26
       860	11453475     11467611 2020-02-29 18:14:20
       861	11467611     11491572 2020-03-01 13:00:57
       862	11491572     11508773 2020-03-02 16:36:43

8 rows selected.
           

4、查询日志的归档模式

SQL> select name,log_mode from v$database;

NAME					 LOG_MODE
---------------------------------------- ------------
ORCL					 ARCHIVELOG
           

5、查询归档日志信息

SQL> select recid,sequence#,name from v$archived_log;

     RECID  SEQUENCE# NAME
---------- ---------- ------------------------------------------------------------
	 1	  859 /usr/local/oracle/flash_recovery_area/ORCL/archivelog/2020_0
		      2_29/o1_mf_1_859_h5ngcw3l_.arc
	 2	  860 /usr/local/oracle/flash_recovery_area/ORCL/archivelog/2020_0
		      3_01/o1_mf_1_860_h5pjd9cb_.arc
	 3	  861 /usr/local/oracle/flash_recovery_area/ORCL/archivelog/2020_0
		      3_02/o1_mf_1_861_h5skdvq6_.arc
	 4	  862 /usr/local/oracle/flash_recovery_area/ORCL/archivelog/2020_0
		      3_02/o1_mf_1_862_h5t60n94_.arc
           

二、设置数据库的日志归档模式

在创建数据库时,一般默认为NOARCHIVELOG 模式。要把数据库设置为归档模式,需要以下几个步骤:

1、关闭数据库实例

在进行日志模式切换之前,必须正常关闭数据库实例。

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
           

2、启动数据库实例到mount状态

SQL> startup mount;
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size		    2220200 bytes
Variable Size		  293605208 bytes
Database Buffers	  767557632 bytes
Redo Buffers		    5554176 bytes
Database mounted.
           

3、修改数据库的日志模式

SQL> alter database archivelog;   ---切换日志模式为归档模式

Database altered.

Elapsed: 00:00:00.11
SQL> alter database noarchivelog;  ---切换日志模式为非归档模式

Database altered.
           

4、启动数据库

SQL> alter database open;

Database altered.
           

5、查看归档模式

SQL> select name,log_mode from v$database;

NAME							     LOG_MODE
------------------------------------------------------------ ------------
ORCL							     ARCHIVELOG
           

三、添加和删除日志文件组

1、添加日志文件组

命令如下:

说明:

(1)group n:日志文件组的组号,可以省略;

(2)filename:日志文件组的名称;

(3)size:日志文件组的大小,默认是50M。

举例:

(1)添加一个文件组,不指定group编号

SQL> alter database add logfile '/usr/local/oradata/orcl/redo04.log' size 50m;

Database altered.
           

查看结果:

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
           

(2)添加一个文件组,同时指定group编号

SQL> alter database add logfile group 11 '/usr/local/oradata/orcl/redo11.log' size 50m;

Database altered.
           

查看结果:

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
	11	   ONLINE  /usr/local/oradata/orcl/redo11.log	    NO
           

2、删除日志文件组

Oracle删除日志文件组的语法如下:

说明:

(1)group n:表示要删除的文件组组号;

(2)删除文件组会把里面的日志文件一并全部删除。

举例:删除11号文件组。

SQL> alter database drop logfile group 11;

Database altered.
           

查看结果:

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
           

四、增加与删除日志成员

1、增加日志成员

Oracle数据库中一个日志文件组可以包含多个日志文件。因此,可以对建好的日志文件组进行扩充,语法如下:

说明:

(1)filename:日志文件;

(2)group n:要添加的日志文件组编号。

举例

SQL> alter database add logfile member '/usr/local/oradata/orcl/redo05.log' to group 4;

Database altered.
           

查看结果:

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
	 4 INVALID ONLINE  /usr/local/oradata/orcl/redo05.log	    NO
           

2、删除日志成员

Oracle删除日志文件的语法如下:

说明:

(1)filename:日志文件;

(2)当日志文件组只有一个日志文件时,不能删除,必须把整个日志文件组进行删除。

SQL> alter database drop logfile member '/usr/local/oradata/orcl/redo05.log';

Database altered.
           

查看结果:

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
           

五、移动日志文件的位置

1、查看日志文件

SQL> select * from v$logfile order by group#;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 1	   ONLINE  /usr/local/oradata/orcl/redo01.log	    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01b.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02b.log	    NO
	 3	   ONLINE  /usr/local/oradata/orcl/redo03b.log	    NO
	 3	   ONLINE  /usr/local/oradata/orcl/redo03.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04b.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04.log	    NO
           

2、关闭数据库

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
           

3、移动日志文件的位置

[oracle@wgx orcl]$ mv /usr/local/oradata/orcl/redo01.log /home/oracle/redo01a.log
[oracle@wgx orcl]$ mv /usr/local/oradata/orcl/redo02.log /home/oracle/redo02a.log
[oracle@wgx orcl]$ mv /usr/local/oradata/orcl/redo03.log /home/oracle/redo03a.log
[oracle@wgx orcl]$ mv /usr/local/oradata/orcl/redo04.log /home/oracle/redo04a.log
[oracle@wgx orcl]$ cd ~
[oracle@wgx ~]$ ls
1.ora  2.ora  abc.plb  abc.sql  redo01a.log  redo02a.log  redo03a.log  redo04a.log
           

4、启动数据库到mount模式

SQL> startup mount;
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size		    2220200 bytes
Variable Size		  293605208 bytes
Database Buffers	  767557632 bytes
Redo Buffers		    5554176 bytes
Database mounted.
           

5、更改数据库中日志文件的信息

SQL> alter database rename file '/usr/local/oradata/orcl/redo01.log' to '/home/oracle/redo01a.log';

Database altered.

Elapsed: 00:00:00.01
SQL> alter database rename file '/usr/local/oradata/orcl/redo02.log' to '/home/oracle/redo02a.log';

Database altered.

Elapsed: 00:00:00.02
SQL> alter database rename file '/usr/local/oradata/orcl/redo03.log' to '/home/oracle/redo03a.log';

Database altered.

Elapsed: 00:00:00.01
SQL> alter database rename file '/usr/local/oradata/orcl/redo04.log' to '/home/oracle/redo04a.log';

Database altered.
           

6、启动数据库

SQL> alter database open;

Database altered.
           

7、查看日志文件的信息

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER				    IS_
---------- ------- ------- ---------------------------------------- ---
	 3	   ONLINE  /home/oracle/redo03a.log		    NO
	 2	   ONLINE  /home/oracle/redo02a.log		    NO
	 1	   ONLINE  /home/oracle/redo01a.log		    NO
	 4	   ONLINE  /home/oracle/redo04a.log		    NO
	 1	   ONLINE  /usr/local/oradata/orcl/redo01b.log	    NO
	 2	   ONLINE  /usr/local/oradata/orcl/redo02b.log	    NO
	 3	   ONLINE  /usr/local/oradata/orcl/redo03b.log	    NO
	 4	   ONLINE  /usr/local/oradata/orcl/redo04b.log	    NO

8 rows selected.
           

修改成功。