官术网_书友最值得收藏!

2.3 物理存儲結構

視頻講解:光盤\TM\lx\2\物理存儲結構.mp4

邏輯存儲結構是為了便于管理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 Oracle系統的數據文件信息

在上面的代碼中,可以看到3種類型的數據文件:系統數據文件(SYSTEM01.DBF和SYSAUX01.DBF)、撤銷數據文件(UNDOTBS01.DBF)和用戶數據文件(USERS01.DBF、EXAMPLE01.DBF、TBSP_1.DBF和TBSP_2.DBF),下面對這3種類型的數據文件進行介紹。

(1)系統數據文件。用于存放“特殊”的用戶數據和Oracle系統本身的數據,如用戶建立的表名、列名及字段類型等,這些屬于用戶數據范疇,這些數據被存放在系統表空間所包含的數據文件中;而Oracle系統內部的數據字典、系統表(如dba_data_files、dba_temp_files等)中所存儲的數據屬于Oracle系統的內部數據,這些數據也存放在系統表空間所包含的數據文件中。

(2)撤銷數據文件。撤銷數據文件隸屬于撤銷表空間。如果修改Oracle數據庫中的數據,那么就必須使用撤銷段,撤銷段用來臨時存放修改前的舊數據,而撤銷段通常存放在一個單獨的撤銷表空間中,這個撤銷表空間所包含的數據文件就是撤銷數據文件。

(3)用戶數據文件。用戶數據文件用于存放用戶應用系統的數據,這些數據包括與應用系統有關的所有相關信息,比如,上述TBSP_1.DBF和TBSP_2.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.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自動更改該數據庫的控制文件。數據恢復時,也要使用控制文件。

2.3.3 日志文件

日志文件的主要功能是記錄對數據所作的修改,對數據庫所作的修改幾乎都記錄在日志文件中。在出現問題時,可以通過日志文件得到原始數據,從而保證不丟失已有操作成果。Oracle的日志文件包括重做日志文件(Redo Log File)和歸檔日志文件(Archive Log File),它們是Oracle系統的主要文件,尤其是重做日志文件,它是Oracle數據庫系統正常運行所不可或缺的。下面將介紹這兩種日志文件。

1.重做日志文件

重做日志文件用來記錄數據庫所有發生過的更改信息(修改、添加、刪除等信息)及由Oracle內部行為(創建數據表、索引等)而引起的數據庫變化信息,在數據庫恢復時,可以從該日志文件中讀取原始記錄。在數據庫運行期間,當用戶執行COMMIT命令(數據庫提交命令)時,數據庫首先將每筆操作的原始記錄寫入日志文件中,寫入日志文件成功后,才把新的記錄傳遞給應用程序,所以,在日志文件上可以隨時讀取原始記錄以恢復某些數據。

技巧

通過對表或者整個表空間設定NOLOGGING屬性時,使基于表或表空間中所有的DML操作(如創建表、刪除視圖、修改索引等)都不會生成日志信息,這樣就會減少了日志信息的產生。

為了保障數據庫系統的安全,每個Oracle實例都啟用一個日志線程來記錄數據庫的變化。日志線程由若干“日志組”構成,而每個日志組又由一個或者多個日志文件構成。

【例2.7】 若要了解Oracle系統的日志文件信息,可以通過查詢v$controlfile視圖來實現,代碼如下(實例位置:光盤\TM\sl\2\5)

        SQL> col member for a50;
        SQL> select name from v$controlfile;

本例運行結果如圖2.9所示。

圖2.9 Oracle系統的日志文件信息

Oracle系統在運行過程中產生的日志信息,首先被臨時存放在SGA(系統全局區)的重做日志緩沖區中,當發出COMMIT命令(或日志緩沖區信息滿1/3)時,LGWR進程(日志寫入進程)將日志信息從重做日志緩沖區中讀取出來,并將讀取的日志信息寫入日志文件組中序列號較小的文件里,一個日志組寫滿后接著寫另外一個日志組。當LGWR進程將所有能用的日志文件都使用過一遍之后,它將再次轉向第一個日志組重新覆寫。

2.歸檔日志文件

在所有的日志文件被寫入一遍之后,LGWR進程將再次轉向第一個日志組進行重新覆寫,這樣勢必會導致一部分較早的日志信息被覆蓋掉,但Oracle通過歸檔日志文件解決了這個問題。

Oracle數據庫可以運行在兩種模式下,即歸檔模式和非歸檔模式。非歸檔模式是指在系統運行期間,所產生的日志信息不斷地記錄到日志文件組中,當所有重做日志組被寫滿后,又重新從第一個日志組開始覆寫。歸檔模式就是在各個日志文件都被寫滿而即將被覆蓋之前,先由歸檔進程(ARCH)將即將被覆蓋的日志文件中的日志信息讀出,并將讀出的日志信息寫入歸檔日志文件中,而這個過程又被稱為歸檔操作。

在歸檔操作進行的過程中,日志寫入進程(ARCH)需要等待歸檔進程(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所示。

圖2.10 查看當前Oracle系統的歸檔模式

如果將Oracle數據庫系統設置成在歸檔模式下運行,則可以通過服務器參數文件SPFILE的log_archive_dest參數來確定歸檔日志文件的所在路徑。

【例2.9】 可以使用下面的語句來查詢歸檔日志文件的所在路徑,代碼如下(實例位置:光盤\TM\sl\2\7)

        SQL> set pagesize 30;
        SQL> show parameter log_archive_dest;

本例運行結果如圖2.11所示。

圖2.11 歸檔日志文件的所在路徑

技巧

若顯示SPFILE文件的指定參數的信息,則只需要使用“show parameter”+參數名即可。

2.3.4 服務器參數文件

服務器參數文件SPFILE(Server Parameter File)是二進制文件,用來記錄Oracle數據庫的基本參數信息(如數據庫名、控制文件所在路徑、日志緩沖大小等)。數據庫實例在啟動之前,Oracle系統首先會讀取SPFILE參數文件中設置的這些參數,并根據這些初始化參數來配置和啟動實例。比如,設置標準數據塊的大小(即參數db_block_size的值)、設置日志緩沖區的大小(即參數log_buffer的值)等,所以SPFILE參數文件非常重要。服務器參數文件在安裝Oracle數據庫系統時由系統自動創建,文件的名稱為SPFILEsid.ora, sid為所創建的數據庫實例名。

與早期版本的初始化參數文件INITsid.ora不同的是,SPFILE中的參數由Oracle系統自動維護,如果要對某些參數進行修改,則盡可能不要直接對SPFILE進行編輯,最好通過企業管理器(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.12 查詢視圖V$PARAMETER

(2)可以使用SQL*Plus的SHOW PARAMETER命令顯示服務器的參數。

【例2.11】 通過SHOW PARAMETER命令顯示服務器參數,代碼如下。

        SQL> show parameter

本例運行結果如圖2.13所示。

圖2.13 顯示服務器參數

2.修改服務器參數

修改數據庫的服務器參數,主要通過企業管理器(OEM)或ALTER SYSTEM命令來實現。

(1)通過企業管理器(OEM)修改,首先使用SYSTEM用戶登錄OEM,然后選擇“服務器”頁面中的“初始化參數”項,將打開如圖2.14所示的“初始化參數”頁面,在該頁面的“值”列中就可以修改參數值,然后保存就可以。

圖2.14 OEM中的初始化參數

(2)使用ALTER SYSTEM命令修改服務器參數。

【例2.12】 通過ALTER SYSTEM命令修改標準數據塊的大小為4096字節,代碼及運行結果如下。

        alter system set db_block_size=4096;


        系統已更改。

2.3.5 密碼文件、警告文件和跟蹤文件

Oracle系統運行時,除了必須的數據文件、控制文件、日志文件及服務器參數文件外,還需要一些輔助文件,如密碼文件、警告文件和跟蹤文件,下面對這些輔助文件進行簡單的介紹。

1.密碼文件

密碼文件是Oracle系統用于驗證sysdba權限的二進制文件,當遠程用戶以sysdba或sysoper連接到數據庫時,一般要用密碼文件驗證。

Oracle 11g(這里以發行版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。

【例2.15】 在V$PARAMETER視圖中查看當前實例的用戶跟蹤文件的路徑,代碼及運行結果如下。

        SQL> select value from v$parameter where name = 'user_dump_dest';


        VALUE
        -------------------------------------------------
        e:\app\administrator\diag\rdbms\orcl\orcl\trace

說明

每個后臺進程都有對應的后臺進程跟蹤文件。

主站蜘蛛池模板: 苏尼特左旗| 台北县| 沙湾县| 托克托县| 冕宁县| 万源市| 老河口市| 万山特区| 吉木萨尔县| 英超| 晋州市| 邯郸市| 岑巩县| 清新县| 四会市| 益阳市| 张家港市| 全椒县| 杭锦后旗| 新密市| 东阳市| 越西县| 许昌市| 五原县| 梧州市| 丹棱县| 偏关县| 新丰县| 长海县| 九寨沟县| 康平县| 邵阳县| 石景山区| 沂源县| 崇左市| 永平县| 高阳县| 射阳县| 微山县| 大新县| 包头市|