不同於MySQL的單程序多執行緒架構,ORACLE是多程序架構。一個ORACLE例項主要有以下三類程序:1.後臺程序,這些程序隨資料庫啟動而啟動,用於完成資料庫的各種後臺任務;2.伺服器程序(server process),這些程序一般由客戶端的請求產生,根據客戶端的請求完成工作;3.從屬程序,這些程序類似後臺程序,它們代表後臺程序或伺服器程序執行一些額外的工作。
一、後臺程序
在作業系統上ps -ef | grep ora可以看到ORACLE的很多後臺程序比如ora_pmon_orcl、ora_dbw0_orcl等,這些都是Oracle的後臺程序,一般常見的後臺程序有以下幾個:
ARCn 歸檔程序,用於將redolog寫到歸檔日誌。
CJQ0 作業佇列協調程式程序。
CKPT 檢查點程序,將檢查點資訊寫入控制檔案和資料檔案頭。
DBRM 資料庫資源管理器程序,設定資源計劃以及執行其它資源管理器任務。
DBWn 資料寫程序,將緩衝區快取記憶體中的資料寫入資料檔案。
DIA0 診斷程序,負責檢測掛起和解決死鎖,觸發DIAG以執行診斷任務。
DIAG 診斷捕獲程序。
FBDA 閃回資料歸檔程序。
LGWR 日誌寫程序,將日誌緩衝區寫出到重做日誌中。
MMAN 記憶體管理器程序。
PMON 程序監視器程序,並恢復失敗的程序資源。
SMON 系統監視器程序
Pnnn 並行查詢從屬程序,負責並行查詢操作
ASMB ASM後臺程序
GMON ASM磁碟組監視器程序
RMSn RAC管理程序
DMON dataguard代理監視器程序
在ORACLE中可以透過v$bgprocess檢視查詢關於後臺程序的資訊。其中PADDR列代表程序的記憶體地址,沒有啟動的後臺程序PADDR列為00。
二、伺服器程序
伺服器程序是指當使用者連線到Oracle伺服器時,在Oracle伺服器上會啟動一個與使用者程序對應的程序來為使用者程序服務。執行命令ps -ef | grep oracleorcl可以看到當前有2個伺服器程序,LOCAL為yes或no代表了是否為本地連線。
在ORACLE中,一般透過v$process檢視查詢程序資訊,當然這個檢視也包括了後臺程序。v$process的查詢輸出中,spid列代表的就是作業系統上的程序號,透過spid可以將程序從作業系統到資料庫關聯起來。addr欄位代表的是程序的地址,程序的狀態等資訊在記憶體中記錄,這個addr記錄的正是這樣的記憶體地址資訊。在v$session檢視中記錄的paddr對應的就是v$process.addr,透過兩者關聯,可以向資料庫進一步深入。background列標識是否為後臺程序,系統後臺程序為1,非後臺程序為null。
三、連線與會話
在ORACLE中,連線並不完全等價於會話,下圖說明了ORACLE中連線與會話的關係:
在ORACLE中,透過v$session檢視查詢會話資訊,其中sid為會話的id號,serial#為會話的序列號,和sid一起來標識唯一一個會話。status代表會話的狀態,狀態為active表示當前正在執行sql語句,為inactive表示等待執行的狀態,為killed表示終止。
以下是常用會話管理的sql語句,其中殺會話一般要加上immediate引數,這樣才能夠立即釋放會話所持有的資源。此外,也可以找到對應作業系統的spid,kill對應的程序,kill前需要謹慎確認。
#查詢當前使用者連線資訊
select s.osuser os_user_name, p.program oracle_process, status session_status,s.terminal terminal, s.program program,
s.username user_name, s.fixed_table_sequence activity_meter, s.sid, s.serial# serial_num from v$session s, v$process p
where s.paddr=p.addr and s.type = 'USER' order by s.username, s.osuser;
#查詢會話對應的OS程序號
select b.sid, b.serial#, c.spid from v$session b, v$process c where b.paddr = c.addr;
#殺會話
alter system kill session 'sid,serial#' immediate;
在ORACLE中對連線數限制的引數主要由processes和sessions完成,其中processes引數限制了能夠連線到SGA的作業系統程序數,包括所有的後臺程序與伺服器程序。而sessions引數限制了一個例項中允許的會話數,即能同時登入到資料庫的併發使用者數。sessions的值是根據processes的值計算得到的,所以一般情況下只需要設定processes的值即可:sessions = (1.5 * processes) + 22。sessions這種引數在ORACLE中也稱為推導引數,通常不需要修改,如果強制修改,那麼修改值會覆蓋推導值。