Oracle 系統的物理存儲結構比較具體和直觀,它用來描述 Oracle 數據在磁盤上的物理組成情況。Oracle 系統的數據在邏輯上存儲在表空間中,而在物理上存儲在表空間所包含的物理文件(即數據文件)中。
Oracle 數據庫的物理存儲結構由多種物理文件組成,主要由數據文件、控制文件、重做日志文件、歸檔日志文件、參數文件、口令文件和警告日志文件等。
一、數據文件
數據文件時用於保存用戶應用程序數據和 Oracle 系統內部數據的文件,這些文件在操作系統中就是普通的系統文件, Oracle 在創建表空間的同時會創建數據文件。Oracle 數據庫在邏輯上由表空間組成,每個表空間可以包含一個或多個數據文件,一個數據文件只能隸屬於一個表空間。
在創建表空的同時,Oracle 會創建該表空間的數據文件。在表空間中創建數據對象(如表、索引、序列等)時,用戶是無法指定使用哪一個數據文件來進行存儲的,只能由 Oracle 系統負責為數據對象選擇集體的數據文件,並在其中分配物理存儲空間。一個數據對象的數據可以全部存儲在一個數據文件中,也可以分布存儲在一個表空的多個數據文件中。
在讀取數據時,Oracle系統首先從數據文件中讀取數據,並將數據存儲在內存的高數緩沖區中。如果用戶要讀取數據庫的某些數據,而請求的數據又不在內存的高速數據緩沖區中,則需要從相應的數據文件中讀取數據並存儲在緩沖區中。當修改和插入數據時,Oracle 不會立即將數據寫入數據文件,而是把這些數據保存在數據緩沖區中,然后由 Oracle 的后台進程 DBWR 決定如何將其寫入相應的數據文件。這樣的存取方式減少了磁盤的 I/O 操作,提高了系統的響應性能。
數據文件又可以分為3種類型:系統數據文件(system01.dbf 和 sysaux01.dbf )、撤銷數據文件(undotbs01.dbf)和用戶數據文件(users01.dbf、example01.dbf、tbsp_1.dbf和 tbsp_2.dbf)。
1、系統數據文件
用於存放“特殊” 的用戶數據和 Oracle 系統本身的數據,如用戶建立的表名、列名及字段類型等,這些屬於用戶數據范疇,這些數據將存放在系統表空間所包含的數據文件中;而 Oracle 系統內部的數據字典、系統表中所存儲的數據屬於 Oracle 系統的內部數據,這些數據也存放在系統表空間所包含的數據文件中。
2、撤銷數據文件
撤銷數據文件隸屬於撤銷表空間。如果修改 Oracle 數據庫中的數據,那么就必須使用撤銷段,撤銷段用來臨時存放修改前的舊數據,而撤銷段通常存放一個單純的撤銷表空間中,這個撤銷表空間所包含的數據文件就是撤銷數據文件。
3、用戶數據文件
用戶數據文件用於存放用戶應用系統的數據,這些數據包括與應用系統有關的所有相關信息。
二、控制文件
控制文件時一個二進制文件,記錄了數據庫的物理結構,其中主要包含數據庫名、數據文件與日志文件的名字和位置、數據庫建立日期等信息。控制文件一般在 Oracle 系統安裝時或創建數據庫時自動創建,控制文件所存放的路徑由服務器參數文件 spfileorcl.ora 的 control_files 參數值來指定。
由於控制文件存放有數據文件、日志文件等的相關信息,因此, Oracle 實例在啟動時必須訪問控制文件。只有控制文件正常,實例才能加載並打開數據庫;但若控制文件中記錄了錯誤的信息,或者實例無法找到一個可用的控制文件,則實例無法正常啟動。
當 Oracle 實例在正常啟動時,系統首先要訪問的初始化參數文件 spfile,然后 Oracle 為系統全局區(SGA) 分配內存。這時, Oracle 實例處於安裝狀態,並且控制文件處於打開狀態;接下來 Oracle 會自動讀出 “控制文件” 中的所有數據文件和日志文件的信息,並打開當前數據庫中所有的數據文件和所有的日志文件以供用戶訪問。
每個數據庫至少擁有以供控制文件,以供數據庫可以同時擁有多個控制文件,但是以供控制文件只能屬於一個數據庫。控制文件內部除了存放數據庫名及其創建日期、數據文件、日志文件等的相關的信息之外,在系統運行過程中,還存放系統更改好、檢查點信息及歸檔的當前狀態等信息。
出於安全考慮,在安裝 Oracle 數據庫或創建數據庫時,Oracle 數據庫系統會自動創建兩個或3個控制文件,每個控制文件記錄相同的信息。這樣可確保在數據庫運行時,如果某個控制文件損壞, Oracle 會自動使用另外一個控制文件,當所有的控制文件都損壞時,系統將無法工作。
三、日志文件
日志文件的主要功能是記錄對數據所作的修改,對數據庫所作的修改幾乎都記錄在日志文件中。在出現問題時,可以通過日志文件得到原始數據,從而保障不丟失已有操作成果。 Oracle 的日志文件包括重做日志文件(Redo Log File)和歸檔日志文件(Archive Log File),它們是 Oracle系統的主要文件之一,尤其是重做日志文件,它是 Oracle 數據庫系統正常運行所不可或缺的。
1、重做日志文件
重做日志文件用來記錄數據庫所有發生過的更改信息(修改、添加、刪除等信息)及由 Oracle內部行為(創建數據表、索引等)而引起的數據庫變化信息。在數據庫恢復時,可以從該日志文件中讀取原始記錄。在數據庫運行期間,當用戶執行 commit 命令(數據庫提交命令)時,數據庫首先將每次曹鎖的原始記錄寫入到日志文件中,寫入日志文件成功后,才把新的記錄傳遞給應用程序。所以,在日志文件上可以隨時讀取原始記錄以恢復某些數據。
為了保障數據庫系統的安全,每個 Oracle 實例都啟用一個日志線程來記錄數據庫的變化。日志線程由若干“日志組”構成,每個日志組又由一個或者多個日志文件構成。
通過對表或者整個表空間設定 nologging 屬性時,使基於表空間所有的 DML操作(如創建表、刪除視圖、修改索引等操作)都不會生成日志信息,這樣就會減少信息的產生。
Oracle 系統在運行過程中產生的日志信息,首先被臨時存放在系統全局區的“重做日志緩沖區”中,當發出 commit 命令(或日志緩沖區信息滿1/3)時,LGWR 進程(日志寫入進程)將日志信息從“重做日志緩沖區” 中讀取出來,並將“讀取的日志信息” 寫入到日志文件組中序列號較小的文件里,一個日志組寫滿后接着寫另外一個日志組。當 LGWR 進程將所有能用的日志文件都使用過一遍之后,它將再次轉向第一個日志組重新覆寫。
2、歸檔日志文件
當所有的日志文件被寫入一遍之后,LGWR 進程將再次轉向第一個日志組進行重新覆寫,這樣勢必會導致一部分較早的日志信息覆蓋掉,但 Oracle 通過歸檔日志文件解決了這個問題。
Oracle 數據庫可以運行在兩種模式下,即歸檔模式和非歸檔模式。非歸檔模式是指在系統運行期間,所產生的日志信息不斷地記錄到日志文件組中,當所有重做日志組被寫滿后,又重新從第一個日志組開始覆寫。歸檔模式是在各個日志文件都被寫滿而即將被覆蓋之前,先由歸檔進程(ARCH)將即被覆蓋的日志文件中的日志信息讀出,並將 “讀出的日志信息” 寫入到歸檔日志文件中,而這個過程又被稱為歸檔操作。
在歸檔操作進行的過程中,日志寫入進程(ARCH)需要等待歸檔進程(ARCH)的結束才能開始覆寫日志文件,這樣就延遲了系統的響應時間,而且歸檔日志文件本身又會占用大量的磁盤空間,這些都會影響系統的整體性能。所以在默認情況下,Oracle 系統不采用歸檔模式運行。
四、服務器參數文件
服務器參數文件文件(Server parameter File)是二進制文件,用來記錄了 Oracle 數據庫的基本參數信息。數據庫實例在啟動之前,Oracle 系統首先會讀取 SPFILE 參數文件中設置的這些參數,病根據這些初始化參數來配置和啟動實例。例如:設着標准數據塊的大小(即參數 db_block_size 的值)、設置日志緩沖區的大小(即參數 log_buffer的值)等,所以 SPFILE 參數文件非常重要。服務器參數文件在安裝 Oracle 數據庫系統時由系統自動創建,文件的名稱為 SPFILEsid.ora ,sid 為所創建的數據庫實例名。
如果需要對某些參數進行修改,則盡可能不要直接對 SPFILE 進行編輯,最好通過企業管理器(OEM)或 alter system 命令來修改,所修改過的參數文件會自動寫到 SPFILE 文件中。
1、查看服務器參數
用戶可以通過如下兩種凡事查看數據庫的服務器參數。
(1)查看試圖 v$parameter,可利用該動態性能試圖來確定參數的默認值是否被修改過,以及是否可以用 alter system 和 alter session 命令修改。
(2)可以使用 SQL*Plus 的show parameter 命令顯示服務器的參數
2、修改服務器參數
修改數據庫的服務器參數,主要通過企業管理器(OEM) 或 alter system 命令來實現。
(1)通過企業管理器(OEM)修改,首先使用 system 用戶登錄 OEM,然后選擇 ”服務器“ 頁面中的 ”初始化參數“ 項,在 ”初始化參數“ 頁面,在該頁面的 ”值“ 列表中就可以修改參數值
(2)使用 alter system 命令修改服務器參數
alter system set db_block_size = 4096
通過 alter system 命令修改標准數據塊的大小為4096字節。
五、密碼文件、警告文件和跟蹤文件
1、密碼文件
密碼文件是 Oracle 系統用於驗證 sysdba 權限的二進制文件,當遠程用戶以 sysdba 或 sysoper 連接到數據庫時,一般要用密碼文件進行驗證。
Oracle 11g 密碼文件的默認存放位置在 %dbhome_1%\database 目錄下,密碼文件的命名格式為 PWD<sid>,其中 sid 表示數據庫實例名。創建密碼文件既可以在創建數據庫實例時自動創建,也可以使用 Orapwd.exe 工具手動創建,創建密碼文件的命令格式如下:
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 表示只有一個數據庫實例可以使用此密碼文件驗證。
例如:創建一個密碼文件,其 sys 口令為 0123456
C:\> orapwd file=E:\app\Admin\product\11.2.0\dbhome_1\database\PWDorcl.ora password=0123456 entries=40
2、警告文件
警告文件(警告日志文件)是一個存儲在 Oracle 系統目錄下的文本文件(通常名為alert_orcl.log),它用來記錄 Oracle 系統的允許信息和錯誤信息。運行信息一般包括 Oracle 實例的啟動與關閉、建立表空間、增加數據文件等;錯誤信息包括空間擴展失敗、啟動實例失敗等。
當 Oracle 安裝完畢后,其實例日常運行的基本信息都會記錄在警告文件中。警告文件的路徑可通過 Oracle 系統的background_dump_dest 參數值來查看,並且該參數值由服務器進程和后台進程寫入。
例如:在 v$parameter 試圖中查看當前實例的警告的路徑。
SQL> select name,value from v$parameter where name='background_dump_dest';
3、跟蹤文件
跟蹤文件包括后台進程跟蹤文件和用戶進程跟蹤文件。后台進程跟中文件用於記錄后台進程的警告或錯誤消息。后台進程跟蹤文件的磁盤位置又初始化參數 background_dump_dest 確定,后台進程跟蹤文件的命名格式為 <sid>_<processname>_<spid>,trc。用戶進程跟蹤文件用於記載於用戶進程相關的信息。它主要用於跟蹤 SQL 語句。通過用戶進程跟蹤文件,可以判斷 SQL 語句的執行性能。用戶進程和跟蹤文件的位置由初始化參數 user_dump_dest 確定,用戶進程跟蹤文件的命名格式為<sid>_ora_<spid>.trc。
例如:在 v$parameter 試圖中查看當前實例的用戶跟蹤文件的路徑。
SQL> select value from v$parameter where name='user_dump_dest';