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