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.
修改成功。