我們知道Oracle里聯(lián)機(jī)日志文件(Online redo logfile)循環(huán)記錄數(shù)據(jù)庫所有的事務(wù)(transaction)。
它的大小、個(gè)數(shù)和存儲(chǔ)位置對(duì)數(shù)據(jù)庫性能和恢復(fù)也是有重要影響的。本文總結(jié)一下關(guān)于redo logfile的一些
內(nèi)容。
一、redo logfile的簡(jiǎn)單介紹
它一般有大小相同的一組文件構(gòu)成。我們可以查看數(shù)據(jù)庫視圖v$logfile知道它的個(gè)數(shù)和存儲(chǔ)位置。
SVRMGRL> select * from v$logfile;
查看數(shù)據(jù)庫視圖v$log知道它當(dāng)前的狀態(tài)。
SVRMGRL> select * from v$log;
一個(gè)時(shí)間只有一組logfile group是工作狀態(tài)(current), redo logfile滿了后會(huì)自動(dòng)切換到下一個(gè)logfile group, 假如數(shù)據(jù)庫是歸檔方式同時(shí)寫到歸檔日志文件。這些文件不能用常規(guī)的文本編輯器查看, 它以特定的格式存放, 只有數(shù)據(jù)庫或者專門的軟件可以看懂它。
redo logfile的最大數(shù)目是在創(chuàng)建數(shù)據(jù)庫時(shí)指明的。假如你想知道當(dāng)前數(shù)據(jù)庫redo logfile的最大數(shù)值
是多少,重新生成控制文件, 就可以知道。
SVRMGRL>alter database backup controlfile to trace;
這條語句會(huì)在$ORACLE_BASE/admin/dbname/udump/路徑下生成當(dāng)前時(shí)間的一個(gè)*.trc文件, 也就是數(shù)據(jù)庫的控制文件, 用文本編輯器, 即可看到數(shù)據(jù)庫創(chuàng)建時(shí)用的一些參數(shù), 包括redo logfile的最大數(shù)(maxlogfiles)。
二、 redo logfile的大小和位置對(duì)數(shù)據(jù)庫性能的影響
假如用ORACLE的安裝向?qū)?chuàng)建的典型數(shù)據(jù)庫, 它的redo logfile大小為500K, 這基本上是不能滿足典型的OLTP應(yīng)用的, 在數(shù)據(jù)庫日志文件(alert_orasid.log)里會(huì)記錄著頻繁的log switch。ORACLE推薦log switch時(shí)間最好在15--30分鐘之間, 所以redo logfile的大小由數(shù)據(jù)庫DML操作數(shù)據(jù)的大小決定其最佳大小。
redo logfile最好有多個(gè)存儲(chǔ)位置, 多組成員, 使數(shù)據(jù)庫恢復(fù)時(shí)有更多的選擇。
典型的OLTP應(yīng)用,redo logfile大小可以為16M。當(dāng)然繁忙的數(shù)據(jù)庫, 例如當(dāng)今的門戶網(wǎng)站, 這個(gè)值可以達(dá)到100M以上.
假如你發(fā)現(xiàn)當(dāng)前數(shù)據(jù)庫日志文件里log switch的時(shí)間偏大或者偏小,不要緊。ORACLE提供了在數(shù)據(jù)庫聯(lián)機(jī)狀態(tài)來改變r(jià)edo logfile大小的方法。
三、在聯(lián)機(jī)狀態(tài)改變r(jià)edo logfile大小的方法
假如原來有3個(gè)小的redo log file, 下面是UNIX環(huán)境下的一個(gè)例子:
第一步: 往數(shù)據(jù)庫添加三個(gè)大的redo logfile
SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4('/opt/oradata/app/redo04.log',
'/ora_bak/oradata2/redolog/redo04.log') size 16M reuse;
SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5
('/opt/oradata/app/redo05.log','/ora_bak/oradata2/redolog/redo05.log') size 16M reuse;
SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6('/opt/oradata/app/redo06.log','/ora_bak/oradata2/redolog/redo06.log') size 16M reuse;
第二步: 手工地做log switch, 使新建的redo logfile起作用.
SVRMGRL>alter system switch logfile;
此操作可以執(zhí)行一到幾次, 使舊的redo logfile成invalid狀態(tài).
第三步: 刪除原來舊的redo logfile.
SVRMGRL>alter database drop logfile group 1;
SVRMGRL>alter database drop logfile group 2;
SVRMGRL>alter database drop logfile group 3;
四、跟redo logfile有關(guān)的其它數(shù)據(jù)庫參數(shù)
1、log_buffer
log_buffer是ORACLE SGA的一部分, 所有DML命令修改的數(shù)據(jù)塊先放在log_buffer里, 假如滿了或者到了check_point時(shí)候通過lgwr后臺(tái)進(jìn)程寫到redo logfile里去。它不能設(shè)得太大,這樣在意外發(fā)生時(shí)會(huì)丟失很多改變過的數(shù)據(jù)。它最好不要大于512K或者128K*CPU個(gè)數(shù)。
我們可以用下面的SQL語句檢測(cè)log_buffer使用情況:
SVRMGRL> select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value'%' "radio"
from v$sysstat rbar,v$sysstat re
where rbar.name='redo buffer allocation retries'
and re.name='redo entries';
這個(gè)比率小于1%才好,否則增加log_buffer的大小
2、log_checkpoint_interval
Oracle8.1 版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據(jù)塊的個(gè)數(shù)。
checkpoint時(shí)Oracle把內(nèi)存里修改過的數(shù)據(jù)塊用DBWR寫到物理文件,用LGWR寫到日志和控制文件。
一般UNIX操作系統(tǒng)的數(shù)據(jù)塊為 512 bytes。
從性能優(yōu)化來說 log_checkpoint_interval = redo logfile size bytes / 512 bytes
3、log_checkpoint_timeout
Oracle8.1 版本后log_checkpoint_timeout指的是兩次checkpoint之間時(shí)間秒數(shù)。
Oracle建議不用這個(gè)參數(shù)來控制,因?yàn)槭聞?wù)(transaction)大小不是按時(shí)間等量分布的。
log_checkpoint_timeout = 0
log_checkpoint_timeout = 900