1. 程式人生 > 其它 >Oracle資料庫體系結構

Oracle資料庫體系結構

Oracle資料庫體系結構

一、oracle資料庫體系結構

基本組成:

Oracle server:一般情況下是一個instance和一個database組成

一般:1個instance只能對應一個數據庫。

特殊:1個數據庫可以有多個instance(RAC)

一臺伺服器上同時可裝多套版本的資料庫軟體,每個資料庫軟體可建多個數據庫,但是每個資料庫只對應一個instance,也可以理解成每個資料庫只有一個SID 。

利用DBCA建出的每個庫都是相對獨立的,在同一伺服器上如果建立多庫必須將環境變數的引數檔案做區分,並且在對例項切換時需如下操作:

connect 使用者名稱/密碼@例項的服務名

1.1 oracle伺服器和例項

1.1.1例項

由記憶體區和後臺程序組成

①記憶體區:資料庫快取記憶體、重做日誌快取、共享池、流池以及其它可選記憶體區(如Java池),這些池也稱為資料庫的記憶體結構

②後臺程序:包括系統監控程序(SMON)、程序監控(PMON)、資料庫寫程序(DBWR)、日誌寫程序(LGWR)、檢驗點程序(CKPT)、其它程序(SMON,如歸檔程序、RECO程序等)

③注:要訪問資料庫必須先啟動例項,例項啟動時先分配記憶體區,然後再啟動後臺程序,後臺程序執行庫資料的輸入、輸出以及監控其它Oracle程序。在資料庫啟動過程中有五個程序是必須啟動的,它們是系統監控程序(SMON)、程序監控(PMON)、資料庫寫程序(DBWR)、日誌寫程序(LGWR)、檢驗點程序(CKPT),否則例項無法建立。

1.1.2伺服器

Oracle伺服器由資料庫例項和資料檔案組成,也就是我們常說的資料庫管理系統。資料庫伺服器除了維護例項和資料庫檔案之外,還在使用者建立與伺服器的連線時啟動伺服器程序並分配PGA

1.2 oracle資料庫邏輯結構

表空間:據庫的基本邏輯結構,是一系列資料檔案的集合;

段:不同型別資料在資料庫中佔用的空間,有許多區組合而成;

區:由連續的塊組成,目的是為資料一次性預留一個較大的空間,oracle為儲存空間進行分配回收都是以區為單位的;

塊:最小的儲存單位,在建立資料庫時指定,不能修改。大小是作業系統塊得整數倍。

1.3 oracle資料庫物理結構

1.3.1 資料檔案

資料庫中的實際資料

檢視資料檔案:

首先格式化一下:col file_name for a58;

select file_name,tablespace_name from dba_data_files;

1.3.2 控制檔案

維護資料庫和驗證資料庫完整性

檢視資料檔案:

首先格式化一下:col name format a60;

select name from v$controlfile;

1.3.3 重做日誌檔案

資料庫發生變化的記錄,用於資料恢復

檢視資料檔案:

select member from v$logfile;

1.3.4 引數檔案

引數檔案定義了資料庫例項的特性。在引數檔案中包含為SGA中記憶體結構分配空間的引數

如分配資料庫高速緩衝區的大小等,引數檔案是正文檔案,可以使用作業系統文字編輯器檢視,如在Windows 作業系統中使用記事本工具。

檢視引數檔案:

首先格式化:

col name for a30;

col value for a30;

select name,value,ismodified from v$parameter;

1.3.5 密碼檔案

密碼檔案授予使用者啟動和關閉資料庫例項,在剛安裝資料庫時,Oracle 的預設使用者名稱和密碼就儲存在密碼檔案中,Oracle 可以藉此判斷使用者的操作許可權。

1.3.6 歸檔日誌檔案

歸檔日誌檔案是日誌檔案的離線備份,在發生故障後進行資料恢復時可能使用該檔案

二、資料連線與會話

2.1 資料庫連線

使用者程序與資料庫伺服器之間通訊,一個連線可以有多個對話。三種連線:

2.1.1 基於主機的方式
2.1.2 基於客戶機-伺服器
2.1.3 客戶-應用伺服器-資料庫伺服器

2.2 會話

三、oracle資料庫記憶體結構

Oracle的記憶體結構由兩部分組成:SGA與PGA

①PGA 稱為程式全域性區,程式全域性區不是例項的一部分,當伺服器程序啟動時,才分配PGA。②SGA 稱為系統全域性區,它是資料庫例項的一部分,當資料庫例項啟動時,會首先分配系統全域性區。

在系統全域性區中包含:資料庫快取記憶體(Database buffer cache)、重做日誌快取(Redo log buffer cache)、共享池(Shared pool)、大池(Large pool)和Java 池(Java pool)

3.1 共享池(Shared pool)

3.1.1 共享池的作用

Oracle 引入共享池的目的就是共享SQL 或PL/ SQL 程式碼,即把解析得到的SQL 程式碼的結果在這裡快取

3.1.2 共享池組成

共享池由兩部分組成,即庫快取記憶體(Libray cache)和資料字典快取記憶體(Data dict cache),①庫快取記憶體庫快取記憶體儲存了最近使用過的SQL 和PL/ SQL 語句。

②資料字典快取記憶體是與資料字典相關的一段緩衝區。在資料字典高速緩衝區中儲存了資料檔案、表、索引、列、使用者、許可權資訊和其它一些資料庫物件的定義。

3.1.3設定共享池的大小

SQL> alter system set shared_ pool_ size = 16M;

3.1.4檢視共享池的大小

SQL> show parameter shared_ pool_ size;

3.2 資料庫快取記憶體區(Database buffer cache)

3.2.1 概念

儲存了最近從資料檔案讀入的資料塊資訊或使用者更改後需要寫回資料庫的資料資訊,此時這些沒有提交給資料庫的更改後的資料稱為髒資料。

當用戶執行查詢語句如select* from dept 時,如果使用者查詢的資料塊在資料庫快取記憶體中,Oracle 就不必從磁碟讀取,而是直接從資料庫快取記憶體中讀取

3.2.2查詢資料庫塊的大小

SQL> show parameter db_ block_ size;

3.2.3查詢資料庫快取記憶體的大小

SQL> show parameter db_ cache_ size;

因為在Oracle 11g 中,SGA 為資料庫伺服器自動管理,所以該引數值為0

3.2.4查詢資料庫快取記憶體的大小

SQL> show sga;

3.2.5設定資料庫高速緩衝區大小

SQL> alter system set db_ cache_ size = 200M;

3.2.6檢視資料庫快取記憶體顧問狀態

SQL> show parameter db_ cache_ advice;

3.2.7檢視與設定資料庫高速緩衝區相關的資訊

SQL> col id for 99 SQL> SELECT id, name, block_ size, size_ for_ estimate, buffers_ for_ estimate 2 from v$ db_ cache_ advice;

3.3 重做日誌快取記憶體區(Redo Log buffer cache)

3.3.1 概念

當用戶執行了如INSERT、UPDATE、DELETE、CREATE、ALTER 或DROP 操作後,資料發生了變化,這些變化了的資料在寫入資料庫快取記憶體之前會先寫入重做日誌緩衝區,同時變化之前的資料也放入重做日誌快取記憶體,這樣在資料恢復時Oracle 就知道哪些需要前滾哪些需要後滾了。

3.3.2檢視重做日誌快取區

SQL> show parameter log_ buffer;

重做日誌快取區引數log_ buffer 是靜態引數,不能動態修改

3.4 大池

大池是SGA 的一段可選記憶體區,只在共享伺服器環境中配置大池。

在共享伺服器環境下,Oracle 在共享池中分配額外的空間用於儲存使用者程序和伺服器程序之間的會話資訊,但是使用者程序區域UGA(可理解為PGA 在共享伺服器中的另一個稱呼)的大部分將在大池中分配,這樣就減輕了共享池的負擔

3.4.1檢視大池大小

SQL> show parameter large_ pool_ size

3.4.2 修改大池大小

SQL> alter system set large_ pool_ size = 48M

3.5 java池

Java 池也是可選的一段記憶體區,但是在安裝完Java 或者使用Java 程式時則必須設定Java 池,它用於編譯Java 語言編寫的指令。

3.5.1檢視java 池的大小

SQL> show parameter java_ pool_ size;

值為0 說明在Oracle 11g 中,Java 池大小由資料庫伺服器在SGA 中自動分配,當然使用者也可以使用alter system 指令修改該引數的值

3.4.2 修改java池大小

SQL> alter system set java_ pool_ size = 48M

3.6 流池(Streaming pool)

流池也稱為流記憶體,它是Oracle 流專用的記憶體池,流(stream)是Oracle 資料庫中的一個數據共享,其大小可以通過引數stream_ pool_ size 動態調整。

3.7 PGA和UGA

3.7.1 PGA

PGA(程序全域性區)

PGA 中儲存了伺服器程序或單獨的後臺程序的資料資訊和控制資訊。它隨著伺服器程序的建立而被分配記憶體,隨著程序的終止而釋放記憶體。PGA 與SGA 不同,它不是一個共享區域,而是伺服器程序專有的區域。在專有伺服器(與共享伺服器相對的概念)配置中包括如下的元件:排序區、會話資訊、遊標狀態、堆疊區

3.7.2 UGA

UGA(使用者全域性區)

在共享伺服器模式下有一個重要的概念即UGA,它是使用者的會話狀態,這部分記憶體會話總可以訪問,UGA 儲存在每個共享伺服器都可以訪問的SGA 中,這樣任何伺服器都可以使用使用者會話的資料和其它資訊。而在專有伺服器模式下,使用者會話狀態不需要共享,使用者程序與伺服器程序是一一對應的關係,所以UGA 總是在PGA 中進行分配。

3.7.3 PGA記憶體管理

從Oracle 9i 開始,Oracle 提高了兩種辦法管理PGA,即手動PGA 管理和自動PGA 管理。採用手動管理時,必須告訴Oracle 一個特定的程序需要的排序區,允許使用多少記憶體,而在自動PGA 管理中,則要求高速Oracle 在系統範圍內可以為PGA 中的特定功能如排序區分配多少記憶體。

①查詢PGA 中排序區的大小

SQL> show parameter sort_ area_ size;

四、oracle程序

伺服器程序和使用者程序,是使用者使用資料庫連線工具同資料庫伺服器建立連線時,涉及的兩個概念。

4.1 伺服器程序

伺服器程序猶如一箇中介,完成使用者的各種資料服務請求,而把資料庫伺服器返回的資料和結果發給使用者端。

在專有連線中,一個伺服器程序對應一個使用者程序,二者是一一對應的關係。

在共享連線中,一個伺服器程序對應幾個使用者程序,此時伺服器程序通過OPI(Oracle Program Interface)與資料庫伺服器通訊。

4.2 使用者程序

當用戶使用資料庫工具如SQL* Plus

與資料庫伺服器建立連線時,就啟動了一個使用者程序,即SQL* Plus 軟體程序

使用SCOTT 使用者連線資料庫:SQL> conn scott/tiger

使用者和資料庫伺服器建立了連線,資料庫伺服器產生一個伺服器程序,負責與資料庫伺服器的直接互動

4.3 oracle資料庫後臺程序

後臺程序是在例項啟動時,在資料庫伺服器端啟動的管理程式,它使資料庫的記憶體結構和資料庫物理結構之間協調工作。它們是DBWR、LGWR、PMON、SMON 和CKPT

4.3.1系統監控程序(SMON)

系統監控程序的主要作用就是資料庫例項恢復。當資料庫發生故障時,如作業系統重啟,此時例項SGA 中的所有沒有寫到磁碟的資訊都將丟失。當資料庫重新啟動後,系統監控程序自動恢復例項。

4.3.2程序監控程序(PMON)

程序監控負責伺服器程序的管理和維護工作,在程序失敗或連線異常發生時該程序負責一些清理工作。

4.3.3資料庫寫程序(DBWR)

在介紹高速緩衝區時,提到了髒資料的概念,髒資料就是使用者更改了的但沒有提交的資料庫中的資料,因為在資料庫的資料檔案與資料庫快取記憶體中的資料不一致,故稱為髒資料,這種髒資料必須在特定的條件下寫到資料檔案中,這就是資料庫寫程序的作用。

資料庫寫程序負責把資料庫高速緩衝區中的髒資料寫到資料檔案中。或許讀者會問,為什麼不立即提交髒資料呢,這樣就不需要複雜的資料庫寫程序來管理。其實,Oracle 這樣設計的思路很簡單,就是減少I/ O 次數,但髒資料量達到一定程度或者某種其它條件滿足時,就提交一次髒資料。因為磁碟的輸入、輸出會花費系統時間,使得Oracle 系統的效率不高。4.3.4重做日誌寫程序(LGWR)

重做日誌寫程序負責將重做日誌緩衝區中的資料寫到重做日誌檔案。此時重做日誌緩衝區中的內容是恢復事務所需要的資訊,比如使用者使用UPDATE 語句更新了某行資料,恢復事務所需的資訊就是更新前的資料和更新後的資料,這些資訊用於該事務的恢復

4.3.5歸檔日誌程序(ARCH)

歸檔日誌程序是可選程序,該程序並不在例項啟動時自動啟動。它的作用是把寫滿的重做日誌檔案的資料寫到一個歸檔日誌中,這個歸檔日誌用作介質故障時的資料庫恢復

檢視系統的歸檔模式

SQL> con system/ oracle@ orcl as sysdba;

SQL> archive log list;

設定資料庫為歸檔模式的過程

SQL> shutdown immediate

SQL> conn /as sysdba;

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

查詢當前資料庫的歸檔模式

SQL> archive log list;

檢視資料庫恢復目錄的位置

SQL> show parameter db_ recovery

4.3.6校驗點程序(Checkpoint process)

首先介紹檢驗點,檢驗點是一個事件,當資料庫寫程序把SGA 中所有被修改了的資料庫高速緩衝中的資料寫到資料檔案上時產生,這些被修改的資料包括提交的和未提交的資料。由於引入了校驗點,使得所有的校驗點的所有變化了的資料都寫到資料檔案中,在例項恢復時,就不必恢復校驗點之前的重做日誌中的資料,加快了系統恢復的效率。校驗點程序並不是用於建立校驗點,只是在校驗點發生時,會觸發這個程序進行一系列工作

強制執行校驗點SQL> alter system checkpoint;

五、記憶體管理

5.1 記憶體架構

①SGA 為資料庫例項的一部分,在資料庫啟動時會首先分配這塊記憶體,包括資料庫快取記憶體、共享池、大池、流池、Java 池以及Redo Buffer。

②PGA 也可以成為私有全域性區,是某個使用者程序所獨有的。在專有連線模式下,每個使用者會話都會分配一個PGA,使用者儲存會話資訊。當然在PGA 與SGA 之間是伺服器程序,最終是伺服器程序訪問SGA 來滿足使用者的資料訪問。

③資料庫例項啟動時,Oracle 資料庫會分配記憶體區並啟動後臺程序。

記憶體區儲存瞭如下的資訊:

程式程式碼。

建立過連線的會話資訊。(即使該會話當前不是活躍的inactive。)

程式執行期間所需資訊,如SQL 查詢的當前狀態。

在程序間共享並且進行通訊的資訊如鎖資料。

快取資料,如資料庫塊、重做塊。(快取這些在磁碟上的資料。)

④Oracle 資料庫基本的記憶體結構包括

SGA系統全域性區:SGA 是一組共享的記憶體結構。這些元件包含資料庫例項所需的資料和控制資訊。它是一個共享的記憶體結構,所有伺服器程序和後臺程序共享。

PGA 程式全域性區:是非共享的記憶體區域,包含Oracle 程序所獨自使用的資料和控制資訊。PGA 與伺服器程序和後臺程序共存,即PGA 是為伺服器程序和後臺程序服務的記憶體區,為這些程序獨有,不是所有程序共享的記憶體區,所以這部分不會出現爭用。資料庫初始化引數設定例項PGA 的大小,這個大小為整個例項所擁有。

UGA 使用者全域性區:該記憶體區域和一個使用者會話相關聯。

軟體程式碼區:該記憶體區用於儲存正在執行的程式程式碼。

5.1.1 PGA概述

PGA 記憶體是專為某個作業系統程序或者執行緒服務的,不能被其他程序或者執行緒共享使用。正因為PGA 是程序專有的記憶體區域,所以從來不會在SGA 中分配。PGA 是一個記憶體堆,儲存了專有或者共享伺服器程序所需的會話相關變數。伺服器程序負責在PGA 中分配它所需要的記憶體結構

5.1.2 SGA 概述

①SGA 是可讀寫的記憶體區。SGA 和後臺程序組成了Oracle 資料庫例項,代替使用者工作的伺服器程序可以讀SGA 中的資料。伺服器和後臺程序並不駐留在SGA 中,而是存在於獨立的記憶體空間中。每一個數據庫都有自己的SGA。Oracle 資料庫在例項啟動時自動分配SGA,在例項關閉時自動關閉SGA。

②SGA 由幾個記憶體元件組成,稱為記憶體池。這些記憶體池的空間分配以Granules 為單位,即粒度為單位,粒度是一個連續的記憶體空間,粒度大小與作業系統平臺有關,由整個SGA 的大小決定。下面是最重要的幾個SGA 元件。

Database Buffer Cache:資料庫快取記憶體

Redo Log Buffer:重做日誌快取

Shared Pool:共享池

Large Pool:大池

Java Pool:Java 池

Streams Pool:流池

③Fixed SGA:固有區域資料庫快取記憶體,是一個共享的記憶體結構,這意味著發生記憶體爭用的事件都發生共享的記憶體結構中。資料庫快取記憶體用來儲存從資料檔案讀取的資料塊,臨時儲存當前或者最近讀取的資料塊。提高Oracle 資料庫讀寫資料的效率。

5.1.3 UGA概述

UGA 是會話記憶體,為某個使用者會話服務,給會話分配記憶體儲存會話變數,這些變數包括登入資訊以及會話所需的其他資訊。本質來講UGA 儲存了使用者的會話狀態。圖8- 4 是UGA 組成圖。

在共享伺服器模式下,UGA 在SGA 中分配,這樣任何的共享伺服器程序都可以訪問它。如果在PGA 中分配,由於PGA 只為單個程序服務,不能共享。當使用專有伺服器模式時,UGA 在PGA 中分配。

5.2 記憶體管理

MEMORY_ TARGET 設定後,SGA 和PGA 實現自動調整,根據負載狀況協調記憶體的使用,這個引數是動態引數,所以不需要重啟資料庫就可以設定,如下所示。

SQL> alter system set memory_ target= 1000M SCOPE= BOTH;

MEMORY_ MAX_ TARGET 設定MEMORY_ TARGET 的上限,畢竟作業系統的記憶體不僅僅為Oracle 服務,這樣就防止設定了MEMORY_ TARGET 過大的值,而使得作業系統的記憶體資源短缺。如果使用DBCA 建庫,此時資料庫預設啟動自動記憶體管理。

5.2.1配置記憶體元件

如果沒有啟動自動記憶體管理,比如使用DBCA 建庫時設定了SGA 和PGA 相關引數值,或者使用CREATE DATABASE 手工建庫時沒有設定MEMORY_ TARGET 引數,此時就需要啟動自動記憶體管理特性。

使用AS SYSDBA 角色登入資料庫,設定MEMORY_ TARGET 的值,這個值通過SGA_ TAGET+ PGA_ AGGREGATE_ TARGET 計算。

memory_ target = sga_ target + max( pga_ aggregate_ target, maximum PGA allocated)

其中sga_ target 和pga_ aggregate_ target 可以通過SHOW PARAMETER TARGET 獲得,而maximum PGA Allocated 通過select value from v$ pgastat where name=' maximum PGA allocated';查詢獲得。一般比這個計算值還要大些,如果實體記憶體夠的話。

MEMORY_ MAX_ TARGET 考慮SGA 和PGA 的將來預期,預設該引數與MEMORY_ TARGET 相同。它是一個靜態引數,需要如下修改。

ALTER SYSTEM SET MEMORY_ MAX_ TARGET = nM SCOPE = SPFILE;

如果使用PFILE 啟動資料庫,也可以在初始化引數檔案中寫入這些引數的值。

memory max target = nM memory_ target = mM

通過動態效能檢視$ memory_ target_ advice 檢視對於MEMORY_ SIZE 的大小設定建議。其中記憶體尺寸因子MEMORY_ SIZE_ FACTOR 為1 的MEMORY_ SIZE 為當前的記憶體大小,也就是引數memory_ target 的大小。

檢視對於MEMORY_ SIZE 的大小設定建議:

SQL> select * from v$ memory target advice order by memory size;

查詢MEMORY_ TARGET 的大小

SQL> show parameter memory target;

查詢PGA 和SGA 的大小

SQL> show parameter sga;

SQL> show parameter pga

從輸出知道,PGA 和SGA 的值為0,說明這兩個記憶體元件是自動調整的。在EM 企業管理器中,可以使用影象化的記憶體顧問檢視對於MEMORY_ SIZE 設定尺寸的建議。

5.2.2 SGA 與PGA 的自動調整

在使用DBCA 建庫時,選擇Custom 即可實現共享記憶體自動管理,需要配置PGA 和SGA 的大小,SGA 的記憶體元件是自動調整,同樣PGA 的記憶體元件也是自動調整

對於SGA,只要設定TARGET 值和MAXIMUM 值即可實現SGA 內相關記憶體自動調整,當然SGA 的其他自動調整的記憶體引數也可以通過手工設定。

SGA 包括共享池、大池、Java 池、資料庫調整快取、流池。

記憶體元件與相應引數:

共享池 SHARED_ POOL_ SIZE

大池LARGE_ POOL_ SIZE

Java 池JAVA_ POOL_ SIZE

資料庫快取記憶體 DB_ CACHE_ SIZE

流池 STREAMS_ POOL_ SIZE

在自動PGA 記憶體調整狀態下PGA 相關元件的大小資訊。

查詢PGA 相關元件的大小

SQL> show parameter area_ size;

從這個輸出知道引數bitmap_ merge_ area_ size、create_ bitmap_ area_ size、hash_ area_ size 以及sort_ area_ size 是自動調整的引數。

workarea_ size_ policy,這個引數是決定自動調整PGA 還是手工調整PGA,如果手工調整PGA 則必須設定引數workarea_ size_ policy 為manual

5.2.3配置資料庫smart flash 快取

Smart flash cache 是Oracle 在11g 版本中提供的新功能,是一個新的記憶體元件,預設這個記憶體元件沒有配置。也就是沒有啟用。它的核心作用是快取更多的資料,提高讀資料的效率,減少CPU 的負擔以及減小資料庫快取記憶體的壓力。

啟用smart flash cache 功能後,從資料庫快取記憶體移動到flash cache 中的資料塊而言,將有部分資料塊的元資料儲存在資料庫快取記憶體中。對於單例項資料庫而言,每個資料塊的元資料佔據大約100B 的空間。而對於RAC 環境則大約是200B,所以在設定smart flash cache 時需要考慮資料庫快取記憶體的額外空間需求。

如果是手工調整記憶體方式,則需要增加資料庫快取記憶體的大小,其值為進入smart flash cache 的資料塊數量乘以100。如果採用自動記憶體調整則需要調整MEMORY_ TARGET,大小參考手工調整記憶體的大小。如果使用自動共享記憶體調整,即SGA 元件自動調整,此時需要增加SGA_ TARGET 的值。

設定smart flash cache 時需要設定兩個引數,其中一個引數需要指定儲存smart flash cache 資料塊的磁碟目錄以及名稱,要求必須在Flash 盤上儲存smart cache 資料,否則會影響效能。涉及的兩個引數是db_ flash_ cache_ file 和db_ flash_ cache_ size,

查詢SmartFlash Cache 涉及的兩個引數

SQL> show parameter flash_ cache;

修改這兩個引數以啟動smart flash cache 功能。

設定db_ flash_ cache_ file 和db_ flash_ cache_ size 引數

SQL> alter system set db_ flash_ cache_ file='/ u01/ flash_ cache' scope= spfile;

SQL> alter system set db_ flash_ cache_ size= 1g scope= spfile;

這兩個引數都不是動態引數,修改後需要重啟資料庫才能生效。我們重啟資料庫後驗證修改結果。

重啟資料庫使引數修改生效

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORA- 00439: feature not enabled:

Server Flash Cache

我們看到此時的提示為該特性沒有啟動。其實,這個也在預想之中,因為我們的作業系統不是啟動該特性要求的系統,顯然不會得到支援。如果在Solaris 或者Oracle Enterprise Linux 系統上將得到支援,但是設定方法是一樣的。

六、使用者管理和資原始檔

6.1 建立使用者

6.1.1 建立新使用者

要建立資料庫必須使用DBA 許可權的使用者,使用SYS 使用者登入資料庫

sys/ Oracle1234 as sysdba

建立資料庫使用者

SQL> create user jane identified by american default tablespace users temporary tablespace temp quota 10m on users password expire;

建立了使用者JANE:

create user jane:建立使用者JANE,其中create user 為建立使用者指令。

identified by american:設定使用者密碼為american,其中identified by 為建立使用者指令。

default tablespace users:設定預設表空間為USERS 表空間,該表空間儲存使用者資料。●  temporary tablespace temp:建立臨時表空間TEMP,該表空間使用者諸如排序等操作的資料空間。

quota 10m on users:設定該使用者對於表空間USERS 的配額為10M。

password expire:說明使用者JANE 登入資料庫時,密碼立即失效,Oracle 會提示重新輸入密碼,如下所示。

SQL> connect jane/ american

為使用者JANE 賦予CREATE SESSION 許可權

SQL> connect sys/ Oracle1234 as sysdba

SQL> grant create session ,resource to jane;

然後就可以用新密碼登入資料庫了,如下所示。

SQL> connect jane/ oracle

在成功建立了資料庫後使用資料字典DBA_ USERS 檢視使用者JANE 的資訊

SQL> col username for a10

SQL> col default_ tablespace for a10

SQL> col temporary_ tablespace for a15

SQL> col password for a20

SQL> select username, password, expiry_date, default_tablespace, temporary_tablespace, created from dba_ users where username = 'JANE'

從輸出可以看出使用者的預設表空間為USERS,而臨時表空間為TEMP,該使用者的建立時間為01- JAN- 13。而密碼是加密的,這也是Oracle 認為安全第一的緣故,即使具有DBA 許可權的使用者也無法看到該使用者的密碼,雖然DBA 使用者可以建立或刪除使用者

檢視使用者JANE 的表空間配額資訊

SQL> select tablespace_name, username, max_bytes from dba_ts_quotas where username ='JANE';

6.1.2 建立使用者語法及引數含義

建立使用者的語法格式

CREATE USER user IDENTIFIED {BY password | EXTERNALLY} [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA {integer [K | M]| UNLIMITED} ON tablespace [QUOTA {integer [K | M]| UNLIMITED} ON tablespace ]……] [PASSWORD EXPIRE] [ACCOUNT { LOCK | UNLOCK }] [PROFILE { profile | DEFAULT }]

下面介紹其中的幾個引數:

CREATE USER user:建立使用者user。

IDENTIFIED{ BY password | EXTERNALLY}:設定使用者密碼,EXTERNALLY 說明該使用者由作業系統授權。該引數在建立使用者時是不能省略的。

DEFAULT TABLESPACE tablespace:設定使用者的預設表空間。

TEMPORARY TABLESPACE tablespace:設定使用者的臨時表空間。

QUOTA {integer[ K| M]| UNLIMITED} ON tablespace:設定該使用者對於表空間的配額,即表空間的多大空間給該使用者使用,引數UNLIMITED 說明沒有限制,K| M 是配額單位。●  PASSWORD EXPIRE:設定使用者密碼在使用者第一次使用時作廢,需要重新設定該使用者密碼。

ACCOUNT{ LOCK | UNLOCK}:選擇是否鎖定該使用者,LOCK 鎖定使用者,而UNLOCK 不鎖定使用者,該引數的預設值是UNLOCK。

PROFILE {profile | DEFAULT}:使用指定的概要檔案,profile 為概要檔名。如果不指定概要檔案,則使用DEFAULT 的預設概要檔案,預設的概要檔案對所有限制的初始值都沒有限制。

從以上建立使用者的語法可以看出,在建立新使用者前,必須做些準備工作,整個準備工作和建立過程如下所示。

確認儲存使用者物件的表空間。

確定在每個表空間上的空間配額。

分配一個預設表空間和一個臨時表空間。

開始建立使用者。

向用戶授權和角色。如使得使用者具有建立會話的權利,輔以使用者DBA 角色許可權等。

6.1.3 改變使用者引數

在成功建立使用者後,如果對使用者引數如預設表空間等不滿意,可以改變使用者引數

修改使用者JANE 的預設表空間配額

SQL> connect system/oracle

SQL> alter user jane quota 20m on users;

在修改成功後,我們使用資料字典DBA_ TS_ QUOTAS 來驗證修改結果。

驗證使用者JANE 的表空間修改結果

SQL> select tablespace_name, username, max_bytes from dba_ts_quotas where username =' JANE';

從輸出結果可以看出使用者JANE 在表空間USERS 上的配額被修改為20M。說明修改成功。

修改使用者JANE 的預設表空間

SQL> alter user jane default tablespace newtbs quota unlimited on system;

我們增加了使用者JANE 的一個預設表空間為NEWTBS,在該表空間的配額為UNLIMITED(沒有限制)。我們再通過資料字典DBA_TS_QUOTAS 來檢視修改結果。

檢視使用者JANE 的預設表空間修改資訊

SQL> select username, tablespace_name, max_bytes from dba_ts_quotas where username =' JANE';

輸出可以看出使用者JANE 在表空間NEWTBS 上的配額為- 1,說明沒有限制,而此時使用者在表空間USERS 上的配額依然存在。而如果不希望使用者使用表空間USERS 的空間,即回收使用者在USERS 表空間的使用權,又如何處理呢

回收使用者JANE 在表空間USERS 的使用權

SQL> alter user jane quota 0 on users;

此時,我們使用設定使用者在表空間USERS 上的配額為0 來回收對其使用權。然後我們再通過資料字典DBA_ TS_ QUOTAS 來檢視該使用者的表空間配額資訊

驗證是否回收使用者JANE 的表空間USERS 的使用權

SQL> select username, tablespace_ name, max_ bytes from dba_ ts_ quotas where username =' JANE';

從輸出可以看出使用者JANE 沒有使用表空間USERS,只有表空間NEWTBS,而且該表空間的使用空間不受限制,如果在回收USERS 表空間的使用權之前,已經在該表空間上使用了5M 空間,則不能再給使用者JANE 分配使用空間了。

6.2 刪除使用者

SQL> drop user jane;

驗證是否成功刪除使用者JANE

SQL> select username, created, default_tablespace from dba_users where username =' JANE';

輸出結果是“未選定行”,說明使用者JANE 不存在,

在刪除使用者時,如果該使用者已經連線到資料庫伺服器,則無法刪除。可以斷開該使用者的連線在刪除使用者。我們也可以使用資料字典DBA_ USERS 來檢視當前系統上的使用者名稱

檢視當前系統上的所有使用者資訊

SQL> select username, account_status, created from dba_users;

在以上輸出中ACCOUNT_ STATUS 說明使用者的狀態,其中值OPEN 說明該使用者可用,而EXPIRED 說明該使用者過期,LOCKED 說明該使用者鎖定。那麼如何解鎖這些鎖定的使用者呢,

解鎖使用者

SQL> ALTER USER outln IDENTIFIED BY outln ACCOUNT UNLOCK;

解鎖過程中,我們需要先使用IDENTIFIED BY 修改使用者的密碼

使用解鎖的使用者登入資料庫

SQL> connect outln/outln

SQL> show user USER 為" OUTLN"

6.3 使用者和資料庫模式

在建立了使用者後,需要賦予該使用者許可權使得它可以建立資料庫物件如表、索引、觸發器等,而此時會涉及模式的概念。

模式與使用者對應,當一個使用者建立成功時,也對應地建立了一個模式。而且二者是一對一的關係,名字相同。模式是命名的資料庫物件的集合,這些資料庫物件包括表、檢視、索引等。

使用者擁有資料庫的模式,而且使用者名稱和模式經常互換使用。

模式物件:表、觸發器、約束、索引、檢視、序列號、儲存過程、同義詞、使用者定義的資料型別、函式、軟體包。

我們可以使用SCOTT 使用者登入資料庫,然後使用資料字典USER_ OBJECTS 來檢視當前使用者所擁有的資料庫模式物件

檢視使用者SCOTT 所擁有的模式物件

SQL> select distinct (object_ type) from user_ objects;

從輸出可以看出SCOTT 使用者或稱SCOTT 模式擁有2 個模式物件,分別是表(TABLE)和索引(INDEX)。

6.4 使用者管理中的重要檔案——概要檔案

在建立使用者後就需要給該使用者各種系統資源,如CPU、並行會話數、空閒時間限制等資源限制,同時需要對口令做出更詳細的管理方案,如嘗試登入指定的次數後賬戶被鎖定、口令過期之後的處理等,如果對每個使用者都進行資源限制或口令管理,要輸入大量的指令,比如每個使用者輸入10 條資源限制或口令限制指令,對10 個使用者就輸入100 條指令,顯然這樣的效率很低,尤其是對使用者的資源限制和口令限制都相同時,只是重複的輸入指令,Oralce 提供了概要檔案來管理使用者,可以避免上述問題。

6.4.1 什麼是概要檔案

概要檔案就是一組指令的集合,這些指令限制了使用者資源的使用或口令的管理,在建立使用者時,有一個PROFILE 引數就是用來指定概要檔案的,一旦概要檔案建立就可以將概要檔案通過ALTER USER 指令賦予使用者或者在CREATE USER 時指定概要檔案。通過將概要檔案賦予使用者可以極大較少DBA 的工作量。如果沒有指定概要檔案,則會自動使用一個預設概要檔案。

6.4.2 使用資源管理和口令管理的概要檔案步驟

使用概要檔案可以實現使用者的資源管理和口令管理。使用步驟如下所示。

●  使用CREATE PROFILE 指令建立一個概要檔案。

●  使用ALTER USER(已有使用者)或CREATE USER(新使用者)將概要檔案賦予使用者。

●  對於資源管理而言,啟動資源限制,修改動態引數RESOURCE_ LIMIT 為TRUE,此時既可以通過修改引數檔案也可以使用ALTER SYSTEM 來修改。

6.4.3 使用概要檔案管理會話資源

當用戶連線到資料庫時,就與資料庫伺服器建立了會話連線,此時使用者會消耗資料庫伺服器的資源,所以我們建立一個會話級的資料庫資源限制的概要檔案來限制使用者對資源的使用。

我們先給出建立資源管理的概要檔案的語法格式,如下所示。

CREATE PROFILE profile_ name LIMIT [SESSIONS_ PER_ USER n] [CPU_ PER_ SESSION n] [CPU_ PER_ CALL n] [CONNECT_ TIME n] [IDLE_ TIME n] [LOGICAL_ READS_ PER_ SESSION n] [LOGICAL_ READS_ PER_ CALL n]

其中n 為最大值。

SESSIONS_ PER_ USER n:表示每個使用者的最大會話數。

CPU_ PER_ SESSION n:每個會話佔用的CPU 時間,單位是0. 01 秒。

CPU_ PER_ CALL n:每個呼叫佔用的CPU 時間,單位是0. 01 秒。

CONNECT_ TIME n:每個連線支援連線的時間。

IDLE_ TIME n:每個會話的空閒時間。

LOGICAL_ READS_ PER_ SESSION n:每個會話的物理和邏輯讀資料塊數。

建立資源限制概要檔案

SQL> create profile scott_ prof limit sessions_ per_ user 10 cpu_ per_ session 10000 idle_ time 40 connect_ time 120;

建立了一個名為SCOTT_ PROF 的概要檔案,加在該檔案上的限制是sessions_ per_ user 每個使用者的並行會話數為10,cpu_ per_ session 每個會話的CPU 時間為1000 秒。idle_ time 連線空閒時間為40 分,connect_ time 保持連線時間為120 分。

通過資料字典DBA_ PROFILES檢視概要檔案SCOTT_ PROF

SQL> col profile for a20

SQL> col resource_ name for a25

SQL> col limit for a20

SQL> select * from dba_ profiles where profile =' SCOTT_ PROF' order by limit;

從輸出可以看出概要檔案SCOTT_ PROF 的所有資源引數,其中資源引數SESSION_ PER_ USER、CPU_ PER_ SESSION、CONNECT_ TIME、IDLE_ TIME 為建立概要檔案時指定的值,而其他資源引數都採用預設值。其中RESOURCE 列的值中KERNEL 行表示一個資源引數,而PASSWORD 表示一個安全限制,接下來我們介紹如何建立口令管理的概要檔案。

6.4.4 口令管理引數以及含義

建立口令管理的概要檔案與建立資源限制的概要檔案一樣,都是使用CREATE USER 或者ALTER USER 指令將概要檔案賦予使用者,口令檔案一旦賦予使用者立即生效,不需要開啟設定。

下面介紹完成口令管理的引數以及含義。首先,檢視概要檔案SCOTT_ PROF 中的口令引數,使用資料字典DBA_ PROFILES 檢視概要檔案SCOTT_ PROF的口令管理引數

SQL> col resource_ name for a30

SQL> select * from dba_ profiles where profile=' SCOTT_ PROF' * and resource_ type=' PASSWORD'

從輸出發現有7 個引數實現使用者的口令管理,如下所示。

FAILED_ LOGIN_ ATTEMPTS:嘗試失敗登入的次數,如果使用者登入資料庫時登入失敗次數超過該引數的值則鎖定該使用者。

PASSWORD_ LIFE_ TIME:口令有效的時限,超過該引數指定的天數則口令失效。

PASSWORD_ REUSE_ TIME:口令在能夠重用之前的天數。

PASSWORD_ REUSE_ MAX:口令能夠重用之前的最大變化數。

PASSWORD_ VERIFY_ FUNCTION:在為一個新使用者賦予口令之前要驗證口令的複雜性是否滿足要求的一個函式,該函式使用PL/ SQL 語言編寫,名字為verify_ function。

PASSWORD_ LOCK_ TIME:當用戶登入失敗後,使用者被鎖定的天數。

PASSWORD_ GRACE_ TIME:口令過期之後還可以繼續使用的天數。

口令的最小長度要求4 個字元。

口令不能與使用者名稱相同。

口令應至少包含一個字元、一個數字和一個特殊字元

新口令至少有3 個字母與舊口令不同。

要使用Oracle 提供的口令驗證函式,需要先執行一個名為utlpwdmg. sql 的指令碼檔案,執行指令碼檔案建立口令複雜性驗證函式時,需要使用SYS 使用者登入資料庫且作為DBA 使用者,該檔案在$ ORACLE_ HOME\ RDBMS\ ADMIN 目錄下(根據安裝的磁碟略有不同)。

執行建立口令複雜性驗證函式的過程

SQL> connect system/ oracle as sysdba

SQL> @ F:\ app\ oracle\ product\ 11. 2. 0\ dbhome_ 1\ RDBMS\ ADMIN\ utlpwdmg. Sql

從輸出可以看出,函式已經建立,且配置檔案已經更改,這裡建立了函式VERIFY_ FUNCTION。

驗證口令驗證函式VERIFY_ FUNCTION 是否建立

SQL> col owner for a10

SQL> col object_ name for a20

SQL> select owner ,object_ name, object_ type, created from dba_ objects where object_ type =' FUNCTION' * and object_ name =' VERIFY_ FUNCTION'

顯然,函式VERIFY_ FUNCTION 存在說明建立成功,這意味著整個資料庫系統的使用者都使用在ALTER PROFILE DEFAULT LIMIT 中設定的口令限制,除非使用者建立了另一個口令管理的概要檔案,或修改了概要檔案引數值。

更改使用者SCOTT 的使用者密碼為oracle,看是否成功修改

SQL> conn system/oracle as sysdba

SQL> alter user scott identified by oracle ; alter user scott * 第1 行出現錯誤:ORA- 29003: 指定口令的口令驗證失敗ORA- 20002: Password too simple

顯然,修改失敗,因為密碼oracle 不符合函式VERIFY_ FUNCTION 中定義的規則之一。此時也說明口令管理的概要檔案即時生效。

6.4.5 建立口令管理的概要檔案

在介紹了口令管理的引數以及含義後,我們就可以根據業務需要建立口令管理概要檔案。

語法格式:

CREATE PROFILE profile_ name LIMIT [parameter1 para_ value1] [parameter2 para_ value2] ...

建立口令管理的概要檔案

SQL> create profile password_ prof limit failed_ login_ attempts 5 password_ life_ time 90 password_ reuse_ time 30 password_ lock_ time 15 password_ grace_ time 3;

上面建立了概要檔案password_ prof,各個引數的含義如下所示。

failed_ login_ attempts 5:嘗試登入的失敗次數為5 次,5 次之後該使用者將被鎖定。

password_ life_ time 90:該密碼在90 天內有效。

password_ reuse_ time 30:該口令失效後30 天后才可以使用。

password_ lock_ time 15:在嘗試登入指定的次數後,該使用者被鎖定15 天。

password_ grace_ time 3:在口令過期後,4 天內可以使用舊口令(過期的口令)登入資料庫。

現在讀者已經明白建立的密碼概要檔案的作用,通過資料字典DBA_ PROFILES 檢視密碼概要檔案PASSWORD_ PROF 的口令引數

SQL> col resource_ type for a10

SQL> col limit for a15

SQL> select * from dba_ profiles where profile =' PASSWORD_ PROF' * and resource_ type =' PASSWORD'

從輸出可以看出在建立密碼概要檔案時,沒有明確給出數值的都採用預設值,這些引數LIMIT 列的值為DEFAULT。

6.5 修改和刪除概要檔案

Oracle 允許使用ALTER PROFILE 指令來修改概要檔案中的引數,我們修改概要檔案PASSWORD_ PROF 的口令管理引數。

修改口令管理概要檔案的引數

SQL> alter profile password_ prof limit failed_ login_ attempts 3 password_ life_ time 60 password_ grace_ time 7;

輸出顯示成功修改口令管理的配置檔案,下面我們使用資料字典DBA_ PROFILES 來驗證修改結果

檢視修改後的口令管理概要檔案PASSWORD_ PROF 的引數

SQL> select * from dba_ profiles where profile=' PASSWORD_ PROF' and resource_ type =' PASSWORD';

輸出中引數被修改成功。如果不需要某個概要檔案,可以使用指令DROP PROFILE 刪除,如果要刪除的概要檔案已經賦予了使用者則需要使用CASCADE 引數。

刪除概要檔案PASSWORD_ PROF

SQL> drop profile password_ prof;

驗證是否刪除概要檔案PASSWORD_ PROF

SQL> select * from dba_ profiles where profile =' PASSWORD_ PROF';

未選定行“未選定行”說明成功刪除了概要檔案PASSWORD_ PROF,因為在資料字典DBA_ PROFILES 中沒有該檔案記錄。

七、控制檔案和資料庫啟動

7.1 概述

控制檔案是一個非常小的二進位制檔案,記錄了資料庫的狀態資訊,如重做日誌檔案與資料檔案的名字和位置、歸檔重做日誌的歷史等,它的大小不會超過64MB,但是歸檔日誌的歷史記錄會讓該檔案逐漸變大。

控制檔案在資料庫啟動的MOUNT 階段被讀取,控制檔案和資料庫是一對一的關係,因為控制檔案的重要性,所以需要將控制檔案放在不同磁碟上,以防止控制檔案的失效造成資料庫無法啟動,控制檔案的大小在CREATE DATABASE 語句中被初始化。

在資料庫啟動時,會首先使用預設的規則找到並開啟引數檔案,在引數檔案中儲存了控制檔案的位置資訊,通過引數檔案Oracle 可以找到控制檔案的位置,開啟控制檔案,然後會通過控制檔案中記錄的各種資料庫檔案的位置開啟資料庫,從而啟動資料庫到可用狀態。

當成功啟動資料庫後,在資料庫的執行過程中,資料庫伺服器可以不斷地修改控制檔案中的內容,所以在資料庫被開啟的階段,控制檔案必須是可讀寫的。但是其他任何使用者都無法修改控制檔案,只有資料庫伺服器可以修改控制檔案中的資訊。

7.2 獲得控制檔案的資訊

控制檔案是資料庫啟動時非常重要的一個檔案,通常一個數據庫需要至少3 個控制檔案,而且這些控制檔案最好不要放在同一個磁碟上,這樣可以防止磁碟故障造成資料庫無法啟動。

在資料庫啟動和控制檔案關係中,控制檔案的位置通過引數檔案獲得,顯然我們可以開啟引數檔案獲得控制檔案的位置。但是這種方式不方便而且不安全,如果使用者不小心輸入了某個字元,會造成控制檔案錯誤。

Oralce 提供了檢視v$ parameter 來檢視控制檔案的位置

SQL> SELECT value FROM v$ parameter where name = 'control_ files';

使用show parameter 檢視當前控制檔案的位置

SQL> show parameter control_ files;

使用該方式檢視控制檔案的位置時,預設輸出3 列,分別是引數名NAME、引數型別TYPE 和引數值VALUE。

通過資料字典v$ controlfile 檢視控制檔案的名字和儲存目錄

SQL> col name for a50 ;

SQL> select status , name from v$controlfile;

在v$ parameter 檢視中記錄控制檔名字和目錄的列名為VALUE,而在v$ controlfile 檢視中記錄控制檔名字和目錄的列名為NAME。

7.3 控制檔案的內容

控制檔案的內容控制檔案是二進位制檔案,是無法通過文字編輯器檢視的,而且該檔案由Oracle 資料庫伺服器自動維護,DBA 無法干預。我們可以通過Oralce 的文件得知控制檔案中的內容,以及使用v$ controlfile_ record_ section 檢視檢視所有的記錄資訊。

7.3.1 控制檔案所存的內容

控制檔案中所存的內容在相關文件中,說明了控制檔案中存放了如下的資訊。

●  資料庫名:在初始化引數DB_ NAME 中獲得,或是CREATE DATABASE 語句執行時使用的名字。

●  資料庫識別符號:資料庫建立時Oralce 記錄的識別符號。

●  資料庫建立時間:建立資料庫時由Oracle 自動記錄。

●  表空間資訊:當表增加或刪除表空間時記錄該資訊。

●  重做日誌檔案歷史:在日誌切換時記錄。

●  歸檔日誌檔案的位置和狀態資訊:在歸檔程序發生時完成。

●  備份的狀態資訊和位置:由恢復管理器記錄。

●  當前日誌序列號:日誌切換時記錄。

●  檢驗點資訊:當檢驗點事件發生時記錄。

7.3.2 檢視控制檔案所存內容的記錄資訊

查詢控制檔案中所儲存的內容,此時使用動態資料字典檢視v$ controlfile_ record_ section。

SQL> SELECT type, record_ size, records_ total, records_ used FROM v$ controlfile_ record_ section;

從上述輸出可以看出控制檔案中存放了建立資料庫的資訊、重做日誌資訊、資料檔案以及歸檔日誌檔案記錄等資訊。控制檔案中記錄了大量很有價值的資訊用於資料庫維護和管理,很多動態資料字典檢視就是從控制檔案中獲得資料的,這些資料字典檢視如下所示。

v$ backup 、v$ database、v$ tempfile、v$ tablespace、v$ archive 、v$ log、v$ logfile、 v$ loghist 、v$ archived_ log、v$ database

下面我們說明從控制檔案中獲得相關資料的檢視的用處,如v$ database 檢視就是從控制檔案中獲得基礎資料,通過該檢視可以檢視資料庫ID、建立時間和資料庫是否處於歸檔模式等。

SQL> col name for a20

SQL> select name, created, log_ mode from v$ database;

雖然我們不能從控制檔案中直接讀取關於資料庫建立的資訊,但是可以間接地通過資料字典檢視v$ database 來檢視。上面的輸出顯示了當前資料庫的全域性名為ORCL,建立時間為10- 10 月- 010 且處於歸檔模式

7.4 儲存多重控制檔案

正是由於控制檔案的重要性,就要求控制檔案不能只有一個,通常生產資料庫中的控制檔案要多於3 個,並且存放在不同的磁碟上。Oracle 資料庫會同時維護多個完全相同的控制檔案,這也稱為多重控制檔案。在不同磁碟上儲存多重控制檔案可以避免控制檔案的單點失效問題。如果一個磁碟的控制檔案失效,Oracle 會自動使用引數檔案中記錄的其他控制檔案啟動資料庫。

在控制檔案的維護中,Oracle 會建議使用者遵循一個原則,即使用多重控制檔案,並將控制檔案的副本儲存在不同的磁碟上,監控備份工作。下面將依次講解如何使用多重控制檔案並將檔案副本儲存在不同的磁碟上、如何備份控制檔案,以及如何恢復控制檔案。

7.4.1 多重控制檔案

在Oralce 資料庫中,控制檔案的預設儲存目錄和資料庫檔案,重做日誌檔案等存放在同一個目錄下,以Oralce 11g 為例,該目錄為:$ ORACLE_ BASE\ oradata\ ORACLE_ SID.

檢視當前資料庫上的控制檔案分佈

SQL> col name for a50;

SQL> select status, name from v$controlfile;

D:\ORACLE\ORADATA\ORCL\CONTROL01.CTL

D:\ORACLE\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL

把這麼重要的控制檔案放在同一個磁碟的同一個目錄下顯然是不安全的,我們應該遵循Oracle 的忠告,使用多重控制檔案並存儲在不同的磁碟上。

7.4.2 移動控制檔案

資料庫在啟動時首先要讀取引數檔案,而引數檔案有傳統的PFILE(init. ora)檔案和SPFILE 檔案,針對採用不同的資料庫啟動初始化引數檔案實現控制檔案的分散式儲存的方式略有不同。下面依次演示。

1、使用PFILE(init. ora)檔案時移動控制檔案

PFILE 檔案是一個可識別的正文檔案,我們可以對儲存在PFILE 中的引數直接更改,這就方便了使用PFILE 實現移動控制檔案的儲存方式,其具體步驟如下:

①利用資料字典獲得控制檔案的名字

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

此時輸出的控制檔案資訊就是引數檔案中儲存的控制檔名及目錄資訊

②6關閉資料庫

SQL> shutdown immediate 資料庫已經關閉。已經解除安裝資料庫。ORACLE 例程已經關閉。③修改引數檔案PFILE 中引數control_ files 的值,即更改控制檔名而使得該檔案儲存在不同目錄下並儲存該檔案。

④使用作業系統命令把①中的控制檔案CONTROL2. CTL 和CONTROL2. CTL 分別複製到目錄D:\ OraBackup\ disk1 和D:\ OraBackup\ disk2 下。之後需要刪除掉步驟1 中預設目錄下的CONTROL2. CTL 和CONTROL3. CTL 檔案,以防止檔案冗餘。

⑤重啟資料庫。

SQL> startup

⑥驗證控制檔案的修改結果

SQL> col name for a40

SQL> SELECT * FROM v$ controlfile

此時,我們的修改成功,3 個控制檔案儲存在不同磁碟,3 個不同磁碟上的控制檔案由Oracle 資料庫伺服器自動維護,一旦發生諸如增刪資料檔案或更改重做日誌名等事件,Oracle 資料庫伺服器會同時更改這3 個控制檔案中的資訊。

2、使用SPFILE 檔案時移動控制檔案

因為SPFILE 是二進位制檔案,所以無法通過修改PFILE 的方式修改控制檔名,Oralce 提供了ALTER SYSTEM 指令允許修改SPFILE 中的引數。此時實現控制檔案分散式儲存的步驟如下。

①獲取控制檔名

SQL> select * from v$ controlfile;

②使用alter system set 指令修改SPFILE 中的控制檔名

SQL> alter system set control_ files = 'F:\ APP\ ADMINISTRATOR\ ORADATA\ ORCL\ CONTROL01. CTL ', 'D:\ ORABACKUP\ DISK3\ CONTROL02. CTL', 'D:\ ORABACKUP\ DISK4\ CONTROL03. CTL' SCOPE = SPFILE;

③關閉資料庫

SQL> shutdown immediate

④將控制檔案CONTROL02. CTL 和CONTROL03. CTL 複製到更改的目錄下。即將CONTROL02. CTL 複製到目錄D:\ ORABACKUP\ DISK3 下,將CONTROL03. CTL 複製到目錄D:\ ORABACKUP\ DISK4 下。

⑤重啟資料庫

SQL> conn /as sysdba

SQL> startup

驗證是否使用PFILE 啟動資料庫

SQL> show parameter spfile;

顯然,現在VALUE 的值不為空,說明此時使用SPFILE 檔案啟動資料庫。

⑥驗證控制檔案的修改結果

SQL> select status, name from v$ controlfile;

從上述輸出看出,我們已經將名為CONTROL02 和CONTROL03 的控制檔案分佈到了D:\ ORABACKUP\ DISK3 和D:\ ORABACKUP\ DISK4 目錄下。

7.4.3 新增控制檔案

Oracle 預設建立3 個控制檔案,使用7. 4. 2 節中介紹的方法可以移動控制檔案,將控制檔案儲存在不同的磁碟空間,以防止控制檔案的單點失效。

在生產資料庫中往往至少需要3 個控制檔案,需要5 個控制檔案的處理步驟,以資料庫啟動時採用PFILE 引數檔案為例。

①檢視控制檔案的名字

②關閉資料庫

③使用作業系統命令將①中的一個控制檔案複製到一個目錄下並修改控制檔案的名字,如複製到目錄D:\ OraBackup\ disk5 下,控制檔名修改為CONTROL05. CTL

④修改引數檔案中引數control_ files 的值,新增一個控制檔名,如D:\ OraBackup\ disk5\ CONTROL05. CTL

⑤重新啟動資料庫。

7.5 備份和恢復控制檔案

由於控制檔案在資料庫啟動過程中的重要性,所以最好備份控制檔案,這樣在發生控制檔案損壞時,可使用備份的檔案來恢復控制檔案,保證資料庫的正常啟動和執行。

7.5.1 控制檔案的備份

使用ALTER DATABASE BACKUP CONTROL 備份控制檔案

SQL> alter database backup controlfile to 'd:\ OraBackup\ disk5\ backup_ controlfile_ 010_ 06_ 14. ora';

注意目錄D:\ OraBackup\ disk5 必須是存在的,Oracle 會自動在該目錄下建立一個備份檔案backup_ controlfile_ 010_ 06_ 14. ora。由於Oracle 資料庫伺服器不斷地更改控制檔案中的資訊,所以備份的控制檔案不是最新的,在恢復資料庫時最好不要使用備份的控制檔案,這樣會造成資料丟失。

Oracle 也提供了一種方式用於備份控制檔案,即將控制檔案備份到追蹤檔案中,使用該檔案就可以恢復控制檔案。其備份方法首先要設定引數sql_ trace 為true

SQL> alter session set sql_ trace = true;

注意在使用該方式備份控制檔案時,必須把引數sql_ trace 的值設定為true,Oracle 預設該引數值為false。再使用如下指令將控制檔案備份的追蹤檔案中。

SQL> alter database backup controlfile to trace;

Oracle 提供了一個引數user_ dump_ dest,可以檢視跟蹤檔案的儲存目錄

查詢引數user_ dump_ dest 指定的目錄

SQL> show parameter user_ dump_ dest;

從輸出看出,跟蹤檔案的儲存目錄為F:\ app\ administrator\ diag\ rdbms\ orcl\ orcl\ trace

7.5.2 控制檔案的恢復

在資料庫中如果有一個或多個控制檔案丟失或出錯,我們可以根據不同的情況進行處理。

1、部分控制檔案損壞的情況

如果資料庫正在執行,我們可以先關閉資料庫,再將完好的控制檔案複製到已經丟失或出錯的控制檔案的位置,但是要更改檔名字為該丟失或出錯的控制檔案的名字。如果儲存丟失的控制檔案的目錄也被破壞,則需要重新建立一個新的目錄用於存放新的控制檔案,併為該控制檔案命名。此時需要修改資料庫初始化引數檔案中控制檔案的位置資訊。

2、控制檔案全部丟失或損壞

此時使用備份的控制檔案重建控制檔案。先關閉資料庫,再將備份的控制檔案複製到先前控制檔案的所在位置上,並更改備份控制檔名為先前控制檔案的檔名。接下來開啟資料庫到MOUNT 狀態,

SQL> startup mount

然後開啟資料庫,

ALTER DATABASE OPEN USING BACKUP CONTROLFILE; 注意此時由於使用備份的控制檔案所以會有資料丟失的情況,因為從該備份檔案被備份時刻起到控制檔案發生故障時間段內發生的資料變化無法恢復。

八、重做日誌管理

重做日誌是Oracle 資料庫中很重要的一部分內容。在資料庫恢復時,需要掌握重做日誌的工作原理,學會如何配置和維護重做日誌

8.1 oracle為何引入重做日誌

資料恢復。

在資料庫執行過程中,使用者更改的資料會暫時存放在資料庫高速緩衝區中,而為了提高寫資料庫的速度,不是一旦有資料變化,就把變化的資料寫到資料檔案中,頻繁的讀寫磁碟檔案使得資料庫系統效率降低,所以,要等到資料庫高速緩衝區中的資料達到一定的量或者滿足一定條件時,DBWR 程序才會將變化了的資料寫到資料檔案中。

這種情況下,如果在DBWR 把變化了的更改寫到資料檔案之前發生了宕機,那麼資料庫高速緩衝區中的資料就全部丟失,如果在資料庫重新啟動後無法恢復這部分使用者更改的資料,顯然是不合適的。

重做日誌就是把使用者變化了的資料首先儲存起來,其中LGWR 程序負責把使用者更改的資料優先寫到重做日誌檔案中。這樣在資料庫重新啟動時,資料庫系統會從重做日誌檔案中讀取這些變化了的資料,將使用者更改的資料提交到資料庫中,寫入資料檔案。

為了提高磁碟效率,併為了防止重做日誌檔案的損壞,Oracle 引入了一種重做日誌結構,重做日誌檔案結構由3 個重做日誌組組成,每個重做日誌組中有兩個重做日誌成員(重做日誌檔案),當然可以有更多的重做日誌組,每個組中也可以有更多的重做日誌成員。

資料庫系統會先使用重做日誌組1,該組寫滿後,就切換到重做日誌組2,再寫滿後,繼續切換到重做日誌組3,然後迴圈使用重做日誌組1,Oracle 以這樣迴圈的方式使用重做日誌組。該結構直觀地說明重做日誌檔案的組成,Oracle 規定每個資料庫例項至少有兩個重做日誌組,每個重做日誌組至少有一個重做日誌檔案。當重做日誌組中有多個日誌成員時,每個重做日誌成員的內容相同,Oracle 會同步同一個重做日誌組中的每個成員。在工作過程中,Oracle 迴圈地使用重做日誌組,當一個重做日誌組寫滿時,就自動進行日誌切換,切換到它可以找到的其他重做日誌組,併為該日誌組設定一個日誌序列號。在必要的條件下也可以實現強制日誌切換。如果沒有啟動歸檔日誌,當一個迴圈結束,再次使用先前的重做日誌組時,會以覆蓋的方式向該組的重做日誌檔案中寫資料。在非歸檔模式下,在重新使用新的聯機重做日誌前,DBWR 程序需要將所有的資料更改寫到資料檔案中,這有時也稱為DBWR 歸檔。所以,對於生產資料庫要求工作在歸檔模式下。

如果資料庫處於歸檔模式下,當前正在使用的重做日誌寫滿後,Oracle 會關閉當前的日誌檔案,ARCH 程序把舊的重做日誌檔案中的資料移動到歸檔重做日誌檔案中。歸檔完成後,尋找下一個可用重做日誌組,找到該組中可用的日誌檔案,開啟該檔案並實現寫操作。歸檔程序並不是一直存在。注意如果資料庫處於歸檔模式,在歸檔程序ARCH 把聯機重做日誌移動到歸檔日誌前,Oracle 無法使用一個已經關閉的重做日誌。即如果ARCH 沒有完成,就沒有已經歸檔的聯機重做日誌可以用於切換,只有ARCH 釋放了聯機重做日誌後,資料庫才可以繼續工作。

8.2 讀取重做日誌檔案資訊

8.2.1 v$log檢視

資料字典檢視v$ log 記錄了當前資料庫的日誌組號、日誌序列號、每個日誌檔案的大小、每個日誌組的成員數量,以及日誌組的當前狀態。

使用v$ log 檢視重做日誌資訊

SQL> conn /as sysdba

SQL> select group#, sequence#, bytes, members, archived, status 2 from v$ log;

輸出說明,當前有3 個日誌組,與每個日誌檔案對應的日誌序列號,該序列號是全域性唯一的,同一個日誌組中的日誌序列號相同,使用者資料庫恢復時使用。每個日誌組的成員數量及每個日誌組的當前狀態。重做日誌組1 為當前正在使用的重做日誌組,該日誌組中有最大日誌序列號,該日誌檔案還沒有歸檔。

8.2.2 v$logfile檢視

資料字典檢視v$ logfile 記錄了當前日誌組號、該日誌組的狀態、型別和日誌組成員資訊,使用資料字典檢視v$ logfile 檢視重做日誌組資訊

SQL> conn /as sysdba

SQL> col member for a50

SQL> select group#, status, type, member 2 from v$ logfile;

在解釋輸出結果前,先介紹一下STATUS 引數的含義:

●  STALE:說明該檔案內容是不完整的。

●  空白:說明該日誌組正在使用。

●  INVALID:表示該檔案不能被訪問。

●  DELETED:表示該檔案已經不再使用。

從輸出,我們可以知道,該資料庫系統有3 個重做日誌組,每個日誌組有一個重做日誌成員,且都為聯機(ONLILNE)重做日誌檔案。其實DBA 如果看到這樣的情況,應該知道需要增加重做日誌成員,並且把每個日誌組的重做日誌成員分佈在不同磁碟上。

8.2.3 判斷是否歸檔

檢視當前的資料庫是否處於歸檔模式

SQL> conn /as sysdba

SQL> archive log list;

輸出說明,該資料庫不處於日誌歸檔模式,自動存檔禁用

8.2.4 設定資料庫為歸檔模式

如何在Oracle 11g 中設定資料庫為歸檔模式。首先要關閉資料庫,再啟動資料庫到mount 狀態:

關閉資料庫並啟動資料庫到mount 狀態

SQL> shutdown immediate

SQL> startup nomount;

SQL> alter database mount;

SQL> alter database archivelog;

此時雖然資料庫處於歸檔模式,而且是自動歸檔。在設定了資料庫為歸檔模式,而且為自動歸檔後,

驗證資料是否處於歸檔模式

SQL> conn /as sysdba

SQL> archive log list;

上例說明資料庫日誌模式已經處於“存檔模式”,存檔重點為引數db_ recovery_ file_ dest 指定的目錄,我們可以使用如下查詢知道該引數指定的檔案目錄

檢視引數db_ recovery_ file_ dest 的值

SQL> show parameter db_ recovery_ file_ dest;

從引數db_ recovery_ file_ dest 的值為可以知道歸檔檔案的儲存目錄,並且引數db_ recovery_ file_ dest_ size 指出該目錄儲存檔案的大小為2G。

8.3 重做日誌組及其管理

Oracle 要求最少兩個重做日誌組,每個日誌組至少一個日誌成員,而在生產資料庫中至少需要3 個重做日誌組,而每個重做日誌組需要多於3 個重做日誌成員,這些日誌成員最好部署在不同磁碟的不同目錄下,由於重做日誌檔案在資料庫恢復中的重要性,分散式部署的目的就是為了防止磁碟損壞造成的重做日誌失效。本節講述如何新增重做日誌組及其管理。

8.3.1 新增重做日誌組

向當前資料庫中新增一個新的日誌組的語法格式為:

ALTER DATABASE [database_ name] ADD LOGFILE [GROUP number] filename SIZE n [,ADD LOGFILE [GROUP number] filename SIZE n……]

注意Filename 為日誌組成員的檔案目錄和檔名稱。引數GROUP number 可以不用,Oracle 會自動生成一個日誌組號,該日誌組號在原有日誌組號的基礎上加1。

新增一個重做日誌組

SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ('d:\ temp\ redo04a. log', 'd:\ temp\ redo04b. log') SIZE 11M;

向當前資料庫新增一個重做日誌組,日誌組號為4,如果不選擇GROUP 引數,則預設在原有重做日誌組號的基礎上自動增長,如原來最大的日誌組號為2,則此時新建的預設組號為3 等,依次類推。在日誌組4 中有兩個日誌成員,大小都為11MB。

驗證新增日誌組的結果

SQL> select * from v$ logfile;

輸出結果說明,成功新增重做日誌組,該日誌組有兩個日誌成員,地址為D:\ TEMP\ REDO04A. LOG 和D:\ TEMP\ REDO04B. LOG,這兩個重做日誌成員都處於聯機狀態。

下面再新增一個重做日誌組,此時不選擇GROUP 引數,向該日誌組中新增3 個日誌成員,成員大小都為11MB

新增一個重做日誌組並向該日誌組中新增3 個日誌成員

SQL> ALTER DATABASE ADD LOGFILE ('d:\ disk6\ redo05a. log', 'd:\ disk6\ redo05b. log', 'd:\ disk6\ redo05c. log') SIZE 11 M;

驗證執行結果

SQL> conn /as sysdba

SQL> select * from v$ logfile;

顯然,我們新新增的重做日誌組號為5,該日誌組共有3 個重做日誌檔案

查詢當前重做日誌組的使用情況

SQL> select group#, sequence#, bytes, members, archived, status from v$ log;

重做日誌組4 和重做日誌組5 是新建的重做日誌組,二者的狀態都為UNSUED 未使用,重做日誌組4 有2 個日誌成員,每個成員的大小為114 115 760 個位元組,重做日誌組5 有3 個日誌成員,每個成員的大小為114 115 760 個位元組。因為兩個重做日誌組還沒有使用所以Oracle 沒有分配日誌序列號。

8.3.2 刪除聯機重做日誌組

刪除重做日誌組的語法格式為:

ALTER DATABASE [database_ name] DROP LOGFILE {GROUP n|(‘filename’[,’filename’]…)} [{GROUP n|(‘filename’[,’filename’]…)}]…

在上述語法中符號“|”表示“或”的關係,而符號[] 表示可選。

刪除重做日誌組

SQL> alter database drop logfile group 4, group 5;

注意當前的重做日誌組和處於ACTIVE 狀態的重做日誌組都無法刪除,如果要刪除當前在用的日誌組,必須先進行日誌切換。在刪除一個日誌組時可以使用GROUP 引數直接刪除該日誌組,也可以指定刪除該日誌組中的所有重做日誌檔案來達到刪除日誌組的效果

驗證日誌組5 的成員是否刪除

SQL> conn /as sysdba

SQL> select * from v$ logfile;

驗證日誌組5 是否刪除

SQL> select group#, sequence#, bytes, members, archived, status 2 from v$ log;

8.4 重做日誌成員維護

8.4.1 新增重做日誌成員

在每個重做日誌組中至少要有一個日誌成員,但是為了防止單點失效的發生,最好多設定幾個重做日誌成員,並存儲在不同的磁碟空間中。這樣的冗餘設定可以極大地提高重做日誌檔案的可靠性。

向一個重做日誌組中新增日誌成員的語法格式:

ALTER DATABASE [databasename] ADD LOGFILE MEMBER [‘filename’[REUSE] [,’filename’[ REUSE]]……TO {GROUP n |(‘filename’[,’filename’]……)} ]……

如何向重做日誌組中新增重做日誌成員,此時無論是否是當前正在使用的重做日誌組,都可以新增重做日誌成員

向重做日誌1、2、3 新增一個重做日誌成員

SQL> alter database add logfile member 'd:\ temp\ redo01a. log' to group 1, 'd:\ temp\ redo02a. log' to group 2, 'd:\ temp\ redo03a. log' to group 3;

驗證日誌組的成員數結果

SQL> select group#, sequence#, bytes, members, archived, status from v$ log;

在上述輸出中,重做日誌組1、2 和3 的MEMBERS 都為2,說明這些重做日誌組有2 個重做日誌成員。

驗證新增的重做日誌組以及對應成員資訊

SQL> select * from v$ logfile order by group#;

我們使用了order by 子句對輸出進行排序,這樣就方便檢視每一個重做日誌組的成員。在上述輸出中,重做日誌組1、2 和3 都新增了一個重做日誌成員。注意如果新增的日誌成員檔案已經存在,則需要使用REUSE 引數,並且日誌成員要用全目錄格式,不要使用相對目錄的形式,否則,Oracle 資料庫伺服器會在預設路徑下建立該重做日誌檔案。

8.4.2 刪除聯機重做日誌成員

出現重做日誌檔案受損的情況就要及時修復,也就是刪除掉該檔案,然後重建。

刪除重做日誌檔案的語法格式為:

ALTER DATABASE [database_ name] DROP LOGFILE MEMBER ‘filename’[,’filename’]……

刪除重做日誌組中的一個日誌成員

SQL> alter database drop logfile member 'D:\ TEMP\ REDO04A. LOG';

查詢重做日誌組4 的日誌成員資訊

SQL> select * from v$ logfile 3 where group# = 4;

輸出結果說明,已經成功刪除了重做日誌組4 的一個成員D:\ TEMP\ REDO04A. LOG。但是作業系統中和該成員對應的檔案還沒有被刪除,需要手動刪除。在刪除日誌成員時,並不是所有的重做日誌成員都可以刪除,Oracle 有一些限制條件。

執行刪除操作的一些限制如下:

●  如果要刪除的日誌成員是重做日誌組中最後一個有效的成員,則不能刪除,如該日誌組中只有一個日誌成員。

●  如果該日誌組當前正在使用,在日誌切換前不能刪該組中的成員。

●  如果資料庫正執行在ARCHIVELOG 模式,並且要刪除的日誌成員所屬的日誌組沒有被歸檔,該組中的日誌成員不能被刪除。

8.4.3 重設聯機重做日誌的大小

8.5 清除聯機重做日誌

8.6 日誌切換和檢查點事件

當一組重做日誌組寫滿時,或使用者發出alter database switch logfile 時,就會觸發日誌切換,此時Oracle 尋找下一個可用的重做日誌組,如果資料庫處於歸檔模式,則在將當前寫滿的日誌組歸檔完成前不會使用新的重做日誌組。

檢查點事件是Oracle 為了減少資料庫例項恢復時間而設定的一個事件,當該事件發生時,LGWR 程序將重做日誌緩衝區中的資料寫入重做日誌檔案中,而同時通知DBWR 程序將資料庫快取記憶體中的已經提交的資料寫入資料檔案,所以檢查點事件越頻繁則用於資料庫恢復的重做資料就越少。此時,檢驗點事件也會修改資料檔案頭資訊和控制檔案資訊以記錄檢查點的SCN。

可以使用如下指令強制啟動檢查點事件。alter database checkpoint 我們給出一個例子,先更改強制日誌切換,為了加速日誌切換時間,使得當前的重做日誌檔案處於INACTIVE 狀態,再強制產生檢查點事件。

強制日誌切換並強制產生檢查點事件

SQL> conn /as sysdba

SQL> alter system switch logfile;

SQL> alter system checkpoint;

注意檢查點事件不是檢驗點程序觸發的,如果不是強制產生檢驗點事件,則檢驗點事件由DBWR 資料庫寫程序觸發。

8.7 歸檔重做日誌

歸檔重做日誌就是聯機重做日誌的離線備份,在資料庫伺服器處於歸檔模式時,發生日誌切換時,資料庫的歸檔程序ARCH 把重做日誌檔案中的資料移動到歸檔重做日誌中。歸檔程序在資料庫伺服器執行期間並不是總是存在的,而是當滿足一定條件(如一組重做日誌檔案寫滿)時啟動歸檔程序。一旦歸檔完畢,歸檔程序自動關閉。歸檔日誌檔案儲存在引數檔案SPFILE 或init. ora 檔案中引數指定的位置,在inti. ora 檔案中該引數為log_ archive_ dest_ n。Oracle 只能把重做日誌中的資料移動到磁碟上,而不能移動到磁帶等儲存介質上。