前面已經提到,資料庫伺服器包括實例和資料庫兩部分。 其中資料庫是用來存儲數據的,而實例是用來訪問資料庫中的數據的。實例包括一組記憶體結構和後臺進程,而資料庫的結構需要從邏輯結構和物理結構兩個方面來理解。資料庫的邏輯結構是指數據的邏輯組織形式,是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指定了後臺進程跟蹤文件和警告文件的存儲路徑。
特權用戶與口令文件
創建資料庫時,自動創建了一個特殊的用戶SYS ,這個用戶就是我們平常所說的資料庫管理員,它具有兩種特殊系統許可權SYSDBA和SY SOPER ,對整個資料庫具有所有許可權。
對資料庫的管理基本上是以這個用戶的身份來完成的。
SYS用戶在登錄實例時,需要指定SYSDBA或者SYSOPER許可權。
例如,通過SQL*Plus 以以下方式登錄:
sqlplus sys/123 as sysdba
或
sqlplus sys/123 as sysoper
其中“ 1234 ”是S y S 用戶的口令。
在登錄之前需要在系統中設置一個環境變數ORACLE_SID。
在Windows 中,只有當一個系統中運行多個實例時,才需要設置這個變數。
在UNIX/Linux 中設置環境變數的命令是(其中orcl是實例的名稱):
ORACLE_SID=orcl
EXPORT ORACLE_SID
在Windows 中設置環境變數的命令是:
SET ORACLE_SID=orcl
在UNIX/Linux 中安裝Oracle軟體之前,需要在系統中創建一個oracle用戶,這個用戶屬於dba用戶組(在Windows 中這個用戶一般是系統管理員administrator ,屬於ora_dba 用戶組),以後對資料庫的所有管理任務,都是以oracle用戶登錄到系統中來完成的。
只要以oracle用戶登錄到系統中,就能夠以下麵的方式登錄到資料庫實例中,而不用提供SYS 用戶的口令:
sqlplus / as sysdba
這時候實際上是把系統中的oracle用戶映射為資料庫中的SYS用戶。
在Oracle 中把這種驗證方式稱為操作系統驗證。
實際上,在操作系統中任何用戶只要屬於dba用戶組,就能以上面的方式登錄到資料庫實例中。
同樣,任何系統用戶只要屬於oper用戶組(或者dba用戶組),就能夠以下麵的方式登錄資料庫實例:
sqlplus / as sysoper
如果SYS用戶以遠程方式登錄實例,如通過EM ,就需要提供口令。
SYS用戶的口令一方面同普通用戶一樣,存儲在資料庫中,另一方面, SYS 用戶的口令存儲在一個操作系統文件中,這個文件就是口令文件。
在UNIX/Linux 中,口令文件存放在Oracle安裝目錄的dbs 子目錄下,文件命名規則是: orapw<sid> .ora ,其中<sid>指的是實例名稱。
在Windows 中,口令文件存儲在database子目錄下,文件的命名規則是: PWD<sid> .ora。
SYS用戶的遠程登錄,是通過口令文件進行驗證的。
如果口令文件丟失,或者口令輸入錯誤,驗證就會失敗。
在這種情況下,可能需要重新創建口令文件,指定新的口令。
Oracle提供了一個命令,名稱是orapwd ,通過這個命令對口令文件進行管理。
這個命令是由oracle 用戶在操作系統中執行的。
例如:
$ orapwd file=$0RACLE_HOME/dbs/orapworcl.ora password=” 1234 ” force=y
這個命令的各個參數的含義如下:
file :用來指定口令文件的路徑和名稱,如果不指定路徑,將在當前目錄下產生。
password :用來指定SYS 用戶的新口令。
force :如果口令文件已經存在,則覆蓋。