oracle資料庫例項後臺程序
我們在記憶體中做操作,但是記憶體中所做的操作應該及時寫到磁碟去,所以怎麼保證記憶體的操作寫入磁碟呢?
後臺程序介紹
如何檢視後臺程序 [oracle@WHOST ~]$ ps -ef|grep gaga01 oracle 2704 1 0 17:46 ? 00:00:00 ora_pmon_gaga01 oracle 2706 1 0 17:46 ? 00:00:00 ora_psp0_gaga01 檢視5個重要的後臺程序 [oracle@WHOST ~]$ ps -ef|grep gaga01|egrep "pmon|smon|dbw0|lgwr|ckpt" oracle 2704 1 0 17:46 ? 00:00:00 ora_pmon_gaga01 [oracle@WHOST ~]$ grep和egrep的用法參考如下部落格:
在資料字典中查詢後臺程序 SQL> desc v$bgprocess
正在使用的後臺程序查詢: SQL> SELECT name,description FROM v$bgprocess WHERE paddr<>'00'; |
- 程序
- ,程序
- ARCH/ARCN
1、DBWN,LGWR,CKPT程序
DBWN |
DBWN資料庫寫的條件
32bit--->dbw0---dbw9(最多可以跑10個) 64bit--->dbw0---dbw9,dbwa-dbwj(最多可以跑20個) 具體跑多少個,由引數db_writer_processes決定 如果設定db_writer_processes修改為22個,但是最終還是最多能開20個 SQL> show parameter db_w
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_writer_processes integer 8
SQL> alter system set db_writer_processes=20 scope=spfile;
System altered.
SQL> show parameter db_w
NAME TYPE VALUE ------------------------------------ ----------- ---------------------- -------- db_writer_processes integer 8
SQL> startup force ORACLE instance started.
Total System Global Area 1653518336 bytes Fixed Size 2253784 bytes Variable Size 1073744936 bytes Database Buffers 570425344 bytes Redo Buffers 7094272 bytes Database mounted. Database opened. SQL> show parameter db_w
NAME TYPE VALUE ------------------------------------ ----------- ---------------------- -------- db_writer_processes integer 20
SQL> select count(name) from v$bgprocess where paddr<>'00' and name like'DBW%';
COUNT(NAME) ----------- 20
SQL> select name from v$bgprocess where paddr<>'00';
NAME ----- DBW0 …. DBW9 DBWa ….. DBWj |
LGWR |
LGWR寫的條件
Log buffer-->lgwr--logfile |
CKPT |
CKPT是觸發檢查點
他是保證資料庫裡面的資料庫檔案、控制檔案、日誌檔案中的三大要素實現同步的特殊程序,必須正常.
作用:
給訊號給DBWN:給dbwn發訊號,要求dbwn寫資料,把資料緩衝區中髒資料通過DBWN寫入資料檔案. 更新資料檔案頭:把資料檔案頭的SN號更新 更新控制檔案資訊,如版本號.
這個時候控制檔案、日誌檔案、資料檔案就完全記錄資料庫裡面的狀態和資料,保證不會丟,他們的狀態是一致性的.
CKPT觸發DBWN,DBWN觸發會要求LGWR寫日誌,保證記憶體中的資料全部寫入全部的資料檔案、控制檔案、日誌檔案中.
CKPT中最重要的是:SCN系統變更號,system change number,SCN是標誌資料庫一致性判斷的依據,只有SCN號相同,這些檔案才一致性.
CKPT中所對應的檔案,LGWR所對應的檔案都不要有問題 |
2,SMON,PMON程序
系統監控程序SMON |
系統監控程序SMON(重要)
Coalesce every three seconds
Dellocated |
程序監控程序PMON |
清除失敗的程序: 回滾事務rollback 釋放鎖 釋放其他資源 重啟死調的dispatchers 動態註冊監聽器 |
3,可選後臺程序:歸檔日誌程序ARCH/ARCN
歸檔日誌程序ARCH/ARCN
歸檔日誌程序可能是最重要的一個可選後臺程序,因為如果oracle資料庫的資料檔案丟失或損壞,一般資料庫要進行完全恢復,oracle資料庫應執行在歸檔方式.
在oracle資料庫中,重做日誌檔案被劃分為若干個組,當一個組重做日誌的檔案被寫滿後,oracle就開始寫下一組重做日誌,這杯稱為日誌切換. 切換是以迴圈的方式進行的,即當最後一組寫滿後,又開始寫第一組,因此如果只有重做日誌檔案,即oracle資料庫執行在非歸檔方式下,當遇到資料檔案丟失或損壞時,oracle系統很難保證完全恢復資料庫中的資料,因為此時所需的重做記錄可能因重做日誌迴圈使用而被覆蓋掉了.
在歸檔方式下,ARCn程序把切換後的重做日誌檔案複製到歸檔日誌檔案,可以把歸檔日誌檔案堪稱是重做日誌檔案的備份,但歸檔日誌檔案是離線的,即除了在進行復制時,oracle資料庫在正常執行時是不會關注歸檔日誌檔案的,oracle系統確保一組重做日誌檔案的歸檔操作完成之前不會重新使用該組做日誌,在oracle資料庫中歸檔操作一般是自動進行的,利用這些歸檔日誌檔案,oracle系統就能確保在遇到資料檔案丟失或損壞後可以完全恢復資料庫中的資料.
Ho ps -ef|grep gaga01|grep arc
Select log_mode from v$database; archive log list;
切日誌: Alter system switch logfile 日誌切完後就會歸檔
檢視歸檔到什麼地方呢? Show parameter db_rec; SQL> show parameter db_rec;
NAME TYPE V ALUE ------------------------------------ ----------- - ----------------------------- db_recovery_file_dest string / u01/app/oracle/fast_recovery_ a rea db_recovery_file_dest_size big integer 4 182M db_recycle_cache_size big integer 0
/u01/app/oracle/fast_recovery_area/GAGA01/archivelog/2017_07_11
SQL> ho ls /u01/app/oracle/fast_recovery_area/GAGA01/archivelog/2017_07_11 o1_mf_1_43_dp7klx7w_.arc
歸檔程序有多少個,由於show parameter log_archive_max_processes引數來決定,這個引數最多可設定到30個 |
我們在記憶體中做操作,但是記憶體中所做的操作應該及時寫到磁碟去,所以怎麼保證記憶體的操作寫入磁碟呢?
以下說明了後臺程序的作用:
比如DBWR後臺程序:
DBWn(Database Writer Process)
在什麼觸發DBWR程序的條件: 1.當髒緩衝區的數量超過了所設定的限額。 2.當所設定的時間間隔到了。 3.當有程序需要資料庫高速緩衝區卻找不到空閒的緩衝區時。當server process在buffer cache中無法找到可用的buffer時,呼叫該程序,保證使用者程序始終可以在buffer cache中找到空閒的位置; 4.當校驗點發生時。 接收到CKPT(檢查點,checkpoint)程序的指令後,呼叫該程序,將資料寫入到磁碟中。 5.當某個表被刪除或被截斷時。 6.當某個表空間被設定為只讀狀態時。 7.當使用類似於alter tablespace users begin backup的命令對某個表空間進行聯機備份時。 8.當某個臨時表空間被設定為只離線狀態或正常狀態時。 |
為了保證redo log buffer記憶體中越來越大,所以需要將記憶體中的log寫入磁碟中,釋放記憶體空間。
LGWR(Log Writer Process) LGWR程序在啟動例項時啟動
LGWR是把log_buffer中的日誌條目(ORACLE把客戶提交的SQL語句轉換成ORACLE能夠識別、通過它可以重構資料的一種日誌格式)寫入到日誌檔案中.
LGWR儲存日誌條目,迅速釋放log_buffer空間,只要該日誌條目寫入到日誌檔案,所佔的記憶體空間就釋放.所以log_buffer的功能就是臨時的存放日誌條目,迴圈的使用,如果log_buffer滿了,就無法接受新的事務,就會發生例項掛起現象.
LGWR的作用: 將日誌快取區的資料從記憶體寫到磁碟的redo檔案裡,完成資料庫物件建立、更新等操作過程中的記錄。
LGWR程序: LGWR是將redo log buffer中的日誌寫入到物理磁碟的redo log files裡面。 記憶體中的日誌會定時寫入磁碟redo log files中。這些日誌記錄的作用是為了恢復。 |
這麼多程序在寫,那麼如何保證程序之間協調工作呢?CKPT
- CheckPoint Process(CKPT) 保證資料同步。
只有觸發CKPT後,才會觸發DBWR寫相關資料,DBWR被觸發時LGWR也會觸發。
所以這個時候,CKPT觸發時,LGWR就會寫日誌,日誌寫完後DBWR就會寫資料。
什麼時候會觸發CKPT呢?
- 人為執行commit操作
- 系統定時執行了一些操作
檢查點,把記憶體中的資料寫到磁碟上
- 會啟動DBWn來寫髒資料(SIGNALLING DBWn at CKPT.)
- 完後會更新DATAFILE的HEADER和控制檔案的HEADER.而HEADER中有同步所需要的資訊,即CHECKPOINT的資訊.
- 在ORACLE中,正常情況下,所有檔案必須同期性地同步;靠CHECKPOINT來完成.
SMON系統監控程序:資源的維護和管理,索引合併等
SMON(System Monitor Process)
SMON是Oracle資料庫至關重要的一個後臺程序,SMON 是System Monitor 的縮寫,意即:系統監控。
作用:
- 例項恢復
- 前滾Rolls forward changes in redo logs
- Opens database for user access
- 回滾Rolls back uncommitted transactions
- 回收空間Coalesces free space
- 釋放臨時表Deallocates temporary segments
PMON程序監控程序:程序之間的監控和維護
- Process Monitor Process(PMON)
- 回滾事務
- 釋放鎖及其它資源
- 重啟死掉的排程器.(在共享伺服器中用).
- 在監聽器中註冊服務資訊
PMON SMON DBWR LGWR CKPT 這5個程序為核心程序,不能關閉