Oracle進程結構
進程是動態創建的,完成任務後就消亡;而程序是靜態的實體,程序是可以復制、編輯的。進程強調的是執行過程,而程序僅僅是指令的有序集合;進程在內存中,程序在外存中。
ORACLE分為用戶進程和ORACLE進程。
l 用戶進程
當用戶執行一個基於ORACLE數據庫的應用程序時,客戶端就會創建一個ORACLE的用戶進程(如運行的sqlplus、OEM都叫用戶進程)。
用戶進程通過連接登錄到ORACLE服務器,ORACLE服務器上就產生一個對應的服務器進程(Oracle服務器的“外交部”);該服務器進程代表運行在客戶端的用戶進程與服務器通信。
l ORACLE進程
Oracle進程可以分為服務器進程和後台進程服務器進程。
2 服務器進程
主要是服務於客戶端的用戶進程。服務器進程又可以分為:專用服務器進程(只為一個用戶進程提供服務)和共享服務器進程(可以為多個用戶進程提供服務)。
2 服務器進程的任務:
A. 解析並執行用戶所提交的SQL語句;
B. 搜索SGA區的數據庫緩存,決定是否讀取數據文件。如果數據塊不在SGA區的數據庫緩存中,就將其從數據文件中讀入;
C. 將查詢執行的結構數據返回給用戶。
2 後台進程(BackgroundProcess)
服務器進程是由後台進程提供支持的,後台進程主要完成的任務是:
A. 在內存和外存之間進行I/O操作;
B. 監視各個進程的狀態;
C. 協調各個進程的任務;
D. 維護系統的性能;
E. 保證系統的可靠性;
可使用以下查詢來檢查數據庫中啟動的後台進程個數及其名稱
SQL> SELECT * FROM V$BGPROCESS
常用的後台進程:
n SMON(SystemMonitor) 系統監視進程:
ü 啟動條件:隨ORACLE數據庫系統啟動;運行期間ORACLE可以喚醒SMON進程,以檢查是否需要執行它所負責的工作;如果其他任何進程需要使用SMON進程的功能時,將隨時喚醒SMON進程。
ü 作用:
A、在例程啟動時負責對數據庫進行恢復。如果是非正常關閉數據庫,則當下次啟動例程時,SMON進程會自動讀取重做日志文件,對數據庫進行恢復(即執行將已提交的事務寫入數據文件中、回退未提交的事務等操作);
B、清除已經分配但不再使用的表空間中的臨時段(如果表空間中有大量的盤區,則清除就會花費大量時間,就會影響數據庫啟動時的性能) 。
C、合並基於數據字典管理的各個表空間中位置相鄰的空閒盤區,使之更容易分配。
ü 備注說明:如果某個表空間的存儲參數 PCTINCREASE 被設置為0,則SMON進程就不會對該表空間中的空閒盤區進行合並操作。
n PMON(Process Monitor) 進程監視進程;
ü 啟動條件:
A、 需要啟動、清除中斷或失敗的用戶進程時(即對ORACLE數據庫的連接發生崩潰、掛起或其他非正常終止等);清除操作還包括非正常中斷的用戶進程留下的孤兒會話,回退未提交的事務,釋放會話所占用的鎖、SGA區、PGA區的資源。
B、 運行期間ORACLE可以喚醒PMON進程,以檢查是否需要執行它所負責的工作;如果其他任何進程需要使用PMON進程的功能時,將隨時喚醒PMON進程。
C、PMON是在單獨的數據庫中啟動的,而分布式數據庫中是RECO 恢復進程來完成PMON進程的任務的。
ü 作用:
A、 恢復中斷或失敗的用戶進程、服務器進程;
B、 清除非正常中斷的進程留下的孤兒會話;
C、回退未提交的事務,重置活動事務的狀態,從系統活動進程中刪除用戶進程標識號(ID) ;
D、釋放進程所占用的各種資源,並通過自動回退事務來解決死鎖,釋放用戶所擁有的表和行上的鎖;
E、 定期檢查服務器進程和調度進程,如果它們因失敗而被異常掛起,則自動重新啟動它們。
n DBWn(Database Writer) 數據庫寫進程;
ü 啟動條件
A、當DIRTY列表中的髒緩存塊達到一定數量(即初始化參數db_block_write_batch指定值的一半),DBWn進程將髒緩存塊寫入數據文件(同時ORACLE將對控制文件和數據文件的頭部的同步序號SCN進行修改,記錄下當前數據庫的結構和狀態,以保證數據庫中物理文件之間的同步);
B、當在LRU列表中找到一定數量(即初始化參數db_block_max_scan指定的值)的空閒緩存塊,但還不夠時,為獲得更多的空閒緩存塊,DBWn進程將髒緩存塊寫入數據文件;
C、當出現檢查點LGWR進程通知DBWn進程進行寫操作;
D、一個表空間被置於備份模式、脫機或只讀狀態時;
E、DBWn進程出現超時(Time_out)即大約3秒未啟動時。
ü 作用:
A、管理高速緩沖區,保證服務器進程總能找到空閒緩存塊,以便保存從數據文件中讀取的數據塊;
B、將DIRTY列表中的髒緩存塊寫入到數據文件中,獲取更多的空閒緩存塊;
C、使用LRU算法將最近正在使用的緩存塊即命中塊,繼續保留在LRU列表中,不必重新讀取數據文件;
D、DBRn進程通過延遲寫入來優化磁盤I/O操作,而服務器進程只在數據高速緩存區中做修改。
ü 備注說明:
A、DBWn進程數最好不要超過CPU的個數,因為每個處理器同時只能運行1個DBWn進程;
B、ORACLE默認啟動一個DBWn進程,啟動受初始化參數(DB_WRITER_PROCESS)的限制。可以設置初始化參數 DB_BLOCK_CHECKPOINT_BATCH來設置每當出現檢查點時,DBWn進程寫入的髒緩存塊的最大數量。增大該值,可以延長啟動DBWn進程的時間間隔。
n LGWR(Log Writer) 日志寫進程;
ü 啟動條件:
A、用戶進程通過COMMIT語句提交當前事務;
B、重做日志高速緩存被寫滿1/3時,或含有1MB的重做信息時;
C、DBWn進程需要為檢查點清除髒緩存塊,即將髒緩存塊寫入數據文件時;
D、LGWR進程出現超時,即大約3秒為啟動LGWR進程時。
ü 作用:
A、負責管理重做日志高速緩沖區,即將重做日志記錄從高速緩存區寫入到重做日志文件;
B、如果例程沒有啟動CKPT檢查點進程,則LGWR進程就來完成檢查點執行任務。
ü 備注說明:
A、 每個例程只有一個LGWR進程;
B、 LGWR進程先於DBWn進程啟動。
n CKPT (CheckPoint) 檢查點進程
ü 啟動條件:
A、 關閉數據庫時;
B、 一個重做日志文件被寫滿而產生日志切換時;
C、滿足參數 LOG_CHECKPOINT_TIMEOUT(指定檢查點之間的時間間隔(以秒為單位));
D、參數 LOG_CHECKPOINT_INTERVAL(指定當一定數量的操作系統數據塊(非ORACLE數據塊)被寫入重做日志文件時,將觸發一個檢查點)
ü 作用:
A、 觸發DBWn進程,使其將自上一個檢查點之後的全部已經修改的數據塊(髒緩存塊)寫入數據文件中;
B、 保持數據庫高速緩沖區與數據文件之間數據同步(用最新的檢查點信息更新控制文件和數據庫文件的文件頭);
C、檢查點信息會在恢復數據庫期間使用,當SMON進程恢復數據庫時,SMON會決定最後在數據文件中的檢查點。(必須將數據文件的文件頭和控制文件中最後記錄的檢查點之後的聯機重做日志文件中的事務編號重新提交到數據文件中。)
ü 備注說明:
A、不要設置不必要的檢查點,或迫使不需要的檢查點發生;
B、縮短檢查點執行的間隔,可以縮短數據庫恢復時所需的時間;
C、如果檢查點執行的間隔短,將會產生過多的I/O操作;
D、應該使LOG_CHECKPOINT_INTERVAL 設置的操作系統塊數與重做日志文件的大小相匹配。
ü ORACLE在不同的時刻執行不同級別的檢查點,故檢查點有可分為 4 種:
A、 數據庫檢查點:每一次重做日志文件切換時都執行數據庫檢查點;使用NORMAL\TRANSACTIONAL\IMMEDIATE選項關閉數據庫時,會執行一個檢查點;此時DBWn進程將數據高速緩存區中的所有髒緩存塊都寫入數據文件中。
B、 表空間檢查點:將一個表空間設置為脫機狀態或備注為BACKUP模式,會執行一個表空間檢查點;此時DBWn只會將高速緩存區中的與該表空間相關的髒緩存塊寫入數據文件中。
C、手動檢查點:使用 ALTER SYSTEM CHECKPOINT 語句來手動設置一個檢查點。
D、時間檢查點:即每隔多久執行一次檢查點。可以通過調整(LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL)參數來改變檢查點實行的間隔。
n ARCn(Archiver) 歸檔進程;
ü 啟動條件:
發生重做日志切換時(必須是歸檔模式下,並且初始化參數 LOG_ARCHIVE_START 為 TRUE ,如果在歸檔模式下該參數是FALSE當重做日志文件全部寫滿,數據庫將會被掛起。)
ü 作用:避免數據庫崩潰無法恢復。
ü 備注說明:
A、一個例程默認只會啟動一個歸檔進程ARCn,當ARCn正在歸檔一個重做日志文件時,任何其他進程都不能訪問這個重做日志文件。
B、為了避免LGWR進程使用正在歸檔中的重做日志文件造成數據庫被掛起,LGWR進程會根據需要主動啟動更多的歸檔進程。ORACLE最多可以啟用10個ARCn。
C、初始化參數 LOG_ARCHIVE_DEST 指定了歸檔日志文件所在的位置;LOG_ARCHIVE_FORMAT指定了歸檔日志文件的命名格式規則。
n RECO(Recoverer) 恢復進程
n LCKn(Lock) 鎖進程
n RVWR(Recovery Writer) 閃回恢復進程
n CTWR(Change Tracking Writer) 閃回變化跟蹤寫進程
n CJQn(Job Queue Monitor) 作業隊列監視進程
n Jnnn(Job Queue) 作業隊列進程
n Dnnn(Dispatcher) 調度進程
n Snnn(Shared Server) 共享服務器進程
2 綜合案例
案例:查詢後台進程的編號,名稱和描述。
col spid format a10;
col name format a10;
col description formata30;
select p.spid, b.name,b.description from v$bgprocess b, v$process p where p.addr=b.paddr;
案例:查詢
col spid format a10;
col username formata10;
col terminalformat a10;
col program format a10;
select spid, username,terminal, program from v$process;
案例:查看用戶進程情況。Username表示用戶名,process記錄操作系統進程號。
1) 運行cmd,輸入sqlplus/nolog,輸入conn / as sysdba;建立連接1。
2) 在sqlplus中執行下面命令:
col username formata10;
col process format a10;
col machine format a10;
col program format a10;
select username,process, machine, program from v$session where username is not null;
3) 運行cmd,輸入sqlplus/nolog,輸入conn scott/tiger as sysdba;建立連接2。
4) 在第一步建立的連接1中再執行下面的命令:
select username,process, machine, program from v$session where username is not null;
5) 對比以上兩個查詢結果。