一、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 只能把重做日志中的數據移動到磁盤上,而不能移動到磁帶等存儲介質上。