国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle體系結構:內存結構和進程結構

2024-08-29 13:31:35
字體:
來源:轉載
供稿:網友


(一)內存結構和進程結構 oracle數據庫的總體結構如下圖:

 1:oracle實例(instance)        
  在一個服務器中,每一個運行的oracle數據庫都與一個數據庫實例相聯系,實例是我們
 訪問數據庫的手段。
  實例在操作系統中用oracle_sid來標識,在oracle中用參數instance_name來標識,
 它們兩個的值是相同的。數據庫啟動時,系統首先在服務器內存中分配系統全局區(sga),
 構成了oracle的內存結構,然后啟動若干個常駐內存的操作系統進程,即組成了oracle的
 進程結構,內存區域和后臺進程合稱為一個oracle實例。
                 


  數據庫與實例之間是1對1/n的關系,在非并行的數據庫系統中每個oracle數據庫與一個
 實例相對應;在并行的數據庫系統中,一個數據庫會對應多個實例,同一時間用戶只與一個
 實例相聯系,當某一個實例出現故障時,其他實例自動服務,保證數據庫正常運行。在任何
 情況下,每個實例都只可以對應一個數據庫。

 2:oracle 10g動態內存管理
  內存是影響數據庫性能的重要因素,oracle8i使用靜態內存管理,oracle 10g使用動態
 內存管理。所謂靜態內存管理,就是在數據庫系統中,無論是否有用戶連接,也無論并發用
 量大小,只要數據庫服務在運行,就會分配固定大小的內存;動態內存管理允許在數據庫服
 務運行時對內存的大小進行修改,讀取大數據塊時使用大內存,小數據塊時使用小內存,讀
 取標準內存塊時使用標準內存設置。
  按照系統對內存使用方法的不同,oracle數據庫的內存可以分為以下幾個部分:
  •系統全局區:sga(system global area)
  •程序全局區:pga(programe global area)
  •排序池:(sort area)
  •大池:(large pool)
  •java池:(java pool)

 2-1:系統全局區sga(system global area)
   sga是一組為系統分配的共享的內存結構,可以包含一個數據庫實例的數據或控制信
  息。如果多個用戶連接到同一個數據庫實例,在實例的sga中,數據可以被多個用戶共享。
  當數據庫實例啟動時,sga的內存被自動分配;當數據庫實例關閉時,sga內存被回收。
  sga是占用內存最大的一個區域,同時也是影響數據庫性能的重要因素。
  sga的有關信息可以通過下面的語句查詢,sga_max_size的大小是不可以動態調整的。
   =====================================
   sql> show parameter sga
   name                                 type        value
   ------------------------------------ ----------- --------
   lock_sga                             boolean     false
   pre_page_sga                         boolean     false
   sga_max_size                         big integer 164m
   sga_target                           big integer 0
   
   sql> alter system set sga_max_size=100m;
   alter system set sga_max_size=100m
                 *
   error at line 1:
   ora-02095: specified initialization parameter cannot be modified
   ======================================  
  

系統全局區按作用不同可以分為:
   •數據緩沖區
   •日志緩沖區
   •共享池

  2-1-1:數據緩沖區(database buffer cache)
    如果每次執行一個操作時,oracle都必須從磁盤讀取所有數據塊并在改變它之后
   又必須把每一塊寫入磁盤,顯然效率會非常低。數據緩沖區存放需要經常訪問的數據,
   供所有用戶使用。修改數據時,首先從數據文件中取出數據,存儲在數據緩沖區中,
   修改/插入數據也存儲在緩沖區中,commit或dbwr(下面有詳細介紹)進程的其他條
   件引發時,數據被寫入數據文件。
    數據緩沖區的大小是可以動態調整的,但是不能超過sga_max_size的限制。
   ======================================
   sql> show parameter db_cache_size
   name                                 type        value
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 24m
   
   sql> alter system set db_cache_size=128m;
   alter system set db_cache_size=128m
   *
   error at line 1:
   ora-02097: parameter cannot be modified because specified value is invalid
   ora-00384: insufficient memory to grow cache

   sql> alter system set db_cache_size=20m;
   system altered.
   
   sql> show parameter db_cache_size;
   name                                 type        value
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 20m
   
   #此處我僅增加了1m都不行?
   sql> alter system set db_cache_size=25m;
   alter system set db_cache_size=25m
   *
   error at line 1:
   ora-02097: parameter cannot be modified because specified value is invalid
   ora-00384: insufficient memory to grow cache

   #修改顯示格式,方便查看。
   sql> column name format a40 wrap
   sql> column value format a20 wrap
   
   #下面語句可以用來查看內存空間分配情況,注意sga各區大小總和。
   sql> select name,value from v$parameter where name like '%size' and value <> '0';
   
   #先將java_pool_size調小,然后再修改db_cache_size
   sql> show parameter java_pool_size;
   name                                 type        value
   ------------------------------------ ----------- -----
   java_pool_size                       big integer 48m

   sql> alter system set java_pool_size=20m;
   system altered.

   sql> alter system set java_pool_size=30m;
   system altered.
   #上面說明sga中各區大小總和不能超過sga_max_size。
   =====================================
    數據緩沖區的大小對數據庫的存區速度有直接影響,多用戶時尤為明顯。有些應
   用對速度要求很高,一般要求數據緩沖區的命中率在90%以上。
    下面給出一種計算數據緩沖區命中率的方法:
    •使用數據字典v$sysstat
    =====================================
    sql> select name, value from v$sysstat
         2  where name in('session logical reads',
         3  'physical reads',
         4  'physical reads direct',
         5  'physical reads direct (lob)')
    name                              value
    ------------------------------- ----------
    session logical reads               895243
    physical reads                       14992
    physical reads direct                   34
    physical reads direct (lob)              0
    ======================================
    命中率=1-(14992-34-0)/895243

    可以讓oracle給出數據緩沖區大小的建議:
    ======================================
    sql> alter system set db_cache_advice=on;#打開該功能
    system altered.

    sql> alter system set db_cache_advice=off;#關閉該功能
    system altered.
    ======================================

2-1-2:日志緩沖區(log buffer cache)
    日志緩沖區用來存儲數據庫的修改信息。該區對數據庫性能的影響很小,有關日
   志后面還會有詳細的介紹。
    查詢日志緩沖區大小:
   sql> show parameter log_buffer
   name            type          value
   ----------     -----------  -------
   log_buffer     integer       262144 

  2-1-3:共享池(share pool)
    共享池是對sql,pl/sql程序進行語法分析,編譯,執行的內存區域。
    它包含三個部分:(都不可單獨定義大小,必須通過share pool間接定義)。
    •庫緩沖區(library cache)包含sql,pl/sql語句的分析碼,執行計劃。
    •數據字典緩沖區(data dictionary cache)表,列定義,權限。
    •用戶全局區(usr global area)用戶mts會話信息。
   共享池的大小可以動態修改:
    ======================================
    sql> show parameter shared_pool_size
    name                                 type        value
    ------------------------------------ ----------- ------
    __shared_pool_size                   big integer 80m
    shared_pool_size                     big integer 80m
    
    sql> alter system set shared_pool_size=78m 
    system altered.
    ======================================
    #上面的__shared_pool_size一行奇怪?

 2-2:程序全局區pga(programe global area)
   程序全局區是包含單個用戶或服務器數據和控制信息的內存區域,它是在用戶進程連
  接到oracle并創建一個會話時由oracle自動分配的,不可共享,主要用于用戶在編程存
  儲變量和數組。
  

 


   如上圖:
    •stack space是用來存儲用戶會話變量和數組的存儲區域;
    •user session data是為用戶會話使用的附加存儲區。
     |--session information
     |--sort area
     |--cursor information   
   注意session information(用戶會話信息)在獨占服務器中與在共享服務器中所處
  的內存區域是不同的。


 2-3:排序區,大池,java池
   排序區(sort area)為有排序要求的sql語句提供內存空間。系統使用專用的內存區
  域進行數據排序,這部分空間就是排序區。在oracle數據庫中,用戶數據的排序可使用
  兩個區域,一個是內存排序區,一個是磁盤臨時段,系統優先使用內存排序區進行排序。
  如果內存不夠,orcle自動使用磁盤臨時表空間進行排序。為提高數據排序的速度,建議
  盡量使用內存排序區,而不要使用臨時段。
   參數sort_area_size用來設置排序區大小。(好象不能動態修改?)

   大池(large pool)用于數據庫備份工具--恢復管理器(rman:recovery manager)。
  large pool的大小由large_pool_size確定,可用下面語句查詢和修改:
  =========================================
  sql> show parameter large_pool_size
  name                  type        value
  -----------------   ----------- -------
  large_pool_size     big integer      8m

  sql> alter system set large_pool_size=7m;
  system altered. 
  =========================================
   
   java池主要用于java語言開發,一般來說不低于20m。其大小由java_pool_size來
  確定,可以動態調整。

 2-4:oracle自動共享內存管理(automatic shared memory(sga) management)
  在oracle 8i/9i中數據庫管理員必須手動調整sga各區的各個參數取值,每個區要根據
 負荷輕重分別設置,如果設置不當,比如當某個區負荷增大時,沒有調整該區內存大小,則
 可能出現ora-4031:unable to allocate ...bytes of shared memory錯誤。
  在oracle 10g中,將參數statistics_level設置為typical/all,使用sga_target指
 定sga區總大小,數據庫會根據需要在各個組件之間自動分配內存大小。
 下面是系統自動調整的區域:
  •固定sga區及其他•共享池•數據緩沖區• java池•大池。
  注意:如果不設置sga_target,則自動共享內存管理功能被禁止。
  ==========================================
  sql> show parameter statistics_level
  name                     type        value
  --------------------- ----------- ------------
  statistics_level      string      typical
  
  sql> alter system set statistics_level=all;
  system altered.

  #typical和all有什么區別?
  
  sql> alter system set statistics_level=typical;
  system altered.

  sql> show parameter sga_target
  name            type        value
  ------------- ----------- ----------
  sga_target    big integer 0

  sql> alter system set sga_target=170m;
  alter system set sga_target=170m
  *
  error at line 1:
  ora-02097: parameter cannot be modified because specified value is invalid
  ora-00823: specified value of sga_target greater than sga_max_size

  sql> alter system set sga_target=20m;
  system altered.

  #不過后來又發現sga_target的值變成了140m? 下面是語句執行情況。
  sql> show parameter sga_target
  name          type        value
  ------------- ----------- -------
  sga_target    big integer 140m
  
  sql> alter system set sga_target=0;
  system altered.

  sql> show parameter sga_target
  name                                 type        value
  ------------------------------------ ----------- ------
  sga_target                           big integer 0

  #改為20m
  sql> alter system set sga_target=20m;
  system altered.

  #顯示的是140m
  sql> show parameter sga_target
  name                                 type        value
  ------------------------------------ ----------- ------
  sga_target                           big integer 140m

  #不可縮減?
  sql> alter system set sga_target=130m;
  alter system set sga_target=130m
  *
  error at line 1:
  ora-02097: parameter cannot be modified because specified value is invalid
  ora-00827: could not shrink sga_target to specified value
  
  #不可增加
  sql> alter system set sga_target=141m;
  alter system set sga_target=141m
  *
  error at line 1:
  ora-02097: parameter cannot be modified because specified value is invalid
  ora-00823: specified value of sga_target greater than sga_max_size
  
3:oracle實例的進程結構(process structure)
 oracle包含三類進程:
 •用戶進程(user process)
 •服務器進程(server process)
 •后臺進程(background process)
 
 3-1:用戶進程和服務器進程
  當數據庫用戶請求連接到oracle的服務時啟動用戶進程(比如啟動sqlplus時)。
  •用戶進程首先必須建立一個連接。
  •用戶不能直接與oracle服務器,必須通過服務器進程交互。
  •服務器進程是用戶進程與服務器交互的橋梁,它可以與oracle server直接交互。
  •服務器進程可以有共享和獨占兩種形式。
               
 


3-2:后臺進程(backgroung process)
  數據庫的物理結構與內存結構之間的交互要通過后臺進程來完成。數據庫的后臺進程包
 含兩類,一類是必須的,一類是可選的:
  •mandatory background processes

   |--dbwn(database writer):數據寫入
   |--pmon(process moniter):進程監控
   |--lgwr(log writer):日志寫入
   |--smon(system moniter):系統監控
   |--reco(recovery):恢復
   |--ckpt(chekpoint):檢查點
  •optional background processes
   |--arcn(archiver):歸檔
   |--lckn(lock):鎖
   |--dnnn(dispatcher):調度
   |--......
  可以用下面的語句查看正在運行的后臺進程:
  =========================================
  sql> select * from v$bgprocess where paddr<>'00';
  paddr      pserial# name  description                          
  -------- ---------- ----- -------------------------------
  6b0ed064          1 pmon  process cleanup                      
  6b0ed4e4          1 mman  memory manager                       
  6b0ed964          1 dbw0  db writer process 0                  
  6b0edde4          1 lgwr  redo etc.                            
  6b0ee264          1 ckpt  checkpoint                           
  6b0ee6e4          1 smon  system monitor process               
  6b0eeb64          1 reco  distributed recovery                 
  6b0eefe4          1 cjq0  job queue coordinator                
  6b0f01e4          1 qmnc  aq coordinator                       
  6b0f0664          1 mmon  manageability monitor process        
  6b0f0ae4          1 mmnl  manageability monitor process 2
  ========================================

 3-2-1:dbwr(database writer,數據寫入進程)
  將數據緩沖區的數據寫入數據文件,是負責數據緩沖區管理的一個后臺進程。
  當數據緩沖區中的一數據被修改后,就標記為dirty,dbwr進程將數據緩沖區中“臟”
 數據寫入數據文件,保持數據緩沖區的”干凈“。由于數據緩沖區的數據被用戶修改并占
 用,空閑數據緩沖區會不斷減少,當用戶進程要從磁盤讀取數據塊到數據緩沖區卻無法找
 到足夠的空閑數據緩沖區時,dbwr將數據緩沖區內容寫入磁盤,使用戶進程總可以得到足
 夠的空閑數據緩沖區。
  dbwr的作用:
  •管理數據緩沖區,以便用戶進程總能夠找到足夠的空閑緩沖區。
  •將所有修改后的緩沖區數據寫入數據文件。
  •使用lru(最近最少使用)算法保持緩沖區數據是最近經常使用的。
  •通過延遲寫來優化磁盤i/0讀寫。
  

 

 3-2-2:lgwr(log writer,日志寫入進程)
  將日志數據從日志緩沖區寫入磁盤日志文件組。數據庫在運行時,如果對數據庫進行修
 改則產生日志信息,日志信息首先產生于日志緩沖區。當日志達到一定數量時,由lgwr將
 將日志數據寫入到日志文件組,再經過日志切換,由歸檔進程(arch)將日志數據寫入歸
 檔進程(前提是數據庫運行在歸檔模式下)。數據庫遵循寫日志優先原則,即在寫數據之前
 先寫日志。
    

簡單介紹
  •arch(archiver,歸檔進程)
  oracle數據庫有兩種運行模式,歸檔(archivelog),非歸檔(noarchivelog)模式。
 以非歸檔模式運行時日志在切換時被直接覆蓋,不產生歸檔日志,這是數據庫默認的運行模
 式。數據庫運行在歸檔模式時,在日志切換之前,由arch進程將日志信息寫入磁盤,也就是
 自動備份在線日志。
  oracle數據庫的redo文件數量是有限的,所以oracle以循環的方式向它們中寫入。它順
 序寫滿每一個redo文件,當達到最后一個時,再循環回去開始填寫第一個redo文件。如果為
 了能恢復數據庫而想保存日志文件,那么在它們被重新使用之前需要對其進行備份,歸檔進
 程管理此工作。

 

  •ckpt(check point,檢查點進程)
  運行ckpt時,系統對全部數據文件及控制文件文件頭的同步信號進行修改,以保證數據
 庫的同步。檢查點出現在以下情況:
  |--在每個日志切換時產生。
  |--上一個檢驗點之后又經過了指定時間。
  |--從上一個檢驗點之后,當預定義數量的日志塊被寫入磁盤之后。
  |--數據庫關閉。
  |--dba強制產生。
  |--當表空間設置為offline時。

  •smon(system moniter,系統監控進程)
  smon在實例啟動時執行實例恢復,并負責清理不再使用的臨時段。

  •pmon(process monitor,進程監控)
  pmon在用戶進程出現故障時進行恢復,負責清理內存區域和釋放該進程所使用的資源。

  •reco(recovery,恢復進程)
  reco用于分布式數據庫維持在分布式環境中的數據的一致性。

  •lckn(lock,鎖進程)
  在并行服務器中用于多個實例間的封鎖。

  •dnnn(dispatcher,調度進程)
  dnnn存在于多線程服務器體系結構中,負責將用戶進程連接到服務器進程,再把結果返
  回給用戶進程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 余姚市| 资溪县| 通辽市| 景谷| 泗阳县| 哈密市| 刚察县| 盐边县| 安义县| 托克托县| 怀仁县| 中方县| 葵青区| 郑州市| 色达县| 中卫市| 安顺市| 沙河市| 普格县| 浮梁县| 静海县| 五家渠市| 榆中县| 乌鲁木齐市| 德令哈市| 贡觉县| 许昌县| 连南| 公安县| 彰化市| 沂南县| 枞阳县| 永寿县| 邹平县| 宕昌县| 施秉县| 固镇县| 桓台县| 丹江口市| 太仓市| 北碚区|