我們在內存中做操作,但是內存中所做的操作應該及時寫到磁盤去,所以怎么保證內存的操作寫入磁盤呢?
后台進程介紹
如何查看后台進程 [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的用法參考如下博客: http://www.cnblogs.com/tsw1107/p/2264a01aeec481d2044dfeda01417c64.html
在數據字典中查找后台進程 SQL> desc v$bgprocess
正在使用的后台進程查找: SQL> SELECT name,description FROM v$bgprocess WHERE paddr<>'00'; |
- DBWN,LGWR,CKPT進程
- SMON,PMON進程
- 可選后台進程:歸檔日志進程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個進程為核心進程,不能關閉