2010-03-19 16:04:00| 分類(lèi): ORACLE 數(shù)據(jù)庫(kù)管 | 標(biāo)簽: |字號(hào)大中小 訂閱
Oracle里聯(lián)機(jī)日志文件(On
本文總結(jié)一下關(guān)于redo logfile的一些內(nèi)容。
一、redo logfile的簡(jiǎn)單介紹
它一般由大小相同的一組文件構(gòu)成。我們可以查看數(shù)據(jù)庫(kù)視圖v$logfile知道它的個(gè)數(shù)和存儲(chǔ)位置。
SQL> select * from v$logfile; |
查看數(shù)據(jù)庫(kù)視圖v$log知道它當(dāng)前的狀態(tài)。
SQL> select * from v$log; |
一個(gè)時(shí)間只有一組logfile group是工作狀態(tài)(current), redo logfile滿(mǎn)了后會(huì)自動(dòng)切換到下一個(gè)logfile group, 如果數(shù)據(jù)庫(kù)是歸檔方式同時(shí)寫(xiě)到歸檔日志文件。這些文件不能用常規(guī)的文本編輯器查看, 它以特定的格式存放, 只有數(shù)據(jù)庫(kù)或者專(zhuān)門(mén)的軟件可以看懂它。
redo logfile的最大數(shù)目是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指明的。如果你想知道當(dāng)前數(shù)據(jù)庫(kù)redo logfile的最大數(shù)值是多少,重新生成控制文件, 就可以知道。
SQL>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, 這基本上是不能滿(mǎn)足典型的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)戶(hù)網(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, 下面是Linux環(huán)境下的一個(gè)例子:
第一步: 往數(shù)據(jù)庫(kù)添加三個(gè)大的redo logfile
SQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/HS2008/redo04.log', '/u02/app/oracle/oradata/HS2008/redo04.log') size 100M reuse; SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/HS2008/redo05.log', '/u02/app/oracle/oradata/HS2008/redo05.log') size 100M reuse; SQL> alter database add logfile group 6 ('/u01/app/oracle/oradata/HS2008/redo06.log', '/u02/app/oracle/oradata/HS2008/redo06.log') size 100M reuse; |
第二步: 手工地做log switch, 使新建的redo logfile起作用.
SQL> alter system switch logfile; |
此操作可以執(zhí)行一到幾次, 使舊的redo logfile成invalid狀態(tài).
第三步: 刪除原來(lái)舊的redo logfile.
SQL> alter database drop logfile group 1; SQL> alter database drop logfile group 2; SQL> alter database drop logfile group 3; |
到操作系統(tǒng)下刪除原日志組1、2、3中的文件
四、跟redo logfile有關(guān)的其它數(shù)據(jù)庫(kù)參數(shù)
1、log_buffer
log_buffer是ORACLE SGA的一部分, 所有DML命令修改的數(shù)據(jù)塊先放在log_buffer里, 如果滿(mǎn)了或者到了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使用情況:
SQL> 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ě)到日志和控制文件。
從性能優(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
聯(lián)系客服