- Oracle從入門到精通(第5版)
- 明日科技編著
- 5237字
- 2024-12-27 22:36:45
2.3 物理存儲結構
邏輯存儲結構是為了管理Oracle數據而定義的具有邏輯層次關系的抽象概念,不容易理解;但物理存儲結構比較具體和直觀,它用來描述Oracle數據在磁盤上的物理組成情況。從大的角度來講,Oracle的數據在邏輯上存儲在表空間中,而在物理上存儲在表空間包含的物理文件(即數據文件)中。
Oracle數據庫的物理存儲結構由多種物理文件組成,主要有數據文件、控制文件、重做日志文件、歸檔日志文件、參數文件、密碼文件和警告日志文件等,如圖2.5所示。下面將對這些物理文件進行講解。

圖2.5 Oracle的物理存儲結構
2.3.1 數據文件
數據文件是用于保存用戶應用程序數據和Oracle系統內部數據的文件,它們在操作系統中就是普通的文件,Oracle在創建表空間的同時會創建數據文件。Oracle數據庫在邏輯上由表空間組成,每個表空間可以包含一個或多個數據文件,一個數據文件只能隸屬于一個表空間,如圖2.5所示。
在創建表空間的同時,Oracle會創建該表空間的數據文件。在表空間中創建數據對象(如表、索引、簇等)時,用戶是無法指定使用哪一個數據文件來進行存儲的,只能由Oracle系統負責為數據對象選擇具體的數據文件,并在其中分配物理存儲空間。一個數據對象的數據可以全部存儲在一個數據文件中,也可以分布存儲在同一個表空間的多個數據文件中。
在讀取數據時,Oracle系統首先從數據文件中讀取數據,并將數據存儲在內存的高速數據緩沖區中。如果用戶要讀取數據庫中的某些數據,而請求的數據又不在內存的高速數據緩沖區中,則需要從相應的數據文件中讀取數據并存儲在緩沖區中。當修改和插入數據時,Oracle不會立即將數據寫入數據文件中,而是把這些數據保存在數據緩沖區中,然后由Oracle的后臺進程DBWR決定如何將其寫入相應的數據文件中。這樣的存儲方式減少了磁盤的I/O操作,提高了系統的相應性能。
【例2.4】查詢dba_data_files或v$datafile數據字典,了解Oracle系統的數據文件信息,具體代碼如下。(實例位置:資源包\TM\sl\2\2)
SQL> col file_name for a50; SQL> set linesize 100; SQL> select file_name,tablespace_name from dba_data_files;
本例運行結果如圖2.6所示。
從圖2.6中可以看到3種類型的數據文件,即系統數據文件(SYSTEM01.DBF和SYSAUX01.DBF)、撤銷數據文件(UNDOTBS01.DBF)和用戶數據文件(USERS01.DBF、EXAMPLE01.DBF),下面對這3種類型的數據文件進行介紹。
(1)系統數據文件用于存儲“特殊”的用戶數據和Oracle系統本身的數據。用戶建立的表名、列名及字段類型等,這些屬于用戶數據范疇,存儲在系統表空間所包含的數據文件中。Oracle系統內部的數據字典、系統表(如dba_data_files、dba_temp_files等)中所存儲的數據屬于Oracle系統的內部數據,也存儲在系統表空間所包含的數據文件中。
(2)撤銷數據文件隸屬于撤銷表空間。如果修改Oracle數據庫中的數據,那么就必須使用撤銷段,撤銷段用來臨時存儲修改前的舊數據,通常存儲在一個單獨的撤銷表空間中,這個撤銷表空間所包含的數據文件就是撤銷數據文件。
(3)用戶數據文件用于存儲用戶應用系統的數據,這些數據包括與應用系統有關的所有相關信息。例如,上述USERS01.DBF和EXAMPLE01.DBF文件就是一個具體應用系統的兩個數據文件。
在上述代碼中并沒有看到臨時表空間所包含的數據文件,這是由于臨時數據文件本身的特殊性。從Oracle 9i以后,Oracle將臨時表空間所對應的臨時數據文件與一般數據文件分開了。要了解Oracle系統的臨時數據文件信息,可以從dba_temp_files或v$tempfile數據字典中查詢。
【例2.5】查詢dba_temp_files或v$tempfile數據字典,查看臨時文件的信息,具體代碼如下。(實例位置:資源包\TM\sl\2\3)
SQL> col file_name format a50; SQL> col tablespace_name format a20; SQL> select file_name,tablespace_name from dba_temp_files;
本例運行結果如圖2.7所示。

圖2.6 Oracle系統的數據文件信息

圖2.7 查看臨時文件的信息
2.3.2 控制文件
控制文件是一個二進制文件,它記錄了數據庫的物理結構,其中主要包含數據庫名、數據文件與日志文件的名字和位置、數據庫建立日期等信息。控制文件一般在安裝Oracle系統時或創建數據庫時自動創建,控制文件所存儲的路徑由服務器參數文件SPFILEORCL.ORA的CONTROL_ FILES參數值來指定。
由于控制文件存儲了數據文件、日志文件等相關信息,因此Oracle實例在啟動時必須訪問控制文件。如果控制文件正常,實例才能加載并打開數據庫;但如果控制文件中記錄了錯誤的信息,或者實例無法找到一個可用的控制文件,則實例將無法正常啟動。
當Oracle實例正常啟動時,系統首先要訪問的是初始化參數文件SPFILE;然后Oracle為系統全局區(SGA)分配內存,這時Oracle實例處于安裝狀態,并且控制文件處于打開狀態;接下來Oracle會自動讀出控制文件中的所有數據文件和日志文件的信息,并打開當前數據庫中所有的數據文件和所有的日志文件以供用戶訪問。
每個數據庫至少擁有一個控制文件,一個數據庫可以同時擁有多個控制文件,但是一個控制文件只能屬于一個數據庫。控制文件內部除了存儲數據庫名及其創建日期、數據文件、日志文件等相關信息,在系統運行過程中,還存儲了系統更改號、檢查點信息及歸檔的當前狀態等信息。
Oracle數據庫系統出于安全考慮,在安裝Oracle數據庫或創建數據庫時,系統會自動創建兩個或三個控制文件,每個控制文件記錄相同的信息。這樣可確保在數據庫運行時,如果某個控制文件損壞,則Oracle將會自動使用另一個控制文件;如果所有控制文件都損壞,則系統將無法工作。
【例2.6】查詢v$controlfile數據字典,查看Oracle系統的控制文件信息,具體代碼如下。(實例位置:資源包\TM\sl\2\4)
SQL> col name format a60; SQL> select name from v$controlfile;
本例運行結果如圖2.8所示。

圖2.8 Oracle系統的控制文件信息
說明
當數據庫的物理組成更改時,Oracle將自動更改該數據庫的控制文件;當數據庫中的數據需要恢復時,Oracle也要使用控制文件。
2.3.3 日志文件
日志文件的主要功能是記錄對數據所做的修改,對數據庫所做的修改幾乎都記錄在日志文件中。在出現問題時,可以通過日志文件得到原始數據,從而保證不丟失已有操作成果。Oracle的日志文件包括重做日志文件(redo log file)和歸檔日志文件(archive log file),它們是Oracle系統的主要文件,尤其是重做日志文件,它是Oracle數據庫系統正常運行所不可或缺的。下面將介紹這兩種日志文件。
1.重做日志文件
重做日志文件用來記錄數據庫所有發生過的更改信息(修改、添加、刪除等)以及由Oracle內部行為(創建數據表、索引等)而引起的數據庫變化信息。在數據庫恢復時,可以從該日志文件中讀取原始記錄。在數據庫運行期間,當用戶執行COMMIT命令(數據庫提交命令)時,數據庫首先將每筆操作的原始記錄寫入日志文件中,只有在寫入日志文件成功后才把新的記錄傳遞給應用程序,所以在日志文件上可以隨時讀取原始記錄以恢復某些數據。
技巧
對表或者整個表空間設定NOLOGGING屬性,可使基于表或表空間中的DML操作(如創建表、刪除視圖、修改索引等)不生成日志信息,從而減少日志信息。
為了保障數據庫系統的安全性,每個Oracle實例都啟用一個日志線程來記錄數據庫的變化。日志線程由若干“日志組”構成,而每個日志組又由一個或者多個日志文件構成。
【例2.7】查詢v$logfile視圖了解Oracle系統的日志文件信息,代碼如下。(實例位置:資源包\TM\sl\2\5)
SQL> col member for a50 SQL> select member from v$logfile;
本例運行結果如圖2.9所示。
Oracle系統在運行過程中產生的日志信息,首先被臨時存儲在系統全局區(SGA)的重做日志緩沖區中,當用戶發出COMMIT命令(或日志緩沖區信息滿1/3)時,日志寫入(LGWR)進程將日志信息從重做日志緩沖區中讀出,然后將其寫入日志文件組中序列號較小的文件里,在一個日志組被寫滿后接著寫入另一個日志組中。在LGWR進程將所有能用的日志文件都使用過一遍之后,它將再次轉向第一個日志組重新覆寫。

圖2.9 Oracle系統的日志文件信息
2.歸檔日志文件
在所有的日志文件被寫入一遍之后,LGWR進程將再次轉向第一個日志組進行重新覆寫,這樣勢必會導致一部分較早的日志信息被覆蓋,但Oracle通過歸檔日志文件解決了這個問題。
Oracle數據庫可以運行在兩種模式下,即歸檔模式和非歸檔模式。非歸檔模式是指在系統運行期間,所產生的日志信息不斷地記錄到日志文件組中,當所有重做日志組被寫滿后,又重新從第一個日志組開始覆寫;歸檔模式就是在各個日志文件都被寫滿而即將被覆蓋之前,先由歸檔(ARCH)進程將即將被覆蓋的日志文件中的日志信息讀出,然后將其寫入歸檔日志文件中,而這個過程又被稱為歸檔操作。
在歸檔操作進行的過程中,LGWR進程需要等待ARCH進程結束才能開始覆寫日志文件,這樣就延遲了系統的響應時間,而且歸檔日志文件本身又會占用大量的磁盤空間,這些都會影響系統的整體性能。所以在默認情況下,Oracle系統不采用歸檔模式運行。
【例2.8】通過v$database視圖查看當前Oracle系統是否采用歸檔模式,代碼如下。(實例位置:資源包\TM\sl\2\6)
SQL> col name format a30; SQL> select dbid,name,log_mode from v$database;
本例運行結果如圖2.10所示。
如果將Oracle數據庫系統設置成在歸檔模式下運行,則可以通過服務器參數文件SPFILE的log_archive_dest參數來確定歸檔日志文件的所在路徑。
【例2.9】查詢歸檔日志文件的所在路徑,代碼如下。(實例位置:資源包\TM\sl\2\7)
SQL> set pagesize 30; SQL> show parameter log_archive_dest;
本例運行結果如圖2.11所示。

圖2.10 查看當前Oracle系統是否采用歸檔模式

圖2.11 歸檔日志文件的所在路徑
技巧
若要顯示SPFILE的指定參數信息,只需要使用show parameter+參數名即可。
2.3.4 服務器參數文件
服務器參數文件(server parameter file,SPFILE,即參數文件)是二進制文件,用來記錄Oracle數據庫的基本參數信息(如數據庫名、控制文件所在路徑、日志緩沖大小等)。數據庫實例在啟動之前,Oracle系統首先會讀取SPFILE中設置的這些參數,然后根據這些初始化參數來配置和啟動實例。例如,設置標準數據塊的大小(即參數db_block_size的值)、設置日志緩沖區的大小(即參數log_buffer的值)等,所以SPFILE非常重要。SPFILE在安裝Oracle數據庫系統時由系統自動創建,文件的名稱為SPFILEsid.ora,其中sid為所創建的數據庫實例名。
與早期版本的初始化參數文件INITsid.ora不同的是,SPFILE中的參數由Oracle系統自動維護。如果要對某些參數進行修改,盡可能不直接對SPFILE進行編輯,最好通過Oracle企業管理器(OEM)或alter system命令來修改,所修改過的參數會自動寫到SPFILE中。
1.查看服務器參數
用戶可以通過如下兩種方式查看數據庫的服務器參數。
(1)可通過查詢視圖v$parameter確定參數的默認值是否被修改過,以及是否可以用alter system和alter session命令修改。
【例2.10】查詢視圖v$parameter中name、value、ismodified列的值,代碼如下。(實例位置:資源包\TM\sl\2\8)
SQL> col name for a30; SQL> col value for a30; SQL> select name,value,ismodified from v$parameter;
本例運行結果如圖2.12所示。
(2)可以使用SQL*Plus的show parameter命令顯示服務器的參數。
【例2.11】通過show parameter命令顯示服務器參數,代碼如下。
SQL> show parameter
本例運行結果如圖2.13所示。

圖2.12 查詢視圖v$parameter

圖2.13 顯示服務器參數
2.修改服務器參數
修改數據庫的服務器參數,主要通過OEM或ALTER SYSTEM命令來實現。
(1)通過OEM修改。首先需要使用system用戶登錄OEM;然后選擇“服務器”頁面中的“初始化參數”選項,將打開如圖2.14所示的“初始化參數”頁面,在該頁面的“值”列中就可以修改參數值,最后保存它。

圖2.14 OEM中的初始化參數
(2)使用ALTER SYSTEM命令修改服務器參數。
【例2.12】通過ALTER SYSTEM命令修改標準數據塊的大小為4096 B,代碼及運行結果如下。
alter system set db_block_size=4096; 系統已更改。
2.3.5 密碼文件、警告文件和跟蹤文件
Oracle系統運行時,除了必要的數據文件、控制文件、日志文件及服務器參數文件,還需要一些輔助文件,如密碼文件、警告文件和跟蹤文件,下面對這些輔助文件進行簡單的介紹。
1.密碼文件
密碼文件是Oracle系統用于驗證sysdba權限的二進制文件,當遠程用戶以sysdba或sysoper連接到數據庫時,一般要用密碼文件驗證。
Oracle(這里以發行版2為例)密碼文件的默認存儲位置在%dbhome_1%\database目錄下,命名格式為PWD<sid>,其中sid表示數據庫實例名。密碼文件既可以在創建數據庫實例時自動創建,也可以使用ORAPWD.mp4工具手動創建。創建密碼文件的命令格式如下。
C:\>ORAPWD FILE=<filename> PASSWORD=<password> ENTRIES=<max_users>
filename:表示密碼文件名稱。
password:表示設置internal/sys賬戶口令。
max_users:表示密碼文件中可以存儲的最大用戶數,對應允許以sysdba/sysoper權限登錄數據庫的最大用戶數。
創建了密碼文件后,需要設置初始化參數remote_login_passwordfile來控制密碼文件的使用狀態,通常有以下3種狀態值:NONE表示只要通過操作系統驗證,就不用通過Oracle密碼文件驗證;SHARED表示多個數據庫實例都可以采用此密碼文件驗證;EXCLUSIVE表示只有一個數據庫實例可以使用此密碼文件驗證。
【例2.13】創建一個密碼文件,其sys口令為012345,代碼如下。
C:\>ORAPWD FILE=E:\app\Admin\product\11.2.0\dbhome_1\database\PWDorcl.ora password=012345 entries =40
2.警告文件
警告文件(即警告日志文件)是一個存儲在Oracle系統目錄下的文本文件(名稱通常為alert_orcl.log),它用來記錄Oracle系統的運行信息和錯誤信息。運行信息一般包括Oracle實例的啟動與關閉、建立表空間、增加數據文件等;錯誤信息包括空間擴展失敗、啟動實例失敗等。
當Oracle系統安裝完畢后,其實例日常運行的基本信息都會記錄在警告文件中。警告文件的路徑可通過Oracle系統的BACKGROUND_DUMP_DEST參數值來查看,并且該參數值由服務器進程和后臺進程寫入。
【例2.14】在v$parameter視圖中查看當前實例的警告文件的路徑,代碼及其運行結果如下。
SQL> col name for a20; SQL> col value for a50; SQL> select name, value from v$parameter where name = 'background_dump_dest'; NAME VALUE ------------ ------------------------------------------------ background_dump_dest e:\app\administrator\diag\rdbms\orcl\orcl\trace
注意
隨著時間的推移,警告文件會越來越大,數據庫管理員應該定期刪除警告文件。
3.跟蹤文件
跟蹤文件包括后臺進程跟蹤文件和用戶進程跟蹤文件。后臺進程跟蹤文件用于記錄后臺進程的警告或錯誤消息。后臺進程跟蹤文件的磁盤位置由初始化參數BACKGROUND_DUMP_DEST確定,后臺進程跟蹤文件的命名格式為<sid>_<processname>_<spid>.trc,如orcl_cjq0_5172.trc。用戶進程跟蹤文件用于記載與用戶進程相關的信息,它主要用于跟蹤SQL語句。通過用戶進程跟蹤文件,可以判斷SQL語句的執行性能。用戶進程跟蹤文件的位置由初始化參數USER_DUMP_DEST確定,用戶進程跟蹤文件的命名格式為<sid>_ora_<spid>.trc,如orcl_ora_4888.trc。
除了.trc文件,還有.trm文件。.trm文件為跟蹤元數據文件,伴隨著.trc文件產生,一個.trm對應一個.trc文件,.trm文件包含.trc文件的結構化信息。
【例2.15】在v$parameter視圖中查看當前實例用戶跟蹤文件的路徑,代碼及其運行結果如下。
SQL> select value from v$parameter where name = 'user_dump_dest'; VALUE -------------------------------------------------- e:\app\administrator\diag\rdbms\orcl\orcl\trace
說明
每個后臺進程都有對應的后臺進程跟蹤文件。
- Docker and Kubernetes for Java Developers
- LabVIEW 2018 虛擬儀器程序設計
- Oracle Database In-Memory(架構與實踐)
- 微信公眾平臺開發:從零基礎到ThinkPHP5高性能框架實踐
- 網店設計看這本就夠了
- PHP+MySQL網站開發項目式教程
- 信息技術應用基礎
- Raspberry Pi Home Automation with Arduino(Second Edition)
- Azure Serverless Computing Cookbook
- Machine Learning With Go
- Python入門很輕松(微課超值版)
- Laravel Application Development Blueprints
- JSP程序設計與案例實戰(慕課版)
- INSTANT Apache ServiceMix How-to
- Visual Basic語言程序設計上機指導與練習(第3版)