oracle數據庫對象的邏輯、物理、內存結構

1、先談談數據庫和實例:html

實例是個動態概念,它由一系列進程和內存區域組成;而數據庫是個靜態概念,主要指的是構成數據庫的一系列文件。通常狀況下實例與數據庫是一對一的,可是在多實例數據庫環境下,一個數據庫能夠對應多個實例。
實例 instance =進程 + 進程所使用的內存(SGA)
數據庫 database=物理操做系統文件或磁盤(disk)的集合(redo文件+control文件+data文件+臨時文件)
數據庫實例也稱做服務器, 是用來訪問數據庫文件集的存儲結構及後臺進程的集合.
一、一個數據庫能夠被多個實例訪問(稱爲真正的應用羣集選項).
二、一個實例在其生存期內只能裝載(alter database mount)和打開(alter database open)一個數據庫
三、Oracle的實例在啓動之後,只能load一次數據庫,若是想把數據庫與Instance斷開,而後再從新掛在一個數據庫Instance,那麼就須要你首先把數據庫Instance進程結束,而後從新創建這個instance的一個進程,再load另一個數據庫。不然確定要拋除ORA-16169錯誤,說數據庫已經被打開。由於一個數據庫Instance在其生存期中最多隻能load和打開一個instance。.
四、另外實例能夠在沒有數據文件的狀況下單獨啓動 startup nomount , 一般沒什麼意義。sql

2、數據庫的邏輯和物理結構數據庫

數據庫(實例)——X表空間——X段——X擴展(區)——X數據塊--(OS Block)
對應的數據字典:
v$database--dba_tablespaces(user_tablespaces)-- dba_segments(user_segments)--dba_extents(user_Extents)--extent(或segment)表中的一個字段BLOCKS
數據庫、表空間、段、擴展、數據塊爲邏輯結構
數據文件(dba_data_files)、操做系統塊爲物理結構安全

數據文件有如下類型:服務器

1.數據文件(Data File) 
   數據文件用來存儲數據庫中的所有數據,例如數據庫表中的數據和索引數據.一般覺得*.dbf格式,例如:userCIMS.dbf 。
2.日誌文件(Redo Log File) 
   日誌文件用於記錄數據庫所作的所有變動(如增長、刪除、修改)、以便在系統發生故障時,用它對數據庫進行恢復。名字一般爲Log*.dbf格式,如:Log1CIMS.dbf,Log2CIMS.dbf 。  
3.控制文件(Control File) 
    每一個Oracle數據庫都有相應的控制文件,它們是較小的二進制文件,用於記錄數據庫的物理結構,如:數據庫名、數據庫的數據文件和日誌文件的名字和位置等信息。用於打開、存取數據庫。名字一般爲Ctrl*ctl 格式,如Ctrl1CIMS.ctl。  
4.配置文件 
   配置文件記錄Oracle數據庫運行時的一些重要參數,如:數據塊的大小,內存結構的配置等。名字一般爲init*.ora 格式,如:tnsname.ora 。  

段(segment)是一種在數據庫中消耗物理存儲空間的任何實體,在12c中段的類型由:表(table),索引(Index), 回滾(Rollback),分區等12種組成,下面的sql可查看全部段的類型。oracle

SQL> select distinct segment_type from dba_segments;

SEGMENT_TYPE
------------------------------------------------------
LOBINDEX
INDEX PARTITION
TABLE SUBPARTITION
ROLLBACK
TABLE PARTITION
NESTED TABLE
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
TYPE2 UNDO

SEGMENT_TYPE
------------------------------------------------------
CLUSTER

已選擇12行。

表和段的關係:表是段的一種(一個表可對應一個或多個段),但段不必定是表。表是邏輯對象;段是物理存儲對象app

經過下面的sql語句能夠查看某個表空間的段、區、塊的分佈狀況。分佈式

SQL> set pagesize 100; 
SQL> col SEGMENT_NAME format a20
SQL> select SEGMENT_NAME, extent_id,block_id,blocks,bytes  from dba_extents where  tablespace_name='USERS';


SEGMENT_NAME	      EXTENT_ID   BLOCK_ID     BLOCKS	   BYTES
-------------------- ---------- ---------- ---------- ----------
OJDS$PERM_INDEX 	      0        168	    8	   65536
OJDS$NODE_INDEX 	      0        136	    8	   65536
SYS_C005161		      0        152	    8	   65536
OJDS$PERMISSIONS$	      0        160	    8	   65536
OJDS$INODE$		      0        128	    8	   65536
OJDS$BINDINGS$		      0        144	    8	   65536
PK_EMP			      0        200	    8	   65536
PK_DEPT 		      0        184	    8	   65536
SALGRADE		      0        216	    8	   65536
BONUS			      0        208	    8	   65536
EMP			      0        192	    8	   65536
DEPT			      0        176	    8	   65536

已選擇12行。

DBA_TABLESPACES記錄的是表空間的邏輯信息,而DBA_DATA_FILES視圖則記錄的是物理數據文件的信息,這些信息包括數據文件的名稱、大小、所屬表空間等信息:性能

SQL> select file_id,relative_fno,file_name,tablespace_name,round(bytes/1024/1024,2) MB from dba_data_files;
SQL> select FILE_ID as fid,FILE_NAME ,BYTES from dba_data_files;

       FID FILE_NAME						   BYTES
---------- -------------------------------------------------- ----------
	 4 /u01/app/oracle/oradata/XE/users.dbf 	       104857600
	 2 /u01/app/oracle/oradata/XE/sysaux.dbf	       681574400
	 3 /u01/app/oracle/oradata/XE/undotbs1.dbf		31457280
	 1 /u01/app/oracle/oradata/XE/system.dbf	       377487360
	 5 /u01/app/oracle/oradata/XE/mymotif_ts.dbf	       104857600

能夠經過DBA_SEGMENTS查詢數據庫中段的信息,這些信息包括對象名稱、類型、所屬表空間、空間使用等信息。DBA_EXTENTS視圖記錄了Segment中區的分配狀況,能夠經過如下兩個查詢得到某個用戶每一個區的分配狀況:spa

SQL> select distinct OWNER from dba_extents ;

OWNER
--------------------------------------------------------------------------------
APEX_040200
MDSYS
MYMOTIF
OUTLN
CTXSYS
SYSTEM
AUDSYS
DVSYS
SCOTT
GSMADMIN_INTERNAL
ORDSYS
DBSNMP
OJVMSYS
ORDDATA
XDB
SYS
LBACSYS
WMSYS

已選擇18行。
SQL> col SEGMENT_NAME format a20
SQL> select segment_name,file_id,extent_id,block_id,blocks from dba_extents where OWNER='SCOTT';

SEGMENT_NAME		FILE_ID  EXTENT_ID   BLOCK_ID	  BLOCKS
-------------------- ---------- ---------- ---------- ----------
SALGRADE		      6 	 0	  216	       8
PK_EMP			      6 	 0	  200	       8
PK_DEPT 		      6 	 0	  184	       8
EMP			         6 	   0	  192	       8
DEPT			      6 	 0	  176	       8
BONUS			      6 	 0	  208	       8

已選擇6行。

數據庫邏輯上最小的單元就是data block, block 能夠設置爲2K, 4K, 8K....

利用dba_tablespaces能夠用來查看全部表空間的基本信息;而dba_data_files能夠用來查看相關數據文件的信息(須要管理員權限)。

例:

一、查看當前數據庫全部表空間:

SQL> select TABLESPACE_NAME from dba_tablespaces;

TABLESPACE_NAME
---------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
MYMOTIF_TS

已選擇6行。

二、查詢當前數據庫中的全部表空間和對應的操做系統數據文件:

SQL> col FILE_NAME format a40
SQL> select file_name,tablespace_name from dba_data_files;

FILE_NAME				 TABLESPACE_NAME
---------------------------------------- ---------------
/u01/app/oracle/oradata/xe/system01.dbf  SYSTEM
/u01/app/oracle/oradata/xe/sysaux01.dbf  SYSAUX
/u01/app/oracle/oradata/mymotif_ts.dbf	 MYMOTIF_TS
/u01/app/oracle/oradata/xe/users01.dbf	 USERS
/u01/app/oracle/oradata/xe/undotbs01.dbf UNDOTBS1

三、當前用戶(scott)下的數據段:

SQL>  desc user_segments
 名稱                                    是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 SEGMENT_NAME					    VARCHAR2(128)
 PARTITION_NAME 				    VARCHAR2(128)
 SEGMENT_TYPE					    VARCHAR2(18)
 SEGMENT_SUBTYPE				    VARCHAR2(10)
 TABLESPACE_NAME				    VARCHAR2(30)
 BYTES						    NUMBER
 BLOCKS 					    NUMBER
 EXTENTS					    NUMBER
 INITIAL_EXTENT 				    NUMBER
 NEXT_EXTENT					    NUMBER
 MIN_EXTENTS					    NUMBER
 MAX_EXTENTS					    NUMBER
 MAX_SIZE					    NUMBER
 RETENTION					    VARCHAR2(7)
 MINRETENTION					    NUMBER
 PCT_INCREASE					    NUMBER
 FREELISTS					    NUMBER
 FREELIST_GROUPS				    NUMBER
 BUFFER_POOL					    VARCHAR2(7)
 FLASH_CACHE					    VARCHAR2(7)
 CELL_FLASH_CACHE				    VARCHAR2(7)
 INMEMORY					    VARCHAR2(8)
 INMEMORY_PRIORITY				    VARCHAR2(8)
 INMEMORY_DISTRIBUTE				    VARCHAR2(15)
 INMEMORY_DUPLICATE				    VARCHAR2(13)
 INMEMORY_COMPRESSION				    VARCHAR2(17)

SQL> column  TABLESPACE_NAME format a20
SQL> column  SEGMENT_NAME format a20
SQL> select SEGMENT_NAME,TABLESPACE_NAME from user_segments;

SEGMENT_NAME	     TABLESPACE_NAME
-------------------- --------------------
COURSE		     MYMOTIF_TS
SC		     MYMOTIF_TS
STUDENT 	     MYMOTIF_TS
SYS_C0010000	     MYMOTIF_TS
SYS_C0010005	     MYMOTIF_TS
SYS_C0010008	     MYMOTIF_TS

已選擇6行。
(12c在sysdba下有3000多條記錄)
SQL>  select SEGMENT_NAME,EXTENT_ID from user_extents;

SEGMENT_NAME	      EXTENT_ID
-------------------- ----------
STUDENT 		      0
COURSE			      0
SC			      0
SYS_C0010000		      0
SYS_C0010005		      0
SYS_C0010008		      0

已選擇6行。
(12c在sysdba下有4920條記錄)

基本上每一個對象對應一個段( Segment),只有分區對應多個段,這裏的對象包括表、視圖、序列、贊成詞、索引、觸發器、存儲.過程等等,段能夠跨越多個數據文件。

查看錶空間的使用狀況

SQL> col TABLESPACE_NAME format a20
SQL> SELECT a.tablespace_name,a.bytes total,b.bytes used,c.bytes free,(b.bytes * 100) / a.bytes "% USED ",(c.bytes * 100) / a.bytes "% FREE " FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = c.tablespace_name;

TABLESPACE_NAME 	  TOTAL       USED	 FREE	 % USED     % FREE
-------------------- ---------- ---------- ---------- ---------- ----------
SYSAUX		      765460480  705232896   59899904 92.1318493 7.82534247
UNDOTBS1	      104857600   67502080   36306944	  64.375     34.625
USERS			5242880     786432    3407872	      15	 65
SYSTEM		      838860800  829095936    8716288 98.8359375  1.0390625
MYMOTIF_TS	      104857600   15663104   99483648	 14.9375     94.875

3、Oracle Server系統進程與內存結構  

  當在計算機服務器上啓動Oracle數據庫後,稱服務器上啓動了一個Oracle實例(Instance)。ORACLE 實例(Instance)是存取和控制數據庫的軟件機制,它包含系統全局區(SGA)和ORACLE進程兩部分。SGA是系統爲實例分配的一組共享內存緩衝區,用於存放數據庫實例和控制信息,以實現對數據庫中數據的治理和操做。  
  進程是操做系統中一個極爲重要的概念。一個進程執行一組操做,完成一個特定的任務.對ORACLE數據庫治理系統來講,進程由用戶進程、服務器進程和後臺進程所組成。  
  當用戶運行一個應用程序時,系統就爲它創建一個用戶進程。服務器進程處理與之相連的用戶進程的請求,它與用戶進程相通信,爲相連的用戶進程的ORACLE請求服務。  
  爲了提升系統性能,更好地實現多用戶功能,ORACLE還在系統後臺啓動一些後臺進程,用於數據庫數據操做。  

       系統進程的後臺進程主要包括:

  SMON 系統監控進程:(system monitor)負責完成自動實例恢復和回收分類(sort)表空間。 
  PMON 進程監控進程:(PRocess monitor)實現用戶進程故障恢復、清理內存區和釋放該進程所需資源等。 
  DBWR 數據庫寫進程:數據庫緩衝區的治理進程。
在它的治理下,數據庫緩衝區中總保持有必定數量的自由緩衝塊,以確保用戶進程總能找到供其使用的自由緩衝塊。 
  LGWR 日誌文件寫進程:是日誌緩衝區的治理進程,負責把日誌緩衝區中的日誌項寫入磁盤中的日誌文件上。每一個實例只有一個LGWR進程。
  ARCH 歸檔進程:(archiver process)把已經填滿的在線日誌文件拷貝到一個指定的存儲設備上。僅當日志文件組開關(switch)出現時,才進行ARCH操做。ARCH不是必須的,而只有當自動歸檔可以使用或者當手工歸檔請求時才發出。
  RECO 恢復進程:是在具備分佈式選項時使用的一個進程,主要用於解決引用分佈式事務時所出現的故障。它只能在答應分佈式事務的系統中出現。
  LCKn 封鎖進程:用於並行服務器系統,主要完成實例之間的封鎖。 

內存結構(SGA)

  SGA是Oracle爲一個實例分配的一組共享內存緩衝區,它包含該實例的數據和控制信息。SGA在實例啓動時被自動分配,當實例關閉時被收回。數據庫的全部數據操做都要經過SGA來進行。

SQL> show parameter sga_max_size;

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
sga_max_size                         big integer                       3232M
SQL> show parameter pga_aggregate_target;

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
pga_aggregate_target                 big integer
SQL> select * from v$sga;

NAME								  VALUE
------------------------------------------------------------ ----------
Fixed Size							2228848
Variable Size						      251661712
Database Buffers					      343932928
Redo Buffers							3448832

  
SGA中內存根據存放信息的不一樣,能夠分爲以下幾個區域:
一、Buffer Cache:存放數據庫中數據庫塊的拷貝。
    它是由一組緩衝塊所組成,這些緩衝塊爲全部與該實例相連接的用戶進程所共享。緩衝塊的數目由初始化參數DB_BLOCK_BUFFERS肯定,緩衝塊的大小由初始化參數DB_BLOCK_SIZE肯定。大的數據塊可提升查詢速度。它由DBWR操做。

二、日誌緩衝區Redo Log Buffer:存放數據操做的更改信息。
    它們以日誌項(redo entry)的形式存放在日誌緩衝區中。當須要進行數據庫恢復時,日誌項用於重構或回滾對數據庫所作的變動。日誌緩衝區的大小由初始化參數LOG_BUFFER肯定。大的日誌緩衝區可減小日誌文件I/O的次數。後臺進程LGWR將日誌緩衝區中的信息寫入磁盤的日誌文件中,可啓動ARCH後臺進程進行日誌信息歸檔。
三、共享池Shared Pool:包含用來處理的SQL語句信息。
    它包含共享SQL區和數據字典存儲區。共享SQL區包含執行特定的SQL語句所用的信息。數據字典區用於存放數據字典,它爲全部用戶進程所共享。
四、Cursors:一些內存指針,執行待處理的SQL語句 
五、其餘信息區:除了上述幾個信息區外,還包括一些進程之間的通信信息(如封鎖信息);在多線索服務器配置下,還有一些程序全局區的信息,請求隊列和響應隊列等。

--------------------------------------------------------------------------

後臺進程詳解

 

oracle中的進程共分爲三類:用戶進程、服務進程、後臺進程。其中後臺進程伴隨實例的啓動而啓動,他們主要是維護數據庫的穩定,至關於一個企業中的管理者及內部服務人員。他們並不會直接給用戶提供服務。


1:database write(DBWn(n表明數字1..n,表示可能有幾個DBW在運行) )--數據寫入
   做用:把SGA中被修改的數據同步到磁盤文件中。保證Buffer Cache中有足夠的空閒數據塊數量。
   觸發條件: 1)、檢查點 2)、一個服務進程在設定的時間內沒有找到空閒塊3)、每三秒自動喚醒一次。
   設置:DB_WRITER_PROCESS用來定義DBWn進程數量。(commit命令只是把記錄修改寫入日誌文件,不是把修改後的數據寫入數據文件)

2:log write(LGWR)--日誌文件寫入
   做用:把log buffer中的日誌內容寫入聯機的日誌文件中,釋放log用戶buffer空間。
   觸發條件:

           1)、用戶發出commit命令。(在oracle中稱爲快速提交機制(fast commit)):把redo log buffer中的記錄寫入日誌文件,寫入一條提交的記錄
            2)三秒定時喚醒。
            3)log buffer超過1/3,或日誌數量超過1M。
            4)DBWR進程觸發:DBWn視圖將髒數據塊寫入磁盤先檢測他的相關redo記錄是否寫入聯機日誌文件,若是沒有就通知LGWR進程。在oracle中成爲提早寫機制(write ahead):redo記錄先於數據記錄被寫入磁盤

3:checkpoint(CKPT)-檢查點事件
   做用:維護數據庫一致性狀態。檢測點時刻數據文件與SGA中的內容一致,這不是一個單獨的進程,要和前兩個進程一塊兒工做呦。DBWR寫入髒數據,同時觸發LGWR進程。
      CKPT更新控制文件中的檢查點記錄。
   觸發條件:日誌切換(log switch)會觸發檢查點。

4:process monitor(PMON)--進程監控
   做用:1)發現用戶進程異常終止,並進行清理。釋放佔用資源。(清理異常終止用戶使用的鎖)
           2)向監聽程序動態的註冊實例。
   觸發條件:定時被喚醒,其餘進程也會主動喚醒它。

5:system monitor:(SMON)--系統監控
   做用:1)負責實例恢復,前滾(Roll Forward)恢復到實例關閉的狀態,使用最後一次檢查點後的日誌進程重作。這時包括提交和未提交的事務。打開數據庫,進行回滾(Roll Back):回滾未提交的事務。(oracle承諾commit以後數據不會丟失,如今咱們能夠大體的瞭解是如何實現這個承諾,以及在數據的安全性和數據庫性能之間的平衡選擇。)
        2)負責清理臨時段,以釋放空間

觸發條件:按期被喚醒或者被其餘事務主動喚醒。

6:archive:(ARCn)--歸檔操做
   做用:發生日誌切換時把寫滿的聯機日誌文件拷貝到歸檔目錄中。
   觸發條件:日誌切換時被LGWR喚醒。
   設置:LOG_ARCHIVE_MAX_PROCESSES能夠設置oracle啓動的時候ARCn的個數。

7:manageability monitor:MMON--AWR主要的進程
   做用:一、收集AWR必須的統計數據,把統計數據寫入磁盤。10g中保存在SYSAUX表空間中。
          二、生成server--generated報警
   每小時把shared pool中的統計信息寫入磁盤,或者shared pool佔用超過15%。

8:manageability monitor light:MMNL:輕量級的MMON

9:memory manager:MMAN:自動內容管理
   做用:每分鐘都檢查AWR性能信息,並根據這些信息來決定SGA組件最佳分佈。
   設置:STATISTICS_LEVEL:統計級別
        SGA_TARGET:SGA總大小

10:job queue coordinator:CJQ0--數據庫定時任務

11:recover writer:RVWR
   做用:爲flashback database提供日誌記錄。把數據塊的前鏡像寫入日誌。

12:change tarcking writer:CTWR
   做用:跟蹤數據塊的變化,把數據塊地址記錄到 change_tracking file文件中。RMAN的增量備份將使用這個文件來肯定那些數據塊發生了變化,並進行備份。

以上是oracle中比較常見的後臺進程,不是全部的進程。其中DBWn,ARCn能夠設置數據庫啓動時的數量。這些進程在系統中能夠不止一個。

 





Oracle體系結構詳解

相關文章
相關標籤/搜索