本文章爲轉載他人文章,方便我的查閱算法
=================================================================================數據庫
在本文裏你能夠了解如下內容編程
一、 ORACLE 實例——包括內存結構與後臺進程緩存
二、 ORACLE 數據庫——物理操做系統文件的集合安全
三、 瞭解內存結構的組成服務器
四、 瞭解後臺進程的做用網絡
五、 瞭解數據庫的物理文件多線程
六、 解釋各類邏輯結構oracle
1、ORACLE實例app
一、ORACLE 實例
System Global Area(SGA) 和 Background Process 稱爲數據庫的實例。
二、ORACLE 數據庫
一系列物理文件的集合(數據文件,控制文件,聯機日誌,參數文件等)
三、系統全局共享區System Global Area(SGA)
System Global Area 是一塊巨大的共享內存區域,他被看作是Oracle 數據庫的一個大緩衝池,這裏的數據能夠被ORACLE的各個進程共用。其大小能夠經過以下語句查看:
SQL> select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680
更詳細的信息能夠參考V$sgastat、V$buffer_pool
主要包括如下幾個部分:
a、 共享池(Shared pool)
共享池是SGA中最關鍵的內存片斷,特別是在性能和可伸縮性上。一個過小的共享池會扼殺性能,使系統中止,太大的共享池也會有一樣的效果,將會消耗大量的CPU來管理這個共享池。不正確的使用共享池只會帶來災難。共享池主要又能夠分爲如下兩個部分:
SQL語句緩衝(Library Cache)
當一個用戶提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程相似於編譯,會耗費相對較多的時間。在分析完這個SQL, Oracle會把他的分析結果給保存在Shared pool的Library Cache中,當數據庫第二次執行該SQL時,Oracle自動跳過這個分析過程,從而減小了系統運行的時間。這也是爲何第一次運行的SQL 比第二次運行的SQL要慢一點的緣由。
下面舉例說明parse的時間
SQL> select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
這是在Share_pool 和Data buffer 都沒有數據緩衝區的狀況下所用的時間
SQL> alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
從兩句SQL 的時間差上能夠看出該SQL 的Parse 時間約爲00:00:00.02
對於保存在共享池中的SQL語句,能夠從V$Sqltext、v$Sqlarea中查詢到,對於編程者來講,要儘可能提升語句的重用率,減小語句的分析時 間。一個設計的差的應用程序能夠毀掉整個數據庫的Share pool,提升SQL語句的重用率必須先養成良好的變成習慣,儘可能使用Bind變量。
數據字典緩衝區(Data Dictionary Cache)
顯而易見,數據字典緩衝區是ORACLE特意爲數據字典準備的一塊緩衝池,供ORACLE內部使用,沒有什麼能夠說的。
b、塊緩衝區高速緩存(Database Buffer Cache)
這些緩衝是對應全部數據文件中的一些被使用到的數據塊。讓他們可以在內存中進行操做。在這個級別裏沒有系統文件,,戶數據文件,臨時數據文件,回滾段文 件之分。也就是任何文件的數據塊都有可能被緩衝。數據庫的任何修改都在該緩衝裏完成,並由DBWR進程將修改後的數據寫入磁盤。
這個緩衝區的塊基本上在兩個不一樣的列表中管理。一個是塊的「髒」表(Dirty List),須要用數據庫塊的
書寫器(DBWR)來寫入,另一個是不髒的塊的列表(Free List),通常的狀況下,是使用最近最少使用 (Least Recently Used,LRU)算法來管理。塊緩衝區高速緩存又能夠細分爲如下三個部分(Default pool,Keep pool,Recycle pool)。若是不是人爲設置初始化參數(Init.ora),ORACLE將默認爲Default pool。因爲操做系統尋址能力的限制,不經過特殊設置,在32位的系統上,塊緩衝區高速緩存最大能夠達到1.7G,在64位系統上,塊緩衝區高速緩存最 大能夠達到10G。
c、重作日誌緩衝區(Redo log buffer)
重作日誌文件的緩衝區,對數 據庫的任何修改都按順序被記錄在該緩衝,而後由LGWR進程將它寫入磁盤。這些修改信息多是DML語句,如(Insert,Update, Delete),或DDL語句,如(Create,Alter,Drop等)。 重作日誌緩衝區的存在是由於內存到內存的操做比較內存到硬盤的速度快不少,因此重做日誌緩衝區能夠加快數據庫的操做速度,可是考慮的數據庫的一致性與可恢 復性,數據在重作日誌緩衝區中的滯留時間不會很長。因此重做日誌緩衝區通常都很小,大於3M以後的重做日誌緩衝區已經沒有太大的實際意義。
d、Java程序緩衝區(Java Pool)
Java 的程序區,Oracle 8I 之後,Oracle 在內核中加入了對Java的支持。該程序緩衝區就是爲Java 程序保留的。若是不用Java程序沒有必要改變該緩衝區的默認大小。
e、大池(Large Pool)
大池的得名不是由於大,而是由於它用來分配大塊的內存,處理比共享池更大的內存,在8.0開始引入。
下面對象使用大池:
MTS——在SGA的Large Pool中分配UGA
語句的並行查詢(Parallel Executeion of Statements)——容許進程間消息緩衝區的分配,用來協調 並行查詢服務器
備份(Backup)——用於RMAN磁盤I/O緩存
四、後臺進程(Background process)
後臺進程是Oracle的程序,用來管理數據庫的讀寫,恢復和監視等工做。Server Process主要是經過他和user process進行聯繫和溝通,並由他和user process進行數據的交換。在Unix機器上,Oracle後臺進程相對於操做系統進程,也就是說,一個Oracle後臺進程將啓動一個操做系統進 程;在Windows機器上, Oracle後臺進程相對於操做系統線程,打開任務管理器,咱們只能看到一個ORACLE.EXE的進程,可是經過另外的工具,就能夠看到包含在這裏進程 中的線程。
在Unix上能夠經過以下方法查看後臺進程:
ps –ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
oracle 29431 1 0 Sep 02 2:02 ora_dbwr_SID
oracle 29444 1 0 Sep 02 0:03 ora_ckpt_SID
oracle 29448 1 0 Sep 02 2:42 ora_smon_SID
oracle 29442 1 0 Sep 02 3:25 ora_lgwr_SID
oracle 29427 1 0 Sep 02 0:01 ora_pmon_SID
a、Oracle系統有5 個基本進程他們是
DBWR(數據文件寫入進程)
LGWR(日誌文件寫入進程)
SMON(系統監護進程)
PMON(用戶進程監護進程)
CKPT(檢查點進程,同步數據文件, 日誌文件,控制文件)
b、DBWR
將修改過的數據緩衝區的數據寫入對應數據文件
維護系統內的空緩衝區
這裏指出幾個容易錯誤的概念:
當一個更新提交後,DBWR把數據寫到磁盤並返回給用戶提交完成.
DBWR會觸發CKPT 後臺進程
DBWR不會觸發LGWR 進程
上面的概念都是錯誤的.
DBWR是一個很底層的工做進程,他批量的把緩衝區的數據寫入磁盤。和任何前臺用戶的進程幾乎沒有什麼關係,也不受他們的控制。至於DBWR會不會觸發LGWR和CKPT進程,咱們將在下面幾節裏討論。
DBWR工做的主要條件以下
DBWR 超時
系統中沒有多的空緩衝區用來存放數據
CKPT 進程觸發DBWR 等
c、LGWR
將重作日誌緩衝區的數據寫入重作日誌文件,LGWR是一個必須和前臺用戶進程通訊的進程。當數據被修改的時候,系統會產生一個重作日誌並記錄在重作日誌緩衝區內。這個重作日誌能夠相似的認爲是如下的一個結構:
SCN=000000001000
數據塊ID
對象ID=0801
數據行=02
修改後的數據=0011
提交的時候,LGWR必須將被修改的數據的重作日誌緩衝區內數據寫入日誌數據文件,而後再通知前臺進程提交成功,並由前臺進程通知用戶。從這點能夠看出LGWR承擔了維護系統數據完整性的任務。
LGWR 工做的主要條件以下
用戶提交
有1/3 重作日誌緩衝區未被寫入磁盤
有大於1M 重作日誌緩衝區未被寫入磁盤
超時
DBWR須要寫入的數據的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入
d、SMON
工做主要包含
清除臨時空間
在系統啓動時,完成系統實例恢復
聚結空閒空間
從不可用的文件中恢復事務的活動
OPS中失敗節點的實例恢復
清除OBJ$表
縮減回滾段
使回滾段脫機
e、PMON
主要用於清除失效的用戶進程,釋放用戶進程所用的資源。如PMON將回滾未提交的工做,釋放鎖,釋放分配給失敗進程的SGA資源。
f、CKPT
同步數據文件,日誌文件和控制文件,因爲DBWR/LGWR的工做原理,形成了數據文件,日誌文件,控制文件的不一至,這就須要CKPT進程來同步。CKPT會更新數據文件/控制文件的頭信息。
CKPT工做的主要條件以下
在日誌切換的時候
數據庫用immediate ,transaction , normal 選項shutdown 數據庫的時候
根據初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設置的數值來肯定
用戶觸發
如下進程的啓動須要手工配置
g、ARCH
當數據庫以歸檔方式運行的時候,Oracle會啓動ARCH進程,當重作日誌文件被寫滿時,日誌文件進行切換,舊的重作日誌文件就被ARCH進程複製到一個/多個特定的目錄/遠程機器。這些被複制的重作日誌文件被叫作歸檔日誌文件。
h、RECO
負責解決分佈事物中的故障。Oracle能夠鏈接遠程的多個數據庫,當因爲網絡問題,有些事物處於懸而未決的狀態。RECO進程試圖創建與遠程服務器的通訊,當故障消除後,RECO進程自動解決全部懸而未決的會話。
i、服務進程Server Process
服務進程的分類
專用服務進程(Dedicated Server Process)
一個服務進程對應一個用戶進程
共享服務進程(MultiTreaded Server Process)
一個服務進程對應多個用戶進程,輪流爲用戶進程服務。
PGA & UGA
PGA = Process Global Area
UGA = User Global Area
他保存了用戶的變量、權限、堆棧、排序空間等用戶信息,對於專用服務器進程,UGA在PGA中分配。對於多線程進程,UGA在Large pool中分配。
j、用戶進程User Process
在客戶端,將用戶的SQL 語句傳遞給服務進程
五、一個貫穿數據庫全局的概念----系統改變號SCN(System Change Number)
系統改變號,一個由系統內部維護的序列號。當系統須要更新的時候自動增長,他是系統中維持數據的一致性和順序恢復的重要標誌。
a. 查詢語句不會使SCN增長,就算是同時發生的更新,數據庫內部對應的SCN也是不一樣的。這樣一來就保證了數據恢復時候的順序。
b. 維持數據的一致性
2、ORACLE 數據庫
ORACLE數據庫的組成——物理操做系統文件的集合。主要包括如下幾種。
一、控制文件(參數文件init.ora記錄了控制文件的位置)
控制文件包括以下主要信息
數據庫的名字,檢查點信息,數據庫建立的時間戳
全部的數據文件,聯機日誌文件,歸檔日誌文件信息
備份信息等
有了這些信息,Oracle就知道那些文件是數據文件,如今的重作日誌文件是哪些,這些都是系統啓動和運行的基本條件,因此他是Oracle運行的根本。若是沒有控制文件系統是不可能啓動的。控制文件是很是重要的,通常採用多個鏡相
控制文件的丟失,將使數據庫的恢復變的很複雜。
控制文件信息能夠從V$Controlfile中查詢得到
二、數據文件(數據文件的詳細信息記載在控制文件中)
能夠經過以下方式查看數據文件
SQL> select name from v$datafile;
NAME
---------------------------------------------
/u05/dbf/PROD/system_01.dbf
/u06/dbf/PROD/temp_01.dbf
/u04/dbf/PROD/users_01.dbf
/u09/dbf/PROD/rbs_01.dbf
/u06/dbf/PROD/applsys_indx_01.dbf
/u05/dbf/PROD/applsys_data_01.dbf
從以上能夠看出,數據文件大體能夠分爲如下幾類:
i. 系統數據文件(system_01.dbf)
存放系統表和數據字典,通常不放用戶的數據,可是用戶腳本,如過程,函數,包等倒是保存在數據字典中的。
名詞解釋:數據字典 數據字典是一些系統表或視圖,他存放系統的信息,他包括數據庫版本,數據文件信息,表與索引等段信息,系統的運行狀態等各類和系統有關的信息和用戶腳本信息。數據庫管理員能夠經過對數據字典的查詢,就能夠了解到Oracle的運行狀態。
ii. 回滾段文件(rbs_01.dbf)
若是數據庫進行對數據的修改,那麼就必須使用回滾段,回滾段是用來臨時存放修改前的數據(Before Image)。回滾段一般都放在一個單獨的表空間上(回滾表空間),避免表空間碎片化,這個表空間包含的數據文件就是回滾數據文件。
iii. 臨時數據文件(temp_01.dbf)
主要存放用戶的排序等臨時數據,與回滾段類似,臨時段也容易引發表空間碎片化,並且沒有辦法在一個永久表空間上開闢臨時段,因此就必須有一個臨時表空間,它所包含的數據文件就是臨時數據文件,主要用於不能在內存上進行的排序操做。咱們必須爲用戶指定一個臨時表空間。
iv. 用戶數據文件(/applsys_data_01.dbf ,applsys_indx_01.dbf)
存放用戶數據,這裏列舉了兩類常見的用戶型數據,通常數據和索引數據,通常來講,若是條件許可的話,能夠考慮放在不一樣的磁盤上。
三、重作日誌文件(聯機重作日誌)
用戶對數據庫進行的任何操做都會記錄在重作日誌文件。在瞭解重作日誌以前必須瞭解重作日誌的兩個概念,重作日誌組和重作日誌組成員(Member),一 個數據庫中至少要有兩個日誌組文件,一組寫完後再寫另外一組,即輪流寫。每一個日誌組中至少有一個日誌成員,一個日誌組中的多個日誌成員是鏡相關係,有利於日 志文件的保護,由於日誌文件的損壞,特別是當前聯機日誌的損壞,對數據庫的影響是巨大的。
聯機日誌組的交換過程叫作切換,須要特別注意的是,日誌切換在一個優化效果很差的數據庫中會引發臨時的「掛起」。掛起大體有兩種狀況:
在歸檔狀況下,須要歸檔的日誌來不及歸檔,而聯機日誌又須要被從新利用
檢查點事件尚未完成(日誌切換引發檢查點),而聯機日誌須要被從新利用
解決這種問題的經常使用手段是:
i.增長日誌組
ii.增大日誌文件成員大小
經過v$log能夠查看日誌組,v$logfile能夠查看具體的成員文件。
四、歸檔日誌文件
Oracle能夠運行在兩種模式之中,歸檔模式和不歸檔模式。若是不用歸檔模式,固然,你就不會有歸檔日誌,可是,你的系統將不會是一個實用系統,特別 是不能用於生產系統,由於你可能會丟失數據。可是在歸檔模式中,爲了保存用戶的全部修改,在重作日誌文件切換後和被覆蓋之間系統將他們另外保存成一組連續 的文件系列,該文件系列就是歸檔日誌文件。
有人或許會說,歸檔日誌文件佔領我大量的硬盤空間,其實,具體想想,你是願意浪費一點磁盤空間來 保護你的數據,仍是願意丟失你的數據呢?顯而義見,咱們須要保證咱們的數據的安全性。其實,歸檔並非一直佔領你的磁盤空間,你能夠把她備份到磁帶上,或 則刪除上一次完整備份前的全部日誌文件。
五、初始化參數文件
initSID.ora或init.ora文件,由於版 本的不同,其位置也可能會不同。在8i中,一般位於$ORACLE_HOME/admin//Pfile下,初始化文件記載了許多數據庫的啓動參數, 如內存,控制文件,進程數等,在數據庫啓動的時候加載(Nomount時加載),初始化文件記錄了不少重要參數,對數據庫的性能影響很大,若是不是很了 解,不要輕易亂改寫,不然會引發數據庫性能降低。
六、其餘文件
i . 密碼文件
用於Oracle 的具備sysdba權限用戶的認證.
ii. 日誌文件
報警日誌文件(alert.log或alrt.ora)
記錄數據庫啓動,關閉和一些重要的出錯信息。數據庫管理員應該常常檢查這個文件,並對出現的問題做出即便的反應。你能夠經過如下SQL 找到他的路徑select value from v$PARAMETER where name ="background_dump_dest";
後臺或用戶跟蹤文件
系統進程或用戶進程出錯前寫入的信息,通常不可能讀懂,能夠經過ORACLE的TKPROF工具轉化爲能夠讀懂的格式。對於系統進程產生的跟蹤文件與報 警日誌文件的路徑同樣,用戶跟蹤文件的路徑,你能夠經過如下SQL找到他的路徑select value from v$PARAMETER where name ="user_dump_dest";
3、ORACLE邏輯結構
一、 表空間(tablespace)
表空間是數據庫中的基本邏輯結構,一系列數據文件的集合。一個表空間能夠包含多個數據文件,可是一個數據文件只能屬於一個表空間。
二、 段(Segment)
段是對象在數據庫中佔用的空間,雖然段和數據庫對象是一一對應的,但段是從數據庫存儲的角度來看的。一個段只能屬於一個表空間,固然一個表空間能夠有多個段。
表空間和數據文件是物理存儲上的一對多的關係,表空間和段是邏輯存儲上的一對多的關係,段不直接和數據文件發生關係。一個段能夠屬於多個數據文件,關於段能夠指定擴展到哪一個數據文件上面。
段基本能夠分爲如下四種
數據段(Data Segment)
索引段(Index Segment)
回滾段(Rollback Segment)
臨時段(Temporary Segment)
三、區間(Extent)
關於Extent的翻譯有多種解釋,有的譯做擴展,有的譯做盤區,我這裏一般譯爲區間。在一個段中能夠存在多個區間,區間是爲數據一次性預留的一個較大 的存儲空間,直到那個區間被用滿,數據庫會繼續申請一個新的預留存儲空間,即新的區間,一直到段的最大區間數(Max Extent)或沒有可用的磁盤空間能夠申請。 在ORACLE8i以上版本,理論上一個段能夠無窮個區間,可是多個區間對ORACLE倒是有性能影響的,ORACLE建議把數據分佈在儘可能少的區間上, 以減小ORACLE的管理與磁頭的移動。
四、Oracle數據塊(Block)
ORACLE最基本的存儲單位,他是OS數據塊的整數倍。ORACLE的操做都是以塊爲基本單位,一個區間能夠包含多個塊(若是區間大小不是塊大小的整數倍,ORACLE實際也擴展到塊的整數倍)。
五、基本表空間介紹
a. 系統表空間
主要存放數據字典和內部系統表基表
查看數據數據字典的SQL
select * from dict
查看內部系統表的SQL
select * from v$fixed_view_definition
DBA對系統的系統表中的數據字典必須有一個很深入的瞭解,他們必須準備一些基礎的SQL語句,經過這些SQL能夠當即瞭解系統的情況和數據庫的狀態,這些基本的SQL包括
系統的剩餘空間
系統的SGA
狀態系統的等待
用戶的權限
當前的用戶鎖
緩衝區的使用情況等
在成爲DBA 的道路上咱們不建議你過度的依賴於OEM/Quest 等優秀的數據庫管理工具,由於他們不利於你對數據數據字典的理解,SQL語句能夠完成幾乎所有的數據庫管理工做。
大量的讀少許的寫是該表空間的一個顯著的特色。
b. 臨時表空間.
臨時表空間顧名思義是用來存放臨時數據的,例如排序操做的臨時空間,他的空間會在下次系統啓動的時候所有被釋放。
c. 回滾段表空間
i. 回滾段在系統中的做用
當數據庫進行更新插入刪除等操做的時候,新的數據被更新到原來的數據文件,而舊的數據(Before Image)就被放到回滾段中,若是數據須要回滾,那麼能夠從回滾段將數據再複製到數據文件中。來完成數據的回滾。在系統恢復的時候, 回滾段能夠用來回滾沒有被commit 的數據,解決系統的一至性。
回滾段在什麼狀況下都是大量的寫,通常是少許讀,所以建議把回滾段單獨出來放在一個單獨的設備(如單獨的磁盤或RAID),以減小磁盤的IO爭用。
ii. 回滾段的工做方式
一個回滾表空間能夠被劃分紅多個回滾段.
一個回滾段能夠保存多個會話的數據.
回滾段是一個圓形的數據模型
假設回滾段由4 個區間組成,他們的使用順序就是區間1à區間2à區間3à區間4à區間1。也就是說,區間是能夠循環使用的,當區間4到區間1的時候,區間1裏面的會話尚未結束, 區間4用完後就不能再用區間1,這時系統必須分配區間5,來繼續爲其餘會話服務服務。
咱們分析一個Update 語句的完成
①. 用戶提交一個Update 語句
②. Server Process 檢查內存緩衝.
若是沒有該數據塊的緩衝,則從磁盤讀入
i. 若是沒有內存的有效空間,DBWR被啓動將未寫入磁盤的髒緩衝寫入磁盤
ii. 若是有有效空間,則讀入
③. 在緩衝內更新數據
i. 申請一個回滾段入口,將舊數據寫如回滾段
ii. 加鎖並更新數據
iii. 並在同時將修改記錄在Redo log buffer中