
话说大张江有处仙乡,唤做SIT部落。仙女老爷们的日常便是把机房的各色设备连来倒去,探究万物的兼容调和之法。小仙惫懒, Oracle系列都这开头......

仙女老爷们的日常
看过甄嬛传的朋友也许记得,古代皇帝除了处理日常政务之外,还要应付纷繁复杂的后宫之事。皇帝每天和那么多老婆谈恋爱,是不是想想都累(小编窃喜,感恩我天朝一夫一妻制)。这个时候就需要有专门记录皇帝一言一行的本本,这就是起居注。起居注就是记录皇帝的日志文件。

言归正传:今儿我们来聊聊Oracle数据库的日志文件。

什么是日志文件?
大家应该都听说过航海日志,航海日志是船舶随行的记录簿,所有与航行有关的重要事件应由有权的船上官员记录。对于Oracle数据库来说,日志文件相当于数据库的日记,记录着每一个对数据库的更改,当发生数据库记忆丢失的情况时(如数据文件意外删除,数据表意外删除,数据文件块损坏等),oracle只要规规矩矩地按照日志文件的记载一步一步把曾经执行过的操作再重做一遍,数据库就可以回到正常状态。
都有哪些日志文件?
日志文件分为在线日志文件和归档日志文件两类,归档日志文件是在线日志文件的历史备份。
Tips: 联机重做日志 = 联机日志 = 在线日志文件

工作原理
1. 在线日志文件
在线日志按照组来管理,每一个组里面一般有多个日志文件,同一日志组里面的多个文件之间是镜像的关系,也就是说同一组里面的不同日志文件的内容是一模一样的,这也是为了防止单个日志文件的损坏。日志组之间按照循环方式来工作,所以ORACLE中,至少应该有两个日志组,当一个在线日志组1被写满的时候,就会发生日志切换,这时在线日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。当然,你也可以设置多个在线日志组,比如你有在线日志组1,2,3,4的话,切换的顺序就是:1写满了,切换到2,2写满了切换到3,3写满了切换到4,4写满了切换到1,这样重复重复再重复。
对数据库的更改会先写到SGA的日志缓冲区里面,然后会通过后台进程LGWR把日志缓冲区里面的内容,按照SCN的先后顺序(SCN你可以理解为时间顺序),以重做条目的形式记录在在线日志文件里面。

2. 归档日志文件
上面提到的在线日志文件,我们知道是数据库的日记,记录着每一个对数据库的更改。那么问题来了,在线日志文件是否可以无限制的记录数据库的日记呢?这个问题就类似于,如果你有写日记的习惯,你能否在一个日记本上无限制的写日记呢?所以答案很明显是不能。如果你把一个日记本写满了,肯定要把这个日记本保存起来,然后买一个新的日记本接着写。归档日志文件就是你写满日记的日记本,专业说法归档日志文件是在线日志文件的历史备份。
官方解释:
Oracle Database lets you save filled groups of redo log files to one or more offline destinations, known collectively as the archived redo log.
Oracle数据库可以运行在两种归档方式下:
非归档日志方式
归档日志方式
非归档日志方式可以避免实例故障,但无法避免介质故障。在此方式下,数据库只能实施冷备份
归档日志方式产生归档日志,用户可以使用归档日志完全恢复数据库
下图是归档方式下数据库的工作原理


Demo
1. 在线日志文件
1.1 查看相关视图
select * from v$log;
//查看都有哪些在线日志组,已经每个日志组的大小,状态

select * from v$logfile;
// 查看每个日志组都有哪些在线日志文件及其路径

1.2 给日志组增加一个日志文件
SQL> alter database add logfile member'/u01/app/oracle/oradata/orcl/redo02a.log' to group 2;
//给日志组2增加一个日志文件,名为redo02a.log
查看下是否成功
select * from v$logfile;

已经看到日志文件redo02a.log创建成功,这个时候日志组2里面就有2个日志文件,一个是日志文件redo02.log,另外一个是redo02a.log。这2个文件是mirror的关系,即使其中一个日志文件损坏了,也不影响数据库的恢复。如果在实际的生成环境下面,最好同一个日志文件组里面的不同日志文件,存放在不同的路径下面,或者可以存放在不同的硬盘上。这样的话,即使物理磁盘损坏了,另外一个日志文件也是完好的。
1.3 创建一个新的日志组
SQL> alter database add logfile group 4'/u01/app/oracle/oradata/orcl/redo04.log' size 10m;
// 创建一个日志文件组4,其中包括的日志文件是redo04.log,大小为10M
查看是否创建成功
select * from v$logfile;

1.4 日志组的四种状态
你可能也注意到了日志组的status有不同的状态,每种状态有不同的含义。
CURRENT:表示这是当前正在使用的联机日志文件组
ACTIVE:表示这个日志文件组中,所记录的重做记录所对应的内存中的脏数据块还没有被完全写入到数据文件中。
INACTIVE:表示这个日志文件组中,所记录的重做记录所对应的内存中的脏数据块已经被写入到数据文件中。
UNUSED:表示还没有被使用过。比如我们刚才创建日志组4就是unused状态。
删除日志组(文件)时的注意事项:
1)该日志文件所在的的日志组(文件)不能处于current状态,需要执行一次手动日志切换;
SQL> alter system switch logfile;
System altered.
2)该日志文件所在的日志文件组中必须包含有其他的日志成员;
3)删除日志文件组时必须有其他的日志文件组;
4)如果数据库运行在归档模式下,则应该在删除日志文件之前,确定它所在的日志文件组已经被归档,否则会导致数据丢失。
2. 归档日志文件
2.1 查看当前数据库的归档方式
SQL> archive log list;

当前已经开启了自动归档方式,如果需要关闭自动归档可以:
1)SQL>SHUTDOWN NORMAL/IMMEDIATE;
2)SQL>START MOUNT;
3)SQL>ALTER DATABASE NOARCHIVELOG;
4)SQL>ALTER DATABASE OPEN;
反之,如果需要从非归档方式变成归档模式和上面步骤类似
1)SQL>SHUTDOWN NORMAL/IMMEDIATE;
2)SQL>START MOUNT;
3)SQL>ALTER DATABASE ARCHIVELOG;
4)SQL>ALTER DATABASE OPEN;
2.2 查看归档日志存放的具体位置
SQL>show parameter log_archive_dest;

通过上图可以看到,我的归档日志文件存放位置有两个/u01/app/arch1和/u01/app/arch2,那么这2个路径下面的文件又有什么区别呢?
答案是这2个路径下面的文件内容一模一样。也就是说,你可以指定多个归档目录,这样的话,oracle归档的时候会把在线日志文件归档到多个目录下面,每个目录下面的内容是一样的,这样做也是从冗余的角度考虑的,因为日志文件对于数据库来说实在是太重要了。

现代社会越来越看重个人信用,每个人都必须重视自己的信用,认真对待。你的一言一行国家也都有记录,这就是个人的日志文件。特别重要的日志文件,会定期存放到你的个人档案里面,也就是变成了归档文件。




