程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 數據庫的結構,數據庫結構

數據庫的結構,數據庫結構

編輯:Oracle教程

數據庫的結構,數據庫結構


前面已經提到,數據庫服務器包括實例和數據庫兩部分。

其中數據庫是用來存儲數據的,而實例是用來訪問數據庫中的數據的。
實例包括一組內存結構和後台進程,而數據庫的結構需要從邏輯結構和物理結構兩個方面來理解
數據庫的邏輯結構是指數據的邏輯組織形式,是Oracle內部用來管理數據的機制。
數據庫的物理結構是從用戶角度感覺到的結構,是在操作系統中存儲和管理數據的機制。
從邏輯結構上來講,一個數據庫包含若干個表空間,不同類型的數據存儲在不同的表空間中,如系統數據、用戶數據、臨時數據和回滾數據等分別存儲在不同的表空間中。
表空間中包含若干個段,同一個表空間中的數據又可進一步根據類型不同而存儲在不同的段中,如數據段、索引段、臨時段等。

一個段中又可以包含若干個區,區是Oracle分配存儲空間和回收存儲空間的基本單位。
區是由連續的多個數據塊組成的,數據塊是Oracle讀寫數據庫的基本單位。

表空間、段、區和數據塊組成了數據庫的邏輯結構
邏輯結構是指數據的組織形式,而從物理形式上講,數據是以數據文件的形式存儲在磁盤上的。
在操作系統中,能使用戶真正感覺到數據庫存在的是數據文件。
數據文件是存儲在磁盤上的,它需要占用若干個操作系統塊。

邏輯結構和物理結構並非毫無關系,而是緊密聯系的。
表空間中的數據是存放在數據文件中的,因此一個表空間對應一個或多個數據文件。
數據塊是Oracle中存儲數據的基本單位,一個數據塊對應若干個操作系統塊,數據最終是存儲在操作系統塊中的, Oracle對數據塊的訪問最終轉化為對操作系統塊的訪問。
數據庫的邏輯結構與物理結構之間的關系如下圖所示:

表空間

表空間是數據庫中數據的邏輯組織形式,一個數據庫在邏輯上由多個表空間組成。

表空間用於將不同類型的數據組織在一起,就像一個公司裡的員工是按照不同部門組織在一起一樣。
表空間中的數據在物理上是存儲在數據文件中的,一個表空間對應一個或多個數據文件,就像一個部門對應若干個辦公室一樣。
當表空間中的存儲空間緊張時,可以向表空間中添加數據文件,一個數據文件只能屬於一個表空間
如果表空間中只包含一個數據文件,那麼所有數據都將存儲在這個數據文件中。

如果表空間對應多個數據文件,那麼數據將被分割成幾部分,分別存放在這些數據文件中。
表空間與數據文件的關系如圖所示。

在數據庫中引入表空間的好處有以下幾點:
·將系統數據和用戶數據分開,有利於保護重要的數據。

·可以限制用戶對磁盤存儲空間的使用。
·將臨時數據與用戶數據分開,從而減少用戶數據存儲區的碎片,提高數據庫的性能。
·能夠將不同類型的數據分別存放在不同的磁盤上,以減少磁盤的讀寫沖突。

可以將訪問頻繁的數據存儲在速度相對較快的磁盤上,從而在整體上提高數據庫的性能。
·各個表空間可以被單獨設置為聯機或脫機狀態,這樣可以在數據庫正常運行的情況下,將單個表空間置於脫機狀態,並對其進行備份或恢復。
在一個數據庫中有五種類型的表空間,即SYSTEM表空間、SYSAUX表空間、UNDO表空間、臨時表空間和普通表空間。
其中前四種表空間是必不可少的,在創建數據庫時就需要創建它們,普通表空間是根據需要才創建的。

1. SYSTEM表空間

SYSTEM表空間是數據庫中一個必需的表空間。

在創建數據庫時, SYSTEM表空間將被自動創建。
在SYSTEM表空間中存儲著數據庫的系統信息,如數據字典,數據庫對象的定義、PL/SQL存儲程序的代碼、SYSTEM 回滾段等。

2. SYSAUX表空間

SYSAUX表空間也是數據庫中一個必需的表空間,它是在創建數據庫時自動被創建的。
SYSAUX表空間是對SYSTEM表空間的輔助表空間,以前存儲在SYSTEM表空間中的數據現在存儲在SYSAUX表空間中,從而減輕了SYSTEM表空間的負擔。
另外,許多以前需要單獨表空間的數據現在都可以存儲在SYSAUX表空間中,從而減少了需要維護的表空間的數目。

3. UNDO表空間

UNDO表空間是用來存儲回滾數據的。

回滾數據是被事務修改的數據,例如,假設用戶執行語句“DELETE FROM emp WHERE empno=7902 ”。
被DELETE命令訪問的數據就是回滾數據。
在事務尚未提交之時,這一行數據被存放在UNDO表空間中。

此時假設另一個用戶執行語句“ SELECT * FROM emp WHERE empno=7902”,那麼他將得到從UNDO表空間中返回的這一行數據
如果事務被回滾, UNDO表空間中的數據被寫回原來的存儲空間,就好像原來的DML操作沒有被執行一樣。
由此可見,UNDO表空間是為了回滾事務而設計的

在以前版本的數據庫中,回滾數據只能存放在回滾段中。
回滾段位於某一個表空間中,或者某些特定的表空間中。

回滾段的管理比較復雜,需要數據庫管理員手工執行繁瑣的命令。
目前版本的數據庫都使用UNDO表空間來管理回滾數據。
在UNDO表空間中只能存放回滾段,而不能存放其他類型的段,如數據段、索引段等。
使用UNDO表空間好處是對回滾數據進行自動管理,從而減輕了數據庫管理員的負擔。

臨時表空間

臨時表空間用於存放用戶訪問數據庫時所產生的臨時數據。

例如,當用戶執行語句“ SELECT * FROM emp ORDER BY empno;”時,將對表中的數據進行排序並產生排序結果。
排序操作一般是在PGA的排序區中進行的。

如果排序區的大小不足以容納這些數據,將使用臨時表空間。
在臨時表空間中只能建立臨時段。

臨時段也不是永久存在的,當用戶第一次在數據庫中執行排序等操作時,臨時段將自動產生,而當數據庫關閉時臨時段的空間將被釋放。
正是由於這個原因,在臨時表空間不允許創建永久性的數據庫對象,如表、索引等。

在一個數據庫中可以創建多個臨時表空間。

如果沒有臨時表空間,那麼用戶在執行排序等操作時可能需要使用SYSTEM表空間存儲臨時數據。
如果在SYSTEM表空間中頻繁地存儲臨時數據,將產生大量的存儲碎片,從而降低數據庫的性能。
在使用CREATE USER命令創建用戶時,可以通過TEMPORARY TABLESPACE子句為該用戶指定臨時表空間。
用戶在創建之後,也可以通過ALTER USER命令為其指定臨時表空間。
這樣用戶訪問數據庫時產生的臨時數據將被存儲在指定的臨時表空間中。

普通表空間

普通表空間是用戶真正關心的表空間,在數據庫中可以創建多個普通表空間。

普通表空間用來存放用戶的數據。

表空間將數據按照類型從邏輯上分離開來,如將用戶數據與系統數據分別組織在一個表空間中。
在同一個表空間中,可能存在不同類型的數據庫對象,如表、索引。

Oracle將不同數據庫對象中的數據以段的形式組織在一起。
一個表空間包含多個段,但一個段只能屬於一個表空間。
當用戶在數據庫中創建一個數據庫對象時,在表空間中將自動創建一個段,以存儲該對象的數據。
比如,在默認情況下,一個表對應一個表段,一個索引對應一個索引段。

段中存儲空間的分配是以區為單位進行的。
在一個段中包含若干個區。

在分配段時需要指定初始的區個數。
隨著段中數據的增加,數據服務器將會擴充該段,為段分配所需的區,而當段中數據被刪除時,空閒的區可以被回收。
在表空間中主要可以創建四種主要類型的段,它們是數據段、索引段、臨時段和回滾段。
在每個段中存儲不同的數據庫對象。
數據段用來保存表中的數據,默認情況一個表對應一個表段。

在一個表段中只能存儲一個表中的數據
當用戶在表空間中創建一個表時,數據庫服務器將自動在這個表空間中為該表創建一個段,段的名字與表的名字相同
索引段用來存儲索引中的數據,當用戶為一個表創建索引時,數據服務器將自動為該索引創建一個索引段,索引段與索引的名字相同,並且它們間是一一對應的。
當在表上創建主鍵約束或唯一性約束時,也將產生相應的索引段。
臨時段用於存放臨時數據,當用戶執行排序等操作時,將產生大量的臨時數據,這些臨時數據存儲在臨時段中。
當然,臨時數據是優先存儲在PGA的排序區中的,這樣可以提高排序的速度
如果排序區的大小不足以存放這些臨時數據,才會用到臨時段。

臨時段不是必需的,如果沒有創建專門的臨時段,用戶的排序操作將使用SYSTEM表空間中的臨時段。
由於SYSTEM表空間存儲著重要得系統數據,頻繁地使用SYSTEM表空間將產生大量的碎片,從而降低數據庫的性能,所以Oracle建議盡量創建專門的臨時段,並將它存放在專門的臨時表空間中。

回滾段用於存儲回滾數據。

當用戶執行DML語句時,數據庫服務器將修改後的數據存儲在表段中,而將修改前的數據作為回滾數據存儲在回滾段中
當用戶回滾事務時,數據庫服務器將回滾段中的數據重新寫入表段,該事務所做的修改將取消
當用戶提交事務時,回滾段中的數據將變為無效,這時用戶將無法回滾該事務

在數據庫中可以創建多個回滾段。

當用戶執行DML操作時,數據庫服務器將自動為當前事務指定一個回滾段,用戶也可以通過命令指定一個回滾段。
在創建數據庫時,系統在SYSTEM表空間中自動創建一個SYSTEM 回滾段, SYSTEM回滾段用於維護Oracle內部的事務。
數據庫管理員可以通過命令創建其他的回滾段。
需要注意的是, Oracle 11g提供了兩種管理回滾數據的方法,一種是手工管理方式,這種方拉利用回滾段維護事務。
另一種方注稱為自動管理方式,這種方式利用專門的UNDO表空間管理回滾數據。
由於回滾段的管理太復雜, Oracle 建議大家使用自動管理方式,在以後的Oracle版本中,可能會取消手工管理方式。

區是Oracle分配存儲空間的最小單位,一個段由多個區組成,一個區由若干個連續的數據塊組成,區的大小是數據塊大小的整數倍
在創建一個數據庫對象時,數據庫服務器為該對象分配若干個區,以存儲該對象的數據。
數據庫對象至少占用一個區,隨著數據的增加,數據庫服務器將不斷為該對象分配所需的區,這些區的大小可能相等,也可能不相等

數據塊

數據塊是Oracle 中的最小存儲單位,也是數據庫服務器讀寫數據的最小邏輯單位

數據庫服務器在為段分配空間或回收存儲空間時,是以區為單位進行的,而在讀寫數據時,是以數據塊為單位進行的。
數據庫中的數據最終是存儲在硬盤上的,所以數據塊與操作系統中的塊必然有著密切的聯系。
一個數據塊由若干個操作系統塊組成,它的大小是操作系統塊的整數倍。

數據庫服務器在讀寫數據時以數據塊為單位進行,這種訪問最終轉化為對操作系統塊的讀寫。
在Oracle 11g 中,有兩種形式的數據塊,一種是標准塊,另一種是非標准塊。

標准塊的大小由初始化參數DB_BLOCK_SIZE指定,所有標准塊的大小都相同。

非標准塊的大小可以有多種情況,如2KB 、4KB 、8KB 、16KB 、32KB (但是不能與標准塊的大小相同),等等。
在數據庫中可以使用一系列初始化參數DB_nK_CACHE_SIZE ,其中n為2 、4 、8 、16 、32等。
這些初始化參數系列用來為非標准塊指定數據庫高速緩存大小。
如果在數據庫中定義了非標准塊,那麼必須在SGA 中為它定義相應的數據庫高速緩存。
無論是哪種數據塊,它的大小在數據庫創建之後就不能再修改。
數據庫服務器在讀寫數據時,數據塊中的數據將首先被調入SGA的數據庫高速緩存中,在緩存中必須為每一種大小的數據塊定義緩沖區,緩存區的大小與數據塊相同。
當用戶訪問數據庫時,數據塊的內容被讀寫到與之大小相同的緩沖區中。

數據庫的物理結構

數據庫中的數據在邏輯結構上是以表空間、段、區、數據塊的形式組織的,而在物理上則表現為儲存在磁盤上的文件
數據庫的物理結構是指數據在操作系統中的的存儲方式,是對用戶可見的組織形式。
數據庫的物理結構包括數據文件、控制文件和重做日志文件,這三種文件是數據庫正常運行所必需的。

另外,數據庫中還包括口令文件、參數文件、警告文件和跟蹤文件等。

數據文件

顧名思義,數據文件是用來存儲數據的

在數據文件中存儲所有數據庫對象的結構和數據,包括表、視圖、索引、觸發器、存儲程序等數據庫對象。
用戶對數據庫的訪問實際上就是對數據文件的訪問,只不過這些文件不能由操作系統直接訪問,而必須通過數據庫服務器才能訪問。
數據文件與一般的文件有所不同。

一般的操作系統文件的初始大小可能比較小,隨著文件中內容的增加,它的大小也隨著增加,同樣,它的大小也將隨著內容的減少而減少,在任何時候,它的大小與其內容的多少是一致的。
數據文件更像是一個空的容器,在創建數據文件時,就按照指定的大小分配了存儲空間。
在文件被寫滿之前,無論文件中包含多少數據,它的大小總是固定不變的。
既然數據文件是一種操作系統文件,它在磁盤上必然占用一定數量的操作系統塊。

在數據庫服務器內部,數據讀寫的基本單位是數據塊,一個數據塊對應多個操作系統塊。
在數據庫中讀寫一個數據塊時,在操作系統中對應著對多個操作系統塊的讀寫。
數據文件在邏輯上屬於表空間,一個表空間可以包含一個或多個數據文件,而一個數據文件只能屬於一個表空間。
用戶在創建數據庫對象時,只能指定所屬的表空間,而不能指定存儲在哪個數據文件上。
數據庫對象被創建後,它的結構和數據就存儲在一個或多個數據文件中。
隨著數據庫的運行,數據文件中的數據可能越來越多,並最終耗盡數據文件的存儲空間。
為了存儲更多的數據,數據文件的存儲空間必須能夠擴展。

Oracle提供了三種擴展數據文件存儲空間的方法。
第一種方法是在當前表空間中增加新的數據文件,新數據將被存儲在新的數據文件中。
第二種方法是手工擴展表空間中的數據文件,在原來的存儲空間的基礎上,增加一定數量的存儲空間。
第三種方法是激活數據文件的自動擴展功能,數據庫服務器將自動為數據文件分配新的存儲空間。

控制文件

控制文件是數據庫中另一種重要的文件,它的功能是記錄數據庫的結構和狀態

這是一個二進制文件,用戶無法查看和修改文件的內容。
數據庫在啟動時需要根據控制文件的內容,查找數據文件並打開它們。
在數據庫運行的過程中,對數據庫結構所做的任何修改都將記錄在控制文件中。
在啟動數據庫服務器時,首先啟動實例,然後才能打開數據庫。

數據庫服務器是通過控制文件在實例和數據庫之間建立對應關系的。
在控制文件中記錄了數據文件的路徑、重做日志文件的路徑、當前日志序列號、SCN等信息。
如果控制文件丟失或損壞,數據庫服務器將無法正常運行。

由於控制文件的特殊重要性,對它的存儲有特殊的要求。
在-個數據庫中至少需要一個控制文件, Oracle建議至少創建兩個控制文件,並將它們分別存儲在兩個磁盤上,這兩個文件互相鏡像,如果一個文件損壞,數據庫服務器可以使用另外一個文件。

在正常情況下,這兩個文件的內容是完全-樣的,數據庫服務器只需要從其中一個文件中讀取信息,但是對數據庫結構所做的任何修改都必須同時寫入兩個控制文件。

重做日志文件

重做日志文件是保證數據庫安全的一種重要手段。

在重做日志文件中記錄的是用戶對數據庫所做的修改,即一條條的DML和DDL命令。
當數據庫服務器發生故障時,數據庫管理員可以根據重做日志的內容對數據進行恢復,從而保證數據不會因為故障而丟失。
用戶在執行DML或DDL操作時,實際的數據處理是在SGA 中進行的。

服務器進程首先生成一條重做日志,並將它存儲在重做日志緩沖區中,然後在數據庫高速緩存中修改相應的緩沖區。
在一定的時機下, DBWR 進程將數據庫高速緩存中髒緩存區的內容寫入數據文件中,LGWR將重做日志緩沖區中的內容寫入重做日志文件。
在一般情況下, LGWR總是先於DBWR進程將重做日志寫入重做日志文件。
在重做日志文件中不僅記錄重做日志,還記錄SCN 。

如果用戶提交事務, SCN將隨著重做日志一起被LGWR進程寫入重做日志文件。
這樣如果數據庫服務器發生了故障,數據庫管理員可以將數據庫恢復到最後一個SCN處。
如果用戶沒有提交事務,重做日志也可能被寫入重做日志文件,但如果這個事務被回滾,對數據庫將不產生任何影響。
在數據庫中至少需要兩個重做日志文件,數據庫服務器將以循環的方式將重做日志寫入這些文件。
當第一個文件寫滿後,數據庫服務器自動進行日志切換,將重做日志寫入下一個文件。
當最後一個文件被寫滿時,數據庫服務器重新將重做日志寫入第一個文件。

如此循環往復進行,重做日志文件中以前的內容將被覆蓋。
由於重做日志文件的特殊重要性, Oracle建議為每一個重做文件至少建立一個鏡像文件
互為鏡像的重做日志文件歸為一個日志組同一個日志組中所有文件的內容和大小完全相同
這些文件應該盡量分布在不同的磁盤上,以免磁盤發生故障時丟失所有的重做日志。

數據庫服務器在寫重做日志時,必須將重做日志同時寫入同一個日志組的所有文件。
為了保證重做日志的安全,應該及時對重做日志文件進行歸檔,產生歸檔日志文件

歸檔日志文件可以被備份到磁盤等存儲介質上。
歸檔操作必須在數據庫的歸檔模式下進行,並且需要啟動一個或多個ARCH進程。
在LGWR進程向一個重做日志文件寫入重做文件之前, 該文件必須被歸檔,否則LGWR進程將被掛起,所有的事務都停止執行。

跟蹤文件和警告文件

當數據庫服務器運行不正常時,將在警告文件和跟蹤文件產生一些有用的信息,數據庫管理員可以查看這些文件的內容,根據其中記錄的信息判斷故障發生的原因。
跟蹤文件用於記錄服務器進程和後台進程發生的內部錯誤信息,每個服務器進程和後台進程都有自己的跟蹤文件。
後台進程的跟蹤文件名為<SID><process>.TRC ,其中SID為實例名稱, process為後台進程名稱
例如,實例TEST 中的LGWR進程的跟蹤文件名為“TESTLGWR.TRC '’。

服務器進程的跟蹤文件名稱為<SID><PID>_ORA.TRC ,其中SID為實例名稱, PID為服務器進程的進程號
根據文件名稱,數據庫管理員就可以判斷跟蹤文件是由哪個進程產生的。

警告文件用於記錄實例內部的錯誤消息以及數據庫管理員對數據庫所做的維護,另外,在警告文件中還記錄非默認的初始化參數
警告文件的名稱為ALERT_ <SID>.LOG ,其中SID 為實例名稱。
跟蹤文件和警告文件都有默認的存儲路徑,它們的路徑由初始化參數指定。

初始化參數USER_DUMP_DEST指定了服務器進程跟蹤文件的存儲路徑,而初始化參數BACKGROUND_DUMP_DEST指定了後台進程跟蹤文件和警告文件的存儲路徑。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved