ORACLE后台進程


我們在內存中做操作,但是內存中所做的操作應該及時寫到磁盤去,所以怎么保證內存的操作寫入磁盤呢?

 

后台進程介紹

    • 進程用於執行特定的任務,不同的進程完成的任務不同
    • oracle的進程分為三大類
      • 用戶進程:客戶端用於連接數據庫的程序
      • 服務器進程:服務器端響應用戶操作請求的程序
      • 后台進程:維護DB Server正常運行以及一些特定功能所需要的進程,隨着實例啟動而啟動
    • oracle的用戶進程就是客戶端連接數據庫的程序
    • 當客戶端程序發出連接請求,用戶進程啟動,當斷開連接,用戶進程釋放
    • 服務器進程就是服務器端響應用戶操作請求的進程,同用戶進程一樣,連接開始,服務器進程分配,連接斷開,服務器進程釋放
    • 后台進程用於執行DB SERVER中特定的任務,根據進程的功能,后台進程被分為必要的和可選兩種
      • 必要的后台進程是系統運行必須的,有五種
        • DBWn數據寫進程
        • PMON進程監視器
        • CKPT檢查點
        • LGWR日志寫進程
        • SMON系統監視器
      • 可選的后台進程更多一些,主要被用於實現或增強某方面的特殊功能

     

    如何查看后台進程

    [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';

 

 

  1. DBWN,LGWR,CKPT進程
  2. SMONPMON進程
  3. 可選后台進程:歸檔日志進程ARCH/ARCN

 

1DBWN,LGWR,CKPT進程

DBWN

DBWN數據庫寫的條件

  • 發聲檢查點
  • 臟緩存到達限制
  • 沒有自由的緩存
  • 超時發生
  • RAC Ping請求
  • 表空間離線
  • 表空間只讀
  • 表被刪除或截斷
  • 開始備份表空間

 

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寫的條件

  • 提交的時候
  • 達到三分之一滿
  • 日志的大小到1M
  • 每隔三秒
  • DBWn進程寫之前
  • 按照順序循環寫
  • 一般情況下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,SMONPMON進程

系統監控進程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后台進程:

  • DBWR會將data buffer cache中已提交標識的數據寫入到數據文件data file物理磁盤中去。也就是說,在data buffer cache中標記已提交的數據會通過DBWR后台進行寫入到數據文件中去。
  • 但是,redo log buffer是記錄所有塊更改的信息的,如果redo log buffer沒有把塊更改的變化信息記錄下來,DBWR是不會將提交的數據寫入到數據文件中去。
  • 也就是說,當data buffer cache中的更改的數據標記了提交,並且redo log buffer將更改的信息記錄下來后,DBWR才會將提交了得數據寫入到數據文件中。

DBWn(Database Writer Process)

  • n是指ORACLE可以啟動多個Database Writer Process
  • 內存中有很多臟數據,有很多數據在修改,一個Database Writer Process不夠用,就會啟多個Database Writer Process
  • DBWn是數據庫后台寫入進程,負責把buffer cache內的臟數據(當buffer cache被修改了,就會標成臟數據)寫入數據庫.DBWn的主要工作是把臟數據寫入磁盤以保證buffer cache是干凈的.
  • 用戶進程會產生臟數據,空余的緩沖區會減少.如果空閑的緩沖區太少,用戶進程從磁盤讀取block進緩沖區的時候就找不到空余的位置了.DBWn管理buffer cache保證用戶進程始終可以找到空閑的位置.

 

在什么觸發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.)
  • 完后會更新DATAFILEHEADER和控制文件的HEADER.HEADER中有同步所需要的信息,CHECKPOINT的信息.
  • ORACLE,正常情況下,所有文件必須同期性地同步;CHECKPOINT來完成.

 

 

 

 

SMON系統監控進程:資源的維護和管理,索引合並等

SMON(System Monitor Process)

SMON是Oracle數據庫至關重要的一個后台進程,SMONSystem 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個進程為核心進程,不能關閉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM