轉載:http://blog.sina.com.cn/s/blog_406d9bb00100fxag.html
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@oracle11g ~]$ cd /u01/oradata/yofee
[oracle@oracle11g 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@oracle11g yofee]$ exit //現在繼續進入ORACLE環境在group4裏面再創建一個OnlineRedoLogFile,這時就不用指定大小了,因爲同一個組裏面的成員大小肯定是一樣的三
exit
SQL> alter database add logfile member
2 '/u01/oradata/yofee/redo04a.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/redo04a.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/redo04a.log NO
SQL> alter database drop logfile member '/u01/oradata/yofee/redo04a.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;
當然,和以前一樣,我們還得在對就的目錄去把這個組的成員物理地刪除掉便大功告成了。
The End
謝謝觀看!
update:
alter database add logfile group 4
('/app/oracle/product/oradata/test/redo04.log') size 50M;
alter database add logfile member
'/home/oracle/yofee/redo04b.log' to group 4;
SQL> select group#,members,archived,status from v$log;
GROUP# MEMBERS ARC STATUS
---------- ---------- --- ----------------
1 2 YES INACTIVE
2 2 YES INACTIVE
3 2 NO CURRENT
4 2 YES UNUSED
這個unused 的狀態不用手動去改,當下一次日誌切換的時候就會變成current,
SQL> alter system switch logfile;
System altered.
SQL> select group#,members,archived,status from v$log;
GROUP# MEMBERS ARC STATUS
---------- ---------- --- ----------------
1 2 YES INACTIVE
2 2 YES INACTIVE
3 2 YES ACTIVE
4 2 NO CURRENT