體系架構概念
·系統的體系架構指系統有哪些組成部分,以及這些組成部分之間的關系。
·Oracle的體系架構,是指Oracle數據庫管理系統的組成部分和這些組成部分之間的相互關系,如進程(程序,如word,excel都算是一個進程)、內存、數據庫的物理與邏輯結構等。
Oracle引入體系架構原因
·為了高效地使用計算機最寶貴的資源:內存,同時保證不會丟失數據庫中的任何數據。所以Oracle引入了一個非常復雜的體系結構。
問題:為什么計算機中內存是最寶貴的?
·訪問內存中的數據是電子速度,硬盤是機械速度,電子速度遠遠大于機械速度。在內存中計算的速度是最快的。如計算得到一個結果,先放到硬盤中,要的時候再從硬盤中讀取;第二種:先將結果放到內存中,要的時候再從內存中讀取,后者的速度要快很多。而用戶都需要速度快(如游戲加載的時間都希望越短越好)。
·內存是有限的,同時內存也比硬盤昂貴
系統架構基礎
·基礎:程序運行以后 = 進程(process) + 內存 + 讀取的文件 (如WORD)
·擴展:Oracle運行以后,要用程序要管理數據庫文件,所以它的結構變為
·Oracle = (程序部分)+(數據部分)
·程序部分 = 進程(instance,實例)+內存(SGA+PGA)
Oracle體系架構分為實例和數據庫,而實例分為內存和進程。
下面先來看看內存,理解內存組成和作用。
SGA:system global area(系統全局區,全局就是都能訪問,如全局變量),指所有程序都能共享的內存區。
共享SQL編譯結果:大家知道,運行SQL真正運行前要先編譯、分析而且消耗的時間很長,所以編譯分析的結果保留在服務器的內存中;一個用戶登錄可能執行:select * from 用戶表 where 帳號=? and 密碼=?;另一個用戶登錄時執行SQL就不會再編譯分析了,直接取前一個用戶的編譯分析結果。這叫共享。
共享數據字典:還有查詢時需要表結構(如 select * from stu,*在查詢時要取出stu表真正的字段。如果一個用戶最先查詢時,則必須取;另一個用戶再查詢時就不需要再取了。一個表的有哪些字段,這是數據字典中的一個部分。)
PGA:program global area(程序全局區)。程序一登錄時和數據庫要連接,數據庫就為這個程序單獨分區一塊小的專用內存。程序一與數據庫斷開,則內存釋放。
作用:SGA和PGA都是內存,通常由DBA用來設計大小,從而調整數據庫的速度(性能)。一般程序員用不著。
PGA和SGA區別
·SGA相當于公司(數據庫)的大廳;PGA相當于會客室。
·SGA是在數據庫啟動時自動分配。PGA是在客戶端程序與數據庫連接自動分配。
·SGA通常較大,PGA較小。
SGA組成 = 日志~ + 數據~ + 共享池 + 大池
日志緩沖區
·重做日志(增刪改):每次修改數據(增刪改)時,除了要在表中寫入數據外,還要在日志文件中記錄相關信息。Oracle將日志先寫到內存,積累到一定數量,再一次性寫入到磁盤,從而提高了效率。(為什么會提高效率?因為寫入內存的速度>磁盤的速度)。所以加大日志緩沖區的設置,可以提高增刪改的速度。
·數據緩沖區(查):第一個用戶查詢商品信息,數據必須從磁盤上讀取;Oracle可以將查詢的數據保存內存中,其它用戶查詢商品則直接從內存中讀取,從而提高查詢效率。這個內存區叫~。從數據緩沖區中讀取數據,又叫緩存命中率(cache hit)。所以加大數據緩沖區,可以提高查詢速度(因為減少磁盤讀取而加快)。
·共享池(語句):主要的作用是保存了SQL的編譯結果,從而執行相同的SQL語句不需要再次編譯,節約了CPU資源。所以加大共享緩沖區,可以提高查詢速度(因為減少SQL的分析時間而加快)。
·大池:主要為大的內存操作提供相對獨立的操作空間,如數據庫的備份和恢復。所以加大大池區,可以提高備份和恢復速度。
PGA = 排序區 + 會話信息 + 游標狀態 + 堆棧空間 (了解)
·排序區:某個程序發出了order by語句,將臨時排好順序的數據放在此區。就象是要將公司員工的工資進行排序,就要在草稿上先將數據排好。草稿 = 排序區。設置大一些,有利于加快order by語句的執行。
·會話信息:包括了如權限、角色等信息。
·游標狀態:所執行的SQL語句相關的信息。
·堆棧空間:保存SQL中的變量信息。
再來了解一下Oracle有哪些進程。
PMON 進程監控進程: process 清潔工
·清理出現故障的進程。
·釋放所有當前掛起的鎖定。
·釋放故障進程使用的資源。
SMON 系統監控進程 system moniter
·在Oracle因斷電而重啟時,進行數據庫進行必要的修復。
DBWR 數據寫入進程 : database writer
·管理數據緩沖區,將最近使用過的塊保留在內存中。
·將修改后的緩沖區數據寫入數據文件中。
LGWR 日志寫入進程 :log writer (記錄員)
·負責將日志緩沖區中的日志數據寫入日志文件。
·系統有多個日志文件,該進程以循環的方式將數據寫入文件。
ARCH 歸檔進程
·將記錄員記錄的東西放到檔案室
CKPT 檢查點進程
· 與Oracle事務相關
體會:Oracle是一個龐大的系統(如跨國公司),分工很明確。
問題:分工的好處是什么? (提高效率)。
數據庫的概念:本義是指數據所在倉庫(數據的集合)。
數據庫管理的信息,分為:
·系統數據:如配置文件,如指定SGA的大小
·用戶數據:業務系統數據
物理結構:就是從操作系統的角度,有哪些文件。因為文件,又叫物理文件。刪除一個文件,又叫物理刪除。
如:
CONTROL01.CTL ctl = control,控制文件(數據庫實體的結構,如表結構)
CONTROL02.CTL
CONTROL03.CTL
CWMLITE01.DBF dbf = database file = 真正存儲數據的文件(如員工具體信息)
DRSYS01.DBF
EXAMPLE01.DBF
INDX01.DBF 以index打頭的dbf專門保存索引
ODM01.DBF
ODM02.DBF
REDO01.LOG 專門保存日志文件
REDO02.LOG
REDO03.LOG
SYSTEM01.DBF
TEMP01.DBF
TOOLS01.DBF
UNDOTBS01.DBF
USERS01.DBF
XDB01.DBF
XXX.ORA oracle = 初始化參數文件
XXX2.ORA
邏輯結構:指Oracle數據庫文件的內部組成。
計算機管理基礎
·計算機管理最小的單位是bit,相當一個帶電開關(閉1斷0),這就是二進制。
·計算機要通過數據類型來區別不同的數據,所以通過字節Byte來管理,一個字節有32位(32位計算機,或64位,對應64位計算機。計算機數位越多,管理的內存越大。如2的32次方,小于64次方。如電話號碼用完了,要升位)。不同的數據類型分配不同的字節。如整數通過4個Byte,小數8個Byte。字符串由字符組成,字符本質是數字,如A就是65(整數)。
Oracle管理 塊→區→段→表空間
·塊,Block:最小的磁盤存儲單位,通常是2K或2K的整數位。即使保存1,至少也用2K。
·區,extend:最小的磁盤分區單位,通常為8K。表示Oracle一次性最小給你分配8K。
·段,segment:不同類型的數據,保存在不同的段。如數據段,索引段。
·表空間,table space:不同的業務系統需要一個單獨的存儲空間,這個空間在SQLServer叫做“databse”(通過create databse獲取),而在Oracle中叫表空間。至少要有5個表空間(system,user,index,tool,temp),用戶表空間數量不限。也就是說,開發一個新的業務系統,通常就要在Oracle中新建一個表空間。
·模式,Schema:包含一個用戶所有對象的的邏輯結構,模式名稱就是控制該模式的用戶名稱。
·關系:一個數據文件只能歸到某一個表空間上,每個表空間可以含一個或多個數據文件。
區別:
·物理結構:人有男人,女人組成
·邏輯結構:人由細胞組成。
塊區段表空間比喻
·塊:抽屜,放東西最少要占有一個抽屜;區:桌子,最少要買一個桌子;段:這幾個桌子的抽屜放衣服,另外幾個桌子的抽屜放褲子。
·表空間:就是用戶的房間。張三所有桌子,衣服,在張三相對獨立的房間中。
實例與數據庫關系
·一個保安只在守一個數據庫(單實例數據庫)
·一個數據庫可能雇傭多個保安(多實例數據庫
三種進程
·用戶進程=顧客,服務進程=跑堂,后臺進程=(廚師,會計,出納……)
相關概念:
理解“聯機”的含義
·全稱:聯機重做日志緩沖區 。
·聯機就是Online,聯機日志,就是數據庫運行以后時刻使用的日志,叫聯機日志(肯定不能刪除,受數據庫保護);聯機反過來就是脫機,如以前的日志備份。
理解日志的作用和“重做日志”的含義
·日志的作用是用于恢復數據。
·簡單理解就是今天買了一本JAVA書,寫日記“書名:JAVA……”。后來書丟掉了,于是看日記,購買了一本相同的書,這樣就恢復了數據。本質上理解就是執行一條Insert,日志文件也有一件Insert。1號有10條數據,2號insert5條,2號晚上數據丟掉了。恢復數據步驟如下:首先要恢復數據到1號的數據有10條(通常DBA要備份原始數據),再執行日志,于是就有了15條。這就表示“重新做了一次”,所以恢復數據的動作叫“重做日志”。
理解數據緩沖區
·圖書館看報紙:第一個人從報架取下來,在閱讀室看,然后不拿回報架;其它同學可以直接在閱讀室看報紙。閱讀室 = 數據緩沖區,報架 = 磁盤。
理解共享池
·看英文小說:第一個同學看英文小說,翻譯為中文(時間比較長);其它同學直接看中文小說。
進程和線程
·進程:就是一個程序。如:單線程的孫只能一次打一個妖怪,打完一個再打另一個。如:dos中dir/s,停止以前不能做其它的事情。
·線程:就是程序運行以后,在內存中的一個COPY,兩者在功能上是完全一樣的。多線程的孫能變出很多個孫,每個孫單獨一個妖怪。 但實際上電腦往往只有一個CPU,做不到真正的多線程。那就要求孫一個妖怪打一會兒,但是打得很快,好像就在同時和很多人打(如以前單核CPU電腦也能同時聽歌和上網,只是切換得很從,體會不出來)
·打開一個WORD程序,同時讀取兩個WORD文檔,WORD就要單獨啟動兩份(要求兩份獨立的內存)
打開一個QQ程序,同時和兩個好友聊天,QQ只要啟動一份份(只要求一份獨立的內存,好處在于可以共享內存中的相同的數據)