OnlineRedoLogFile的主要作用应该是为了提高数据库性能,有变动的数据信息不直接写入磁盘而是先通过
LGWR
把数据写入到
OnlineRedoLogFile
里面,然后再用
DBWR
写进磁盘。大概的流程是写满第一组后写第二组再写第三组然后转回来继续写第一组。每写完一组再转到下一组的时候会发生
log switch,
这时也会自动启动
check point,
所谓
check point
就是把当前的
redo
文件通过
DBWR
写入到磁盘中去,这样的话下次转到继续写他的时候以前的数据才不会丢失。最少要有两个组,每个组最少要有一个成员,当然为了数据安全不丢失,一般都要弄至少两到三个成员分别放到不同的磁盘上去。
但也有一种情况,就是
LGWR
很勤快,一个劲地放
OnlineRedoLogFile
里面写东西,并且
OnlineRedoLogFile
也设置得比较小,一会儿就写满了,然后写下一个,等到转过来准备继续写第一组的时候,
DBWR
都还没来得及把以前的数据写入磁盘,悲剧就发生了。新的数据进不来,数据库就会卡起,
要等到
DBWR
把数据写进磁盘,
LGWR
转过去把
ORLF
的空间腾出来后数据库才会恢复正常,这个对数据库的性能方面影响貌似很大的说。这种问题的解决办法有两种。
一种是直接手动强制
DBWR
马上运行把数据写进磁盘。
SQL> alter system checkpoint;
System altered
二种是把
DBWR
自动执行的时间调得更短一些。
这里举例把他设成每
2000
秒执行一次
SQL> show parameter fast
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_io_target integer 0
fast_start_mttr_target integer 0
fast_start_parallel_rollback string LOW
SQL> alter system set fast_start_mttr_target=2000 scope=both;
System altered.
SQL> show parameter fast //
查看是否更改成功
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_io_target integer 0
fast_start_mttr_target integer 2000
fast_start_parallel_rollback string LOW
下面介绍一下怎么在组之间进行手工切换的操作
SQL> desc V$controlfile //
先复习一下以前怎么看控制文件的
Name Null? Type
----------------------------------------- -------- ----------------------------
STATUS VARCHAR2(7)
NAME VARCHAR2(513)
IS_RECOVERY_DEST_FILE VARCHAR2(3)
BLOCK_SIZE NUMBER
FILE_SIZE_BLKS NUMBER
SQL> col name format a35; //
有一行太宽了,不太好看,调窄些
SQL> select * from V$controlfile; //
于是我们可以看到当前有四个控制文件
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ----------------------------------- --- ---------- --------------
/u01/oradata/yofee/control01.ctl NO 16384 594
/u01/oradata/yofee/control02.ctl NO 16384 594
/u01/oradata/yofee/control03.ctl NO 16384 594
/u01/oradata/yofee/control04.ctl NO 16384 594
SQL> desc v$log; //
同样的道理,我们可以这样查看
redolog
文件信息
Name Null? Type
----------------------------------------- -------- ----------------------------
GROUP# NUMBER
THREAD# NUMBER
SEQUENCE# NUMBER
BYTES NUMBER
MEMBERS NUMBER
ARCHIVED VARCHAR2(3)
STATUS VARCHAR2(16)
FIRST_CHANGE# NUMBER
FIRST_TIME DATE
SQL> select group#,thread#,sequence#,status from v$log; //
查看当前哪一个组是激活的
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 10 CURRENT
2 1 8 INACTIVE
3 1 9 INACTIVE
SQL> alter system switch logfile; //
切换当前组
System altered.
SQL> select group#,thread#,sequence#,status from v$log; //
验证一下
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 10 ACTIVE
2 1 11 CURRENT
3 1 9 INACTIVE
.
SQL> desc v$logfile; //
查看这个视图的列,发现
Member
这个字段很长,于是我们决定把这一列弄短一点
Name Null? Type
----------------------------------------- -------- ----------------------------
GROUP# NUMBER
STATUS VARCHAR2(7)
TYPE VARCHAR2(7)
MEMBER VARCHAR2(513)
IS_RECOVERY_DEST_FILE VARCHAR2(3)
SQL> col member format a40 //
把他弄成
40
吧
SQL> select * from v$logfile; //
现在可以查看一下这个显示得很规则的视图信息了,从这里面我们能看到有三组
OnlineRedoLogfile ,
每组一个
Member
(不安全啊,其实应该多建几个成员然后分别放到不同的磁盘上去的),现在我们准备先再加一组上去
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE /u01/oradata/yofee/redo03.log NO
2 ONLINE /u01/oradata/yofee/redo02.log NO
1 ONLINE /u01/oradata/yofee/redo01.log NO
SQL> alter database add logfile group 4
2 ('/u01/oradata/yofee/redo04.log') size 50M ; //
加一个
group4
并在这组里面加了一个大小为
50M
的成员
Database altered.
SQL> ! //
切换到
Linux
环境,去他的目录查看一下,发现真的创建成功了!
[oracle@oracle 11g ~]$ cd /u01/oradata/yofee
[oracle@oracle 11g yofee]$ ll
total 1777220
-rw-r----- 1 oracle oinstall 9748480 Nov 12 07:43 control01.ctl
-rw-r----- 1 oracle oinstall 9748480 Nov 12 07:43 control02.ctl
-rw-r----- 1 oracle oinstall 9748480 Nov 12 07:43 control03.ctl
-rw-r----- 1 oracle oinstall 9748480 Nov 12 07:43 control04.ctl
-rw-r----- 1 oracle oinstall 9748480 Nov 11 10:58 control05.ctl
-rw-r----- 1 oracle oinstall 104865792 Nov 12 07:40 example01.dbf
-rw-r----- 1 oracle oinstall 52429312 Nov 12 07:43 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Nov 12 07:31 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Nov 12 07:31 redo03.log
-rw-r----- 1 oracle oinstall 52429312 Nov 12 07:43 redo04.log
-rw-r----- 1 oracle oinstall 620371968 Nov 12 07:40 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Nov 12 07:40 system01.dbf
-rw-r----- 1 oracle oinstall 29368320 Nov 12 06:57 temp01.dbf
-rw-r----- 1 oracle oinstall 89137152 Nov 12 07:40 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Nov 12 07:40 users01.dbf
[oracle@oracle 11g yofee]$ exit //
现在继续进入
ORACLE
环境在
group4
里面再创建一个
OnlineRedoLogFile,
这时就不用指定大小了,因为同一个组里面的成员大小肯定是一样的三
exit
SQL> alter database add logfile member
2 '/u01/oradata/yofee/redo 04a .log' to group 4;
Database altered.
SQL> select * from v$logfile; //
好,我们再来看看这些
redoLogFile
信息,发现另外这一个也创建好了并且和刚才那个属于同一组,只不过他的状态是
INVALID
的。
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE /u01/oradata/yofee/redo03.log NO
2 ONLINE /u01/oradata/yofee/redo02.log NO
1 ONLINE /u01/oradata/yofee/redo01.log NO
4 ONLINE /u01/oradata/yofee/redo04.log NO
4 INVALID ONLINE /u01/oradata/yofee/redo 04a .log NO
下面介绍一下怎么删除一个组里面其中一个成员(前提是他不是当前激活状态组的成员并且要保证他里面的数据已经归档了,否则会丢失上面的数据)
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE /u01/oradata/yofee/redo03.log NO
2 ONLINE /u01/oradata/yofee/redo02.log NO
1 ONLINE /u01/oradata/yofee/redo01.log NO
4 ONLINE /u01/oradata/yofee/redo04.log NO
4 INVALID ONLINE /u01/oradata/yofee/redo 04a .log NO
SQL> alter database drop logfile member '/u01/oradata/yofee/redo 04a .log';
Database altered. //
这一步其实只是在控制文件里面把这
LOG
文件信息取消掉了,但真实的那个物理文件还是存在的。
下一步自然就是切换到
Linux
环境,然后找到他的目录将其删除
(RM -f)
走到这一步的时候,
group 4
里面也就只有一个
log
文件了,我们必须通过删除组来达到这个目的,因为每个组里面必须得有一个成员嘛。
删除组:
//
状态是
Inactive
表示已经发生
checkpoint,
已经被
DBWR
写入进磁盘了,可以删除掉,如果是
active
表示已经存在脏数据,
DBWR
还没有运行。一般都会让
group
连续,现在要删的话就删
4
。如果他当前是
current
状态的话就切换一下组。
Alter system switch logfile;
SQL> select group#,members,archived,status from v$log;
GROUP# MEMBERS ARC STATUS
---------- ---------- --- ----------------
1 1 NO CURRENT
2 1 NO INACTIVE
3 1 NO INACTIVE
4 1 YES UNUSED
Alter database drop logfile group 4;
当然,和以前一样,我们还得在对就的目录去把这个组的成员物理地删除掉便大功告成了。