大家好,我是?WeiyiGeek,一名深耕安全運(yùn)維開(kāi)發(fā)(SecOpsDev)領(lǐng)域的技術(shù)從業(yè)者,致力于探索DevOps與安全的融合(DevSecOps),自動(dòng)化運(yùn)維工具開(kāi)發(fā)與實(shí)踐,企業(yè)網(wǎng)絡(luò)安全防護(hù),歡迎各位道友一起學(xué)習(xí)交流、一起進(jìn)步 ,若此文對(duì)你有幫助,一定記得倒點(diǎn)個(gè)關(guān)注?與小紅星??,收藏學(xué)習(xí)不迷路??。
Oracle 重做日志文件
什么是重做日志文件?
描述:重做日志文件(Redo Log Files)是Oracle數(shù)據(jù)庫(kù)中記錄所有數(shù)據(jù)變更操作的關(guān)鍵組件,它以循環(huán)方式記錄數(shù)據(jù)庫(kù)中發(fā)生的所有事務(wù)(變更操作),用于在數(shù)據(jù)庫(kù)發(fā)生異常時(shí)進(jìn)行容災(zāi)恢復(fù)的重要文件。每個(gè)Oracle數(shù)據(jù)庫(kù)必須至少有兩個(gè)重做日志組,每組可以包含一個(gè)或多個(gè)成員(鏡像文件),組中的每個(gè)日志文件被稱作一個(gè)組成員。
重做日志文件的作用,如下所示:
- 數(shù)據(jù)恢復(fù):確保數(shù)據(jù)庫(kù)在故障后可以恢復(fù)已提交的事務(wù)實(shí)例恢復(fù):在數(shù)據(jù)庫(kù)異常關(guān)閉后重啟時(shí),自動(dòng)前滾已提交但未寫(xiě)入數(shù)據(jù)文件的事務(wù)介質(zhì)恢復(fù):配合歸檔日志文件,可以恢復(fù)到特定時(shí)間點(diǎn)保證數(shù)據(jù)一致性:確保事務(wù)的ACID特性(原子性、一致性、隔離性、持久性)支持?jǐn)?shù)據(jù)庫(kù)操作:為數(shù)據(jù)庫(kù)的正常運(yùn)行提供必要支持
重做日志文件結(jié)構(gòu)特點(diǎn)及工作流程
- 重做日志文件結(jié)構(gòu)和特點(diǎn)
你可以將重做日志放入到兩個(gè)磁盤(pán)中
DISK1
、DISK2
,組中的成員可以互為鏡像,Oracle循環(huán)使用日志組,后臺(tái)進(jìn)程?LGWR
?負(fù)責(zé)寫(xiě)操作,寫(xiě)滿一組后切換到下一組,當(dāng)前亦可手動(dòng)觸發(fā)日志切換, 每個(gè)日志組可以包含多個(gè)相同的成員(實(shí)現(xiàn)冗余),日志文件大小影響檢查點(diǎn)和日志切換頻率。
- 重做日志文件工作流程
當(dāng)一個(gè)重做日志文件在 Group3 寫(xiě)滿后,
LGWR
?將重做日志寫(xiě)入到下一個(gè)重做日志組 Group1,若已經(jīng)歸檔記錄歸檔日志,否則清空,同理在 Group1 寫(xiě)滿后,將寫(xiě)Group2 ,此步驟叫做日志切換,同時(shí)會(huì)觸發(fā)執(zhí)行檢查點(diǎn)作者,并會(huì)將相關(guān)操作及數(shù)據(jù)信息寫(xiě)入到控制文件中。
weiyigeek.top-重做日志文件結(jié)構(gòu)特點(diǎn)及工作流程
如何修改查詢與重做日志文件?
1.查詢?nèi)罩窘M及成員信息:
-- # 查看 v$log 視圖
SQL>?select?*?from?v$log;
? ? GROUP# ? ?THREAD# ?SEQUENCE# ? ? ?BYTES ?BLOCKSIZE ? ?MEMBERS ARC STATUS ? ? ? ? ? FIRST_CHANGE# FIRST_TIME ? ? NEXT_CHANGE# NEXT_TIME ? ? ? ? ?CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ -------------- ----------
? ? ? ? ?1 [組號(hào)] ? ? ? ? ?1 [線程] ? ? ? ? ?1 [序列] ?209715200 [日志大小200M] ? ? ? 512 [塊大小512K] ? ? ? ? ?1 [成員數(shù)量] NO [是否歸檔] ?INACTIVE [當(dāng)前狀態(tài)] ? ? ? ? ? ? ? 1490582 [當(dāng)前SCN] 24-3月 -25 ? ? ? ? ?1534500 [下一個(gè)SCN] 08-4月 -25 ? ? ? ? ? ? ?0
? ? ? ? ?2 ? ? ? ? ?1 ? ? ? ? ?2 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?INACTIVE ? ? ? ? ? ? ? 1534500 08-4月 -25 ? ? ? ? ?1581300 09-4月 -25 ? ? ? ? ? ? ?0
? ? ? ? ?3 ? ? ? ? ?1 ? ? ? ? ?3 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?CURRENT ? ? ? ? ? ? ? ?1581300 09-4月 -25 ? ? ? 1.8447E+19 ? ? ? ? ? ? ? ? ? ? ? ? 0
-- # 查看當(dāng)前重做日志文件路徑及狀態(tài) ?
SQL> col MEMBER for a50;
SQL>?select?*?from?v$logfile;
GROUP# ? ?STATUS ?TYPE ? ?MEMBER ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?IS_ ? ? CON_ID
---------- ------- ------- ----------------------------------------- ?--- --------
3[組號(hào)] ?ONLINE[STATUS] ?C:APPORACLEORADATAHISTDBREDO03.LOG [成員路徑] ? ? ? ? ? ?NO ? ? ? ? ? 0
2 ? ? ? ? ONLINE ?C:APPORACLEORADATAHISTDBREDO02.LOG ? ? ? ? ? ?NO ? ? ? ? ? 0
1 ? ? ? ? ONLINE ?C:APPORACLEORADATAHISTDBREDO01.LOG ? ? ? ? ? ?NO ? ? ? ? ? 0
2.重做日志文件手工切換命令:
alter system switch logfile
3.新增重做日志文件命令:
# 新增重做日志組,日志文件后綴可以隨意通常為L(zhǎng)OG,或者rdo。
alter database add logfile group 4 ('C:apporacleoradatahistdbREDO04a.LOG','C:apporacleoradatahistdbREDO04b.LOG',,'C:apporacleoradatahistdbREDO04c.LOG') SIZE 100M;
# 新增重做日志組成員
alter database add logfile member
'C:apporacleoradatahistdbREDO1c.LOG'?to group 1,
'C:apporacleoradatahistdbREDO2c.LOG'?to group 2,
'C:apporacleoradatahistdbREDO3c.LOG'?to group 3;
4.重命名/重定位日志文件命令:
-- 1. 關(guān)閉數(shù)據(jù)庫(kù)
SHUTDOWN IMMEDIATE;
-- 2. 在操作系統(tǒng)層面移動(dòng)或重命名文件
cp 或者 mv 命令
-- 3. 啟動(dòng)到mount狀態(tài)
STARTUP MOUNT;
-- 4. 更新控制文件中的信息
ALTERDATABASERENAMEFILE
'/old_location/redo01.log'
TO'/new_location/redo01.log';
-- 5. 打開(kāi)數(shù)據(jù)庫(kù)
ALTERDATABASEOPEN;
5.刪除重做日志文件組與組成員命令:
-- # 確認(rèn)要?jiǎng)h除的組不是當(dāng)前活動(dòng)組
-- 查看日志組信息
SELECTgroup#, sequence#, bytes/1024/1024 "SIZE(MB)", members, status , archived
FROM?v$log;
-- 1 4192 200 1 INACTIVE NO
-- 2 4193 200 1 CURRENT NO
-- 3 4191 200 1 INACTIVE NO
-- 查看日志成員信息
SELECTgroup#, member, status FROM v$logfile;
-- 3 C:APPORADATAORCLREDO03.LOG?
-- 2 C:APPORADATAORCLREDO02.LOG?
-- 1 C:APPORADATAORCLREDO01.LOG?
-- 查看當(dāng)前日志序列號(hào)
SELECTsequence# FROM v$log WHERE status = 'CURRENT';
-- 4193
-- # 如果狀態(tài)為ACTIVE或CURRENT,需要先執(zhí)行日志切換
ALTERSYSTEMSWITCHLOGFILE;
-- # 刪除組
alterdatabasedroplogfilegroup4;
-- # 刪除組成員
alterdatabasedroplogfilemember'C:apporacleoradatahistdbREDO04b.LOG';
6.修改重做日志文件大小命令:
-- 無(wú)法直接修改現(xiàn)有日志文件大小,必須創(chuàng)建新組然后刪除舊組
-- 1. 添加新大小的日志組
ALTERDATABASEADDLOGFILEGROUP4
? ('/path/redo04a.log',?'/path/redo04b.log')?SIZE200M;
-- 2. 切換日志直到舊組變?yōu)镮NACTIVE狀態(tài)
ALTERSYSTEMSWITCHLOGFILE;
-- 3. 刪除舊日志組
ALTERDATABASEDROPLOGFILEGROUP1;
實(shí)例演示
- 由于當(dāng)前數(shù)據(jù)庫(kù)實(shí)例 REDO 日志組不足,需要增加二組重做日志文件(默認(rèn)為 200M),生產(chǎn)環(huán)境常常遇到。
# 1.由于作者已經(jīng)有三組,所以新增組號(hào) 4,5
alter database add logfile group 4?'C:apporacleoradatahistdbREDO04a.LOG'?SIZE 200M;
alter database add logfile group 5?'C:apporacleoradatahistdbREDO05a.LOG'?SIZE 200M;
# 2.手動(dòng)切換重做日志文件
SQL> alter system switch logfile;
# 3.切換后組4 狀態(tài)為 CURRENT, 表明正常使用。
SQL> select * from v$log;
? ? GROUP# ? ?THREAD# ?SEQUENCE# ? ? ?BYTES ?BLOCKSIZE ? ?MEMBERS ARC STATUS ? ? ? ? ? FIRST_CHANGE# FIRST_TIME ? ? NEXT_CHANGE# NEXT_TIME ? ? ? ? ?CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ -------------- ----------
? ? ? ? ?1 ? ? ? ? ?1 ? ? ? ? ?1 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?INACTIVE ? ? ? ? ? ? ? 1490582 24-3月 -25 ? ? ? ? ?1534500 08-4月 -25 ? ? ? ? ? ? ?0
? ? ? ? ?2 ? ? ? ? ?1 ? ? ? ? ?2 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?INACTIVE ? ? ? ? ? ? ? 1534500 08-4月 -25 ? ? ? ? ?1581300 09-4月 -25 ? ? ? ? ? ? ?0
? ? ? ? ?3 ? ? ? ? ?1 ? ? ? ? ?3 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?ACTIVE ? ? ? ? ? ? ? ? 1581300 09-4月 -25 ? ? ? ? ?1615472 09-4月 -25 ? ? ? ? ? ? ?0
? ? ? ? ?4 ? ? ? ? ?1 ? ? ? ? ?4 ?209715200 ? ? ? ?512 ? ? ? ? ?1 NO ?CURRENT ? ? ? ? ? ? ? ?1615472 09-4月 -25 ? ? ? 1.8447E+19 ? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ?5 ? ? ? ? ?1 ? ? ? ? ?0 ?209715200 ? ? ? ?512 ? ? ? ? ?1 YES UNUSED ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? 0
weiyigeek.top-新增增加二組重做日志
- 由于數(shù)據(jù)庫(kù)系統(tǒng)空間不足,需要?jiǎng)h除兩組重做日志文件,需要在開(kāi)啟歸檔的狀態(tài)下,以釋放空間。
# 1.首先,將切換到 組1、組2、組3 都可以,不要占用要?jiǎng)h除的兩組重做日志組,切換日志直到舊組變?yōu)镮NACTIVE狀態(tài)
SQL> alter system switch logfile;
# 2.其次,刪除上面新增的兩組重做日志文件。
SQL> alter database drop logfile group 5;
SQL> alter database drop logfile group 4;
# 3.最后,查看日志文件相關(guān)成員。
SQL> select * from v$log;
weiyigeek.top-刪除增加的二組重做日志
最后提及一點(diǎn),重做日志文件是Oracle數(shù)據(jù)庫(kù)高可用性和可恢復(fù)性的核心組件,合理配置和管理對(duì)數(shù)據(jù)庫(kù)性能和數(shù)據(jù)安全至關(guān)重要。在生產(chǎn)環(huán)境中,一般3-5組,避免過(guò)多導(dǎo)致管理復(fù)雜,每個(gè)日志組至少應(yīng)有2個(gè)成員,存儲(chǔ)在不同磁盤(pán)上,通常建議100-200MB
,根據(jù)事務(wù)量調(diào)整,并且建議將日志文件分散在不同I/O通道上,以減少I(mǎi)/O爭(zhēng)用。