- Oracle數據庫從入門到運維實戰
- 甘長春 孟飛編著
- 2729字
- 2021-09-27 12:48:19
1.7 Oracle數據庫的物理結構
數據庫中的數據在邏輯結構上是以表空間、段、區、數據塊的形式組織的,而在物理上則表現為存儲在磁盤上的文件。數據庫的物理結構是指數據在操作系統中的存儲方式,是對用戶可見的組織形式。數據庫的物理結構包括數據文件、控制文件和重做日志文件,這3類文件是數據庫正常運行所必需的。另外,數據庫中還包括口令文件、參數文件、警告文件和跟蹤文件等,這些文件也是Oracle數據庫物理結構的組成部分。
1.7.1 數據文件
顧名思義,數據文件是用來存儲數據的。在數據文件中存儲所有數據庫對象的結構和數據,包括表、視圖、索引、觸發器、存儲程序等數據庫對象。用戶對數據庫的訪問實際上就是對數據文件的訪問,只不過這些文件不能由操作系統直接訪問,而必須通過數據庫服務器才能訪問。
數據文件與一般的文件有所不同。一般的操作系統文件的初始大小可能比較小,隨著文件中內容的增加,它的大小也隨著增加,同樣,它的大小也將隨著內容的減少而減少,在任何時候,它的大小與其內容的多少是一致的。數據文件更像是一個空的容器,在創建數據文件時,就按照指定的大小分配了存儲空間。在文件被寫滿之前,無論文件中包含多少數據,它的大小總是固定不變的。
既然數據文件是一種操作系統文件,它在磁盤上必然占用一定數量的操作系統塊。在數據庫服務器內部,數據讀/寫的基本單位是數據塊,一個數據塊對應多個操作系統塊。在數據庫中讀/寫一個數據塊時,在操作系統中對應著對多個操作系統塊的讀/寫。
數據文件在邏輯上屬于表空間,一個表空間可以包含一個或多個數據文件,而一個數據文件只能屬于一個表空間。用戶在創建數據庫對象時,只能指定所屬的表空間,而不能指定存儲在哪個數據文件上。數據庫對象被創建后,它的結構和數據就存儲在一個或多個數據文件中。
隨著數據庫的運行,數據文件中的數據可能越來越多,并最終耗盡數據文件的存儲空間。為了存儲更多的數據,數據文件的存儲空間必須能夠擴展。Oracle提供了3種擴展數據文件存儲空間的方法。
●在當前表空間中增加新的數據文件,新數據將被存儲在新的數據文件中。
●手動擴展表空間中的數據文件,在原來的存儲空間的基礎上,增加一定數量的存儲空間。
●激活數據文件的自動擴展功能,數據庫服務器將自動為數據文件分配新的存儲空間。
1.7.2 控制文件
控制文件是數據庫中另一種重要的文件,它的功能是記錄數據庫的結構和狀態。這是一個二進制文件,用戶無法查看和修改文件的內容。數據庫在啟動時需要根據控制文件的內容,査找數據文件并打開它們。在數據庫運行的過程中,對數據庫結構所做的任何修改都將記錄在控制文件中。
在啟動數據庫服務器時,首先啟動實例,然后才能打開數據庫。數據庫服務器是通過控制文件在實例和數據庫之間建立對應關系的。在控制文件中記錄了數據文件的路徑、重做日志文件的路徑、當前日志序列號、SCN等信息。
如果控制文件丟失或損壞,數據庫服務器將無法正常運行。由于控制文件的特殊重要性,對它的存儲有特殊的要求。在一個數據庫中至少需要一個控制文件,Oracle建議至少創建兩個控制文件,并將它們分別存儲在兩個磁盤上,這兩個文件互相鏡像,如果一個文件損壞,數據庫服務器可以使用另外一個文件。在正常情況下,這兩個文件的內容是完全一樣的,數據庫服務器只需從其中一個文件中讀取信息,但是對數據庫結構所做的任何修改都必須同時寫入兩個控制文件。
1.7.3 重做日志文件
重做日志文件是確保數據庫安全的一種重要手段。在重做日志文件中記錄的是用戶對數據庫所做的修改,即一條條的DML(Data Manipulation Language,數據操縱語言,主要包括INSERT、UPDATE和DELETE)和DDL(Data Defination Language,數據定義語言,主要包括CREATE、DROP、ALTER等)命令。當數據庫服務器發生故障時,數據庫管理員可以根據重做日志的內容對數據進行恢復,從而確保數據不會因為故障而丟失。
用戶在執行DML或DDL操作時,實際的數據處理是在SGA中進行的。服務器進程首先生成一條重做日志,并將它存儲在重做日志緩沖區中,然后在數據庫高速緩存中修改相應的緩沖區。
在一定的時機下,DBWR(數據庫寫進程)將數據庫高速緩存中臟緩存區的內容寫入數據文件中,LGWR(日志寫進程)將重做日志緩沖區中的內容寫入重做日志文件。在一般情況下,LGWR(日志寫進程)總是先于DBWR(數據庫寫進程)將重做日志寫入重做日志文件。
在重做日志文件中不僅記錄重做日志,還記錄SCN。如果用戶提交事務,SCN將隨著重做日志一起被LGWR(日志寫進程)寫入重做日志文件。這樣,如果數據庫服務器發生了故障,數據庫管理員可以將數據庫恢復到最后一個SCN處。如果用戶沒有提交事務,重做日志也可能被寫入重做日志文件,但如果這個事務被回滾,對數據庫將不產生任何影響。
在數據庫中至少需要兩個重做日志文件,數據庫服務器以循環的方式將重做日志寫入這些文件。當第一個文件寫滿后,數據庫服務器自動進行日志切換,將重做日志寫入下一個文件。當最后一個文件被寫滿時,數據庫服務器重新將重做日志寫入第一個文件。如此循環往復進行,重做日志文件中以前的內容將被覆蓋。
由于重做日志文件的特殊重要性,Oracle建議為每一個重做文件至少建立一個鏡像文件。互為鏡像的重做日志文件歸為一個日志組,同一個日志組中所有文件的內容和大小完全相同。這些文件應盡量分布在不同的磁盤上,以免磁盤發生故障時丟失所有的重做日志。數據庫服務器在寫重做日志時,必須將重做日志同時寫入同一個日志組的所有文件。
為了確保重做日志的安全,應及時對重做日志文件進行歸檔,產生歸檔日志文件。歸檔日志文件可以被備份到磁盤等存儲介質上。歸檔操作必須在數據庫的歸檔模式下進行,并且需要啟動一個或多個ARCH(歸檔日志進程)。在LGWR(日志寫進程)向一個重做日志文件寫入重做文件之前,該文件必須被歸檔,否則LGWR(日志寫進程)將被掛起,所有的事務都停止執行。
1.7.4 跟蹤文件和警告文件
當數據庫服務器運行不正常時,將與警告文件和跟蹤文件產生一些有用的信息,數據庫管理員可以查看這些文件的內容,根據其中記錄的信息判斷故障發生的原因。跟蹤文件用于記錄服務器進程和后臺進程發生的內部錯誤信息,每個服務器進程和后臺進程都有自己的跟蹤文件。后臺進程的跟蹤文件名為<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指定了后臺進程跟蹤文件和警告文件的存儲路徑。
- Python數據分析入門與實戰
- 高效微控制器C語言編程
- Web Scraping with Python
- PHP+MySQL網站開發技術項目式教程(第2版)
- 云原生Spring實戰
- Python編程完全入門教程
- Building Mobile Applications Using Kendo UI Mobile and ASP.NET Web API
- HDInsight Essentials(Second Edition)
- Learning Vaadin 7(Second Edition)
- 微服務架構深度解析:原理、實踐與進階
- HTML5秘籍(第2版)
- Test-Driven Machine Learning
- Python3.5從零開始學
- Hands-On GUI Programming with C++ and Qt5
- Web程序設計:ASP.NET(第2版)