數(shù)據(jù)庫的體系結(jié)構(gòu)是指數(shù)據(jù)庫的組成、工作過程、以及數(shù)據(jù)庫中數(shù)據(jù)的組織與管理機(jī)制,要了解Oracle數(shù)據(jù)庫的體系結(jié)構(gòu),必須理解Oracle系統(tǒng)的主要組件和重要概念。
創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、成都小程序開發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10多年以來,已經(jīng)為近千家三維植被網(wǎng)各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的近千家客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。
Oracle體系結(jié)構(gòu)包含一系列組件,如下圖所示,圖中顯示了Oracle體系結(jié)構(gòu)中的主要組件,包括實(shí)例、用戶進(jìn)程、服務(wù)器進(jìn)程、數(shù)據(jù)文件及其他文件,如參數(shù)文件、口令文件和歸檔日志文件等。從圖中可以看出,實(shí)例和數(shù)據(jù)庫是Oracle數(shù)據(jù)庫體系結(jié)構(gòu)的核心組成部分,也是最重要的兩個概念;DBA一個很重要的工作就是維護(hù)實(shí)例和數(shù)據(jù)庫本身的正常工作。
Oracle實(shí)例是后臺進(jìn)程和內(nèi)存結(jié)構(gòu)的集合,必須啟動實(shí)例才能訪問數(shù)據(jù)庫中的數(shù)據(jù)。Oracle實(shí)例啟動時,將分配一個系統(tǒng)全局區(qū)(SGA)并啟動一系列Oracle后臺進(jìn)程。Oracle實(shí)例有兩種類型:單進(jìn)程實(shí)例和多進(jìn)程實(shí)例,單進(jìn)程Oracle實(shí)例使用一個進(jìn)程執(zhí)行Oracle的全部操作,在單進(jìn)程環(huán)境下的Oracle實(shí)例僅允許一個用戶可存??;多進(jìn)程Oracle實(shí)例(又稱多用戶Oracle)使用多個進(jìn)程來執(zhí)行Oracle的不同部分,對于每個連接的用戶都有一個進(jìn)程。
數(shù)據(jù)庫是數(shù)據(jù)的集合,物理上指存儲數(shù)據(jù)庫信息的一組操作系統(tǒng)文件,每個數(shù)據(jù)庫有一個邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。物理結(jié)構(gòu)是指構(gòu)成數(shù)據(jù)庫的一組操作系統(tǒng)文件,主要由三種類型文件組成:數(shù)據(jù)文件、控制文件和重做日志文件。數(shù)據(jù)庫的邏輯結(jié)構(gòu)是指數(shù)據(jù)庫數(shù)據(jù)的邏輯存儲結(jié)構(gòu)(如表空間、段)和模式對象(如表、視圖等)。
從Oracle 12c版本開始,Oracle引入了可插拔數(shù)據(jù)庫的概念,可插拔是為云計(jì)算而生??刹灏蔚慕Y(jié)構(gòu)由一個容器數(shù)據(jù)庫(CDB)和若干個可組裝數(shù)據(jù)庫(PDB)組成,每個PDB對外可充當(dāng)一個獨(dú)立的數(shù)據(jù)庫工應(yīng)用程序使用,它可以包含自己的數(shù)據(jù)文件,但是所有的PDB共享CDB的控制文件以及日志文件。所謂的可插拔,意味著PDB可以像USB一樣隨時插入CDB中,不用了也可以隨時拔下來。一個CDB中最多可以插入250個PDB,在PDB中,seedPDB為模板PDB,它為新創(chuàng)建的PDB提供模板,其他的PDB可以根據(jù)需要創(chuàng)建、刪除??刹灏喂δ芸梢约铀贁?shù)據(jù)庫的部署,給一個CDB打補(bǔ)丁就可以經(jīng)所有的更新同步到其上的所有PDB中。
在Oracle 12c之前的版本中,實(shí)例和數(shù)據(jù)庫只能是一對一或多對一(RAC,Real Application Clusters,實(shí)時應(yīng)用集群)的關(guān)系,即只能是一個實(shí)例對應(yīng)一個數(shù)據(jù)庫,或者多個實(shí)例對應(yīng)一個數(shù)據(jù)庫。但在Oracle 12c版本中,通過引入CDB和PDB,一個實(shí)例可以對應(yīng)多個可插拔數(shù)據(jù)庫。
可插拔數(shù)據(jù)庫的使用場景:
企業(yè)中有多個應(yīng)用均需要使用Oracle數(shù)據(jù)庫,他們僅使用非常少量的硬件資源,但是又不得不為他們創(chuàng)建多個實(shí)例;
一些不是特別重要的數(shù)據(jù)庫,打包需要DBA花費(fèi)大量的精力去維護(hù);
- 為了更好的利用硬件資源以及減少管理開銷,有必要將大量的部門級應(yīng)用整合到少數(shù)幾個Oracle關(guān)系型數(shù)據(jù)庫中,以便部署和管理;
通過在一個集中化的平臺部署多個數(shù)據(jù)庫,同時又共享一個數(shù)據(jù)庫實(shí)例,可以大大降低成本,即更少的實(shí)例損耗和耕地的存儲技術(shù)。
如果在生產(chǎn)環(huán)境中只需要一個數(shù)據(jù)庫,并不想使用可插拔數(shù)據(jù)庫,可以在安裝過程中取消勾選“創(chuàng)建為容器數(shù)據(jù)庫”復(fù)選框,從而將安裝一個普通數(shù)據(jù)庫。
Oracle服務(wù)器它主要由實(shí)力和數(shù)據(jù)庫文件組成,也就是常說的數(shù)據(jù)庫管理系統(tǒng)(Database Management System,DBMS)。Oracle服務(wù)器的組成如下圖:
Oracle服務(wù)器除了維護(hù)實(shí)例和數(shù)據(jù)庫文件外,還在用戶建立與服務(wù)器的連接時啟動服務(wù)器進(jìn)程并分配PGA.(Program Area,程序全全局區(qū))。
Oracle的存儲結(jié)構(gòu)分為物理結(jié)構(gòu)和邏輯結(jié)構(gòu),這兩種存儲結(jié)構(gòu)既相互獨(dú)立又相互聯(lián)系。如下圖所示:
物理結(jié)構(gòu)主要描述Oracle數(shù)據(jù)庫的外部存儲結(jié)構(gòu),即在操作系統(tǒng)中如何組織、管理數(shù)據(jù)。
物理結(jié)構(gòu)是Oracle數(shù)據(jù)庫創(chuàng)建后使用的操作系統(tǒng)物理文件,Oracle數(shù)據(jù)庫的物理文件分為以下兩類:
①數(shù)據(jù)文件:數(shù)據(jù)文件(Data File)的擴(kuò)展名通常是.dbf,是物理存儲Oracle數(shù)據(jù)庫數(shù)據(jù)的文件。
數(shù)據(jù)文件的特點(diǎn):
每個數(shù)據(jù)文件只與一個數(shù)據(jù)庫相聯(lián)系;
一個表空間可包含一個或多個數(shù)據(jù)文件;
- 一個數(shù)據(jù)文件只能屬于一個表空間;
②重做日志文件:重做日志文件(Redo Log File)的擴(kuò)展名是.log,它記錄了對數(shù)據(jù)的所有更改信息,并提供了一種數(shù)據(jù)恢復(fù)機(jī)制,確保在系統(tǒng)崩潰或其他意外出現(xiàn)后重新恢復(fù)數(shù)據(jù)庫。
在Oracle數(shù)據(jù)庫中,重做日志文件是成組使用的,每個重做日志文件組可以有一個或多個重做日志文件。在工作過程中,多個重做日志文件組之間循環(huán)使用,當(dāng)一個重做日志文件組寫滿后,會轉(zhuǎn)向下一個日志文件組。重做日志文件用于記錄數(shù)據(jù)庫變化,是用戶的事務(wù)處理日志。
③控制文件:控制文件(Control File)的擴(kuò)展名是.ctl,是一個二進(jìn)制文件??刂莆募写鎯Φ男畔⒑芏啵渲邪〝?shù)據(jù)文件和重做日志文件的名稱和位置??刂莆募菙?shù)據(jù)庫啟動及運(yùn)行所必須的文件。當(dāng)Oracle讀寫數(shù)據(jù)時,要根據(jù)控制文件 的信息查找數(shù)據(jù)文件。
由于控制文件的重要性,一個數(shù)據(jù)庫至少要有兩份控制文件。Oracle 12c默認(rèn)包含兩個控制文件,各個控制文件內(nèi)容相同,從而可以避免因?yàn)橐粋€控制文件的損壞而導(dǎo)致無法啟動數(shù)據(jù)庫的情況出現(xiàn)。
控制文件中記錄了以下關(guān)鍵信息:
數(shù)據(jù)文件的位置及大??;
重做日志文件的位置及大??;
數(shù)據(jù)庫名稱及創(chuàng)建時間;
- 日志序列號;
其他文件有參數(shù)文件、歸檔日志文件、口令文件等。
數(shù)據(jù)庫的邏輯結(jié)構(gòu)是從邏輯的角度分析數(shù)據(jù)庫的組成的。Oracle數(shù)據(jù)庫的邏輯結(jié)構(gòu)包括表空間、段、區(qū)、塊和模式等。如圖:
每個Oracle數(shù)據(jù)庫都是由若干個表空間構(gòu)成的,用戶在數(shù)據(jù)庫中建立的所有內(nèi)容都被存儲到表空間中。一個表空間可以由多個數(shù)據(jù)文件,但一個數(shù)據(jù)文件只能屬于一個表空間。與數(shù)據(jù)文件這種物理結(jié)構(gòu)不同,表空間屬于數(shù)據(jù)庫的邏輯結(jié)構(gòu)。
在每個數(shù)據(jù)庫中,都有一個名為“SYSTEM”的表空間,即系統(tǒng)表空間,還會有SYSAUX、UNDO、USERS等表空間,這些都是在創(chuàng)建數(shù)據(jù)庫時自動創(chuàng)建的。管理員可以創(chuàng)建自定義的表空間并分配給指定用戶,也可以為表空間增加和刪除數(shù)據(jù)文件。
表空間基本有以下三類:
①永久性表空間:一般保持基表、試圖、過程和索引等的數(shù)據(jù)。SYSTEM、SYSAUX、USERS表空間是默認(rèn)安裝的;
②臨時性表空間:只用于保存系統(tǒng)中短期活動的數(shù)據(jù),如排序數(shù)據(jù)等;
- ③撤銷表空間:用來幫助回退未提交的事務(wù)數(shù)據(jù),已提交的數(shù)據(jù)在這里是不可以恢復(fù)的;
一般不需要創(chuàng)建臨時性表空間和撤銷表空間,除非要把他們轉(zhuǎn)移到其他磁盤中以提高性能。
表空間的目的如下:
①對不同用戶分配不同的表空間,對不同的模式對象分配不同的表空間,方便對用戶操作和對模式對象的管理;
- ②可以將不同數(shù)據(jù)文件創(chuàng)建不同的磁盤中,有利于管理磁盤空間、提高I/O性能、備份和恢復(fù)數(shù)據(jù)等;
一般在完成Oracle系統(tǒng)的安裝并創(chuàng)建Oracle實(shí)例后,Oracle系統(tǒng)自動建立SYSTEM、SYSAUX、USRS等多個表空間。
下面詳細(xì)介紹一下SYSTEM表空間、SYSAUX表空間、TEMP表空間和TEMP表空間:
SYSTEM表空間:用于存放Oracle系統(tǒng)內(nèi)部表和數(shù)據(jù)字典的數(shù)據(jù),如表名、列名、用戶名等。不建議將用戶創(chuàng)建的表,索引等對象存放到SYSTEM表空間中。
SYSAUX表空間:作為SYSTEM的輔助表空間,用于存放各種數(shù)據(jù)庫工具用戶的數(shù)據(jù);還用于存放各種模式的對象數(shù)據(jù),如智能代理用戶DBSNMP等,這些模式在數(shù)據(jù)庫安裝完成后就建立了相應(yīng)的對象并都存放在SYSAUX表空間中。
USERS表空間:通常作為用戶使用的表空間,可以在這個表空間上創(chuàng)建各種對象,如表、索引等。
除了Oracle系統(tǒng)默認(rèn)創(chuàng)建的表空間外,用戶可根據(jù)應(yīng)用系統(tǒng)的模式及其所要存儲的對象類型創(chuàng)建多個表空間,以區(qū)分用戶數(shù)據(jù)和系統(tǒng)數(shù)據(jù)。
創(chuàng)建表空間數(shù)據(jù)數(shù)據(jù)定義語言,語法如下:
SQL> create tablespace benet datafile'/u01/app/oracle/oradata/benet.DBF' size 10M
autoextend on;
在語法中:
tablespacename是表空間名稱。
DATAFILE指定組成表空間的一個或多個數(shù)據(jù)文件,當(dāng)有多個數(shù)據(jù)文件時使用逗號進(jìn)行分隔。
filename是表空間中數(shù)據(jù)文件的路徑和名稱。
SIZE指定文件的大小,用K指定千字節(jié)大小,用M指定兆字節(jié)大小。
- AUTOEXTEND子句用來啟動或禁用數(shù)據(jù)文件的自動擴(kuò)展。若設(shè)置AUTOEXTEND參數(shù)為ON,則空間用盡會自動擴(kuò)展;當(dāng)設(shè)置AUTOEXTEND參數(shù)為OFF時很容易出現(xiàn)表空間剩余容量為0,造成數(shù)據(jù)不能存儲到數(shù)據(jù)庫中的情況出現(xiàn)。
創(chuàng)建完表空間之后,可以對表空間進(jìn)行相應(yīng)的管理,主要包括以下幾種操作。
調(diào)整表空間大小,當(dāng)遇到數(shù)據(jù)插入失敗,表空間已滿的情況,可以通過ALTER語句來調(diào)整表空間的大小,此時有兩種調(diào)整表空間大小的方式。
方法一:更改數(shù)據(jù)文件的大小,并指明數(shù)據(jù)文件的存放路徑,其中還使用了RESIZE關(guān)鍵字,用于指定調(diào)整后的數(shù)據(jù)文件的大小,代碼如下:
SQL> alter database datafile'/u01/app/oracle/oradata/benet.DBF' resize 50M;
Database altered.
方法二:向表空間內(nèi)添加數(shù)據(jù)文件。為表空間添加一個新的數(shù)據(jù)文件的代碼如下:
SQL> alter tablespace benet add datafile '/u01/app/oracle/oradata/benet01.DBF' size 20M autoextend no;
Tablespace altered.
改變表空間的讀寫狀態(tài)。當(dāng)數(shù)據(jù)是歷史數(shù)據(jù),只允許查詢,不希望被修改使,可以將表空間設(shè)置為只讀狀態(tài)。READ ONLY表示該表空間為只讀狀態(tài),READ WRITE表示該表空間為可讀寫狀態(tài)。具體語法格式如下:
SQL> alter tablespace benet read only;
Tablespace altered.
SQL> alter tablespace benet read write;
Tablespace altered.
刪除表空間。可以通過DROP語句來刪除表空間,只需要再加上表空間的名稱即可。具體語法格式如下:
SQL> drop tablespace benet including contents;
Tablespace dropped.
段(Segment)存在于表空間中,是一種指定類型的邏輯存儲結(jié)構(gòu),段由一組區(qū)組成。段可分成四類:數(shù)據(jù)段、索引段、回退段、臨時段。例如,對于每個非聚集表有一個數(shù)據(jù)段,表的所有數(shù)據(jù)存儲再該段;而對于每個索引都有一個索引段。
區(qū)(Extent)是磁盤空間分配的最小單位。磁盤按區(qū)劃分,每次至少分配一個區(qū)。區(qū)由連續(xù)的數(shù)據(jù)塊組成。段主要由一個或者多個區(qū)構(gòu)成,當(dāng)段創(chuàng)建后,它至少包含一個區(qū)。當(dāng)段中的所有空間都完全使用時,系統(tǒng)將自動為該段分配一個新區(qū)。區(qū)不能跨數(shù)據(jù)文件存在,只能存在于一個數(shù)據(jù)文件中。
數(shù)據(jù)塊(Data Block)是數(shù)據(jù)庫中最小的數(shù)據(jù)組織單位于管理單位。Oracle數(shù)據(jù)庫中的數(shù)據(jù)存儲于數(shù)據(jù)塊中。數(shù)據(jù)塊是Oracle服務(wù)器所能讀取或?qū)懭氲淖钚〈鎯卧racle服務(wù)器以數(shù)據(jù)塊為單位管理數(shù)據(jù)文件的存儲空間。數(shù)據(jù)塊的取值范圍為2~64KB,其默認(rèn)大小與Oracle版本有關(guān)。
模式(Schema)是數(shù)據(jù)庫對象(又稱模式對象)的集合。模式對象包括表、視圖、索引、同義詞、序列、過程和程序包等。每創(chuàng)建一個用戶,Oracle會自動創(chuàng)建一個與用戶名相同的模式,因此,模式又稱用戶模式。用戶登錄后,默認(rèn)訪問的是與自己的名稱相同的模式中的數(shù)據(jù)庫對象。
內(nèi)存結(jié)構(gòu)是Oracle數(shù)據(jù)庫體系中最為重要的一部分,內(nèi)存也是影響數(shù)據(jù)庫性能的第一要素。
Oacle內(nèi)存存儲的主要內(nèi)容:
程序代碼;
已經(jīng)連接的會話的相關(guān)信息,包括當(dāng)前所有活動會話和非活動會話;
程序運(yùn)行時必需的相關(guān)信息,如查詢計(jì)劃;
- Oracle進(jìn)程之間通信和共享的信息,如鎖;
按照內(nèi)存使用方式不同,Oracle數(shù)據(jù)庫的內(nèi)存也可以分為SGA、PGA、和UGA(User Global Area,用戶全局區(qū))。
SGA:所有用戶都可以訪問的實(shí)例的共享內(nèi)存區(qū)域。數(shù)據(jù)塊、事務(wù)處理日志、數(shù)據(jù)字典信息等都存儲在SGA中。
UGA:為用戶進(jìn)程存儲會話狀態(tài)的內(nèi)存區(qū)域。根據(jù)用戶數(shù)據(jù)庫時配置為專用服務(wù)器模式,還是配置為共享服務(wù)器模式,UGA可以作為SGA或PGA的一部分。它為用戶會話存儲數(shù)據(jù)。接下來重點(diǎn)介紹一下SGA和PGA:
Oracle實(shí)例的SGA同來存儲數(shù)據(jù)庫信息,并由多個數(shù)據(jù)庫進(jìn)程共享。當(dāng)數(shù)據(jù)庫實(shí)例啟動時,SGA的內(nèi)存被自動分配。SAG是數(shù)據(jù)庫中占用服務(wù)器內(nèi)存最大的一個區(qū)域,也是影響數(shù)據(jù)庫性能的一個重要指標(biāo)。SGA按其作用不同,可分為共享池、數(shù)據(jù)緩沖區(qū)、重做日志緩沖區(qū)、大池和Java池等。
共享池是對SQL、PL/SQL程序進(jìn)行語法分析、編譯、執(zhí)行時用到的內(nèi)存區(qū)域。共享池由庫緩存和數(shù)據(jù)字典緩存組成。
庫緩存含有最近執(zhí)行的SQL、PL/SQL語句的分析碼和執(zhí)行計(jì)劃。
數(shù)據(jù)緩沖區(qū)用于存儲從磁盤數(shù)據(jù)文件中讀入的數(shù)據(jù),供所有用戶共享。修改數(shù)據(jù)時,首先要從數(shù)據(jù)文件中取出數(shù)據(jù),存儲于數(shù)據(jù)緩沖區(qū)中。修改的數(shù)據(jù),插入的數(shù)據(jù)都被存儲于數(shù)據(jù)緩沖區(qū)中,修改完成和其他條件滿足時,數(shù)據(jù)才被寫入數(shù)據(jù)文件中。
Oracle服務(wù)器進(jìn)程在處理一個查詢時,首先查找內(nèi)存中是否存在所需的數(shù)據(jù)塊。如果在數(shù)據(jù)緩沖區(qū)中沒有找到需要的塊,服務(wù)器進(jìn)程就從數(shù)據(jù)文件中讀取此塊,并保存在緩沖區(qū)中。當(dāng)后續(xù)的請求需要讀取這些塊時,便可以在內(nèi)存中找到,因此這些請求不需要從磁盤中讀取,從而提高了讀取速度。數(shù)據(jù)緩沖區(qū)的大小對數(shù)據(jù)庫的讀取速度有直接的影響。
當(dāng)用戶執(zhí)行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操作時,數(shù)據(jù)發(fā)生了變化,這些變化了的數(shù)據(jù)在寫入數(shù)據(jù)緩存之前先要寫入重做日志緩沖區(qū),同時變化之前的數(shù)據(jù)也放入重做日志緩存,這樣在數(shù)據(jù)恢復(fù)時Oracle就知道哪些資源需要提交,哪些資源需要撤回。相對于數(shù)據(jù)緩沖區(qū),日志緩沖區(qū)對數(shù)據(jù)庫的性能影響較小。
在SGA中,大池是一個可選的緩沖區(qū),管理員可以根據(jù)需要對其今進(jìn)行配置。在大規(guī)模輸入、輸出及備份過程中也需要大池作為緩沖空間,如大數(shù)據(jù)操作、數(shù)據(jù)庫備份與恢復(fù)之類的操作。
在SGA中,Java池也是一個可選的緩沖區(qū),但是在安裝Java或者使用Java程序時必須設(shè)置Java池,用于編譯Java語言編寫的指令。
PGA不是實(shí)例的一部分,它包含單個服務(wù)器進(jìn)程或單個后臺進(jìn)程所需的數(shù)據(jù)和控制信息。PGA是在用戶進(jìn)程連接到數(shù)據(jù)庫并創(chuàng)建一個會話時自動分配的,該分區(qū)保留了每個與Oracle數(shù)據(jù)庫連接的用戶進(jìn)程所需的內(nèi)存。在一個用戶結(jié)束會話后,PGA將被釋放。
Oracle中有幾種不同類型的進(jìn)程:用戶進(jìn)程、服務(wù)器進(jìn)程和后臺進(jìn)程。
用戶進(jìn)程:在數(shù)據(jù)庫用戶請求連接Oracle服務(wù)器時啟動;
服務(wù)器進(jìn)程:在用戶建立會話并連接Oracle實(shí)例時啟動;
- 后臺進(jìn)程:在Oracle實(shí)例啟動時啟動;
用戶進(jìn)程是一個需要與Oracle服務(wù)器進(jìn)程交互的程序。當(dāng)數(shù)據(jù)庫用戶運(yùn)行一個應(yīng)用程序準(zhǔn)備向數(shù)據(jù)庫服務(wù)器發(fā)送請求時,即創(chuàng)建了用戶進(jìn)程。例如:用戶啟動數(shù)據(jù)庫工具Sqlplus時,系統(tǒng)將自動建立一個用戶進(jìn)程。
在Oracle數(shù)據(jù)庫中,為了使系統(tǒng)性能更好地協(xié)調(diào)多個用戶,實(shí)例系統(tǒng)中使用的一些附加進(jìn)程,稱為后臺進(jìn)程。這些后臺進(jìn)程存在于操作系統(tǒng)中,在實(shí)例啟動時自動啟動。其中有五個進(jìn)程是必須要啟動的,否則數(shù)據(jù)庫實(shí)例無法啟動。這五個重要且必需的后臺進(jìn)程為進(jìn)程監(jiān)控(Process Monitor,PMON)進(jìn)程、系統(tǒng)監(jiān)控(System Monitor,SMON)進(jìn)程、數(shù)據(jù)寫入(Database Writer,DBWR)進(jìn)程、日志寫入(Log Writer,LGWR)進(jìn)程、檢查點(diǎn)(Check Point,CKPT)進(jìn)程。
PMON進(jìn)程在用戶連接意外中斷后執(zhí)行資源清理工作,包括以下任務(wù):
釋放所有當(dāng)前掛起的鎖;
回滾用戶當(dāng)前事務(wù)處理;
釋放用戶當(dāng)前使用的資源;
- 監(jiān)控服務(wù)器進(jìn)程和其他后臺進(jìn)程,出現(xiàn)故障時重啟它們;
SMON進(jìn)程執(zhí)行以下任務(wù):
- 在實(shí)例啟動時執(zhí)行實(shí)例恢復(fù)。實(shí)例恢復(fù)包括三個步驟:
①前滾以恢復(fù)未寫入的數(shù)據(jù)文件但已記入聯(lián)機(jī)日志文件的數(shù)據(jù);
②打開數(shù)據(jù)庫,以便用戶能登錄并訪問數(shù)據(jù);
③回滾為提交的事務(wù)處理;
整理數(shù)據(jù)文件的自由空間;
- 釋放不再使用的臨時段;
DBWR進(jìn)程執(zhí)行以下任務(wù):
管理數(shù)據(jù)緩沖區(qū),以便能找到空閑的緩沖區(qū)讀入數(shù)據(jù)文件的數(shù)據(jù);
將所有修改后的緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件;
使用LRU算法經(jīng)最近使用過的塊保留在內(nèi)存中;
- 通過延遲寫入優(yōu)化磁盤I/O讀寫;
LGWR進(jìn)程負(fù)責(zé)將重做日志緩沖區(qū)中的日志數(shù)據(jù)寫入日志文件組。數(shù)據(jù)庫在運(yùn)行時,如果對數(shù)據(jù)進(jìn)行修改,則產(chǎn)生日志信息,日志信息首先產(chǎn)生于重做日志緩沖區(qū)中。此緩沖器按照“先進(jìn)先出”的原則進(jìn)行操作,當(dāng)日志信息滿足一定條件是,由LGWR進(jìn)程將日志數(shù)據(jù)寫入日志文件。系統(tǒng)通常有多個日志文件,日志寫入進(jìn)程以循環(huán)的方式將數(shù)據(jù)寫入文件。
CKPT進(jìn)程是確保數(shù)據(jù)緩沖區(qū)中所有修改過的數(shù)據(jù)塊都寫入數(shù)據(jù)文件的機(jī)制。當(dāng)檢查點(diǎn)完成后,CKPT進(jìn)程負(fù)責(zé)更新數(shù)據(jù)文件頭和控制文件、保存檢查點(diǎn)信息,以保證數(shù)據(jù)庫日志文件和數(shù)據(jù)文件同步。在數(shù)據(jù)庫恢復(fù)時只需要找到CKPT保存的最后一次檢查點(diǎn),就可以根據(jù)它確定日志文件中恢復(fù)數(shù)據(jù)的開始位置,然后重新執(zhí)行其之后的日志記錄即可。
ARCn進(jìn)程即歸檔日志進(jìn)程,是一個可選進(jìn)程,只有在打開日志歸檔時才有該進(jìn)程。該進(jìn)程的主要作用是發(fā)生日志切換時將寫滿的聯(lián)機(jī)日志文件復(fù)制到歸檔目錄。
和之前版本的Oracle不同,Oracle 12c可以作為單個數(shù)據(jù)庫使用(通過再安裝時取消勾選“創(chuàng)建為容器數(shù)據(jù)庫”復(fù)選框),也可根據(jù)企業(yè)需要,提供若干個可插拔PDB數(shù)據(jù)庫。每個PDB可以由不同的DBA維護(hù)。下面介紹CDB和PDB的基本維護(hù)。
[oracle@oracle ~]$ source .bash_profile
[oracle@oracle ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 7 14:58:04 2020
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> startup;
ORACLE instance started.
Total System Global Area 1660944384 bytes
Fixed Size 8793448 bytes
Variable Size 1056965272 bytes
Database Buffers 587202560 bytes
Redo Buffers 7983104 bytes
Database mounted.
Database opened.
SQL>
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED
SQL>
SQL> alter pluggable database orclpdb open;
Pluggable database altered.
SQL>
SQL> alter session set container=orclpdb;
Session altered.
SQL>
SQL> show con_name;
CON_NAME
------------------------------
ORCLPDB
SQL>
從CDB切換到PDB以及相關(guān)的操作如下:
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=orclpdb;
Session altered.
SQL>
SQL> show con_name;
CON_NAME
------------------------------
ORCLPDB
SQL>
SQL> shutdown immediate;
Pluggable Database closed.
SQL>
SQL> startup;
Pluggable Database opened.
SQL>
SQL> alter session set container=cdb$root;
Session altered.
SQL>
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL>
通過上面的操作可以發(fā)現(xiàn),可以在CDB中管理PDB,如CDB中通過命令“alter pluggable database orclpdb open”可以將PDB數(shù)據(jù)設(shè)置為打開狀態(tài)。當(dāng)然也可以在PDB中維護(hù),如執(zhí)行“shutdown immediate”命令和“startup”命令分別關(guān)閉和打開PDB數(shù)據(jù)庫。在CDB和PDB中切換也是非常方便的,只需執(zhí)行“alter session set container=xxx”命令即可。
連接到可插拔數(shù)據(jù)PDB有兩種方法,一種是執(zhí)行命令“sqlplus / as sysdba”進(jìn)入CDB,然后通過“alter session set container=xxx”命令切換到PDB;另一種方法是執(zhí)行“sqlplus sys/oracle@orclpdb sa sysdba”命令直接進(jìn)入PDB數(shù)據(jù)庫,其中orclpdb是pdb容器的名稱,而且還要在/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora文件中增加以下內(nèi)容:
[oracle@oracle ~]$ vim /u01/app/oracle/product/12.2.0/dbhome_1/
network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
ORCL =
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
----------------------------------------------------
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb)
)
)
在創(chuàng)建一個新數(shù)據(jù)庫時,Oracle將創(chuàng)建一些默認(rèn)數(shù)據(jù)庫用戶,比如:SYS、SYSTEM等用戶。SYS和SYSTEM用戶都是Oracle的管理用戶。如果在安裝過程中選擇安裝示例數(shù)據(jù)庫,則會自動創(chuàng)建HR用戶,HR用戶是Oracle數(shù)據(jù)庫的一個示范用戶,也可以根據(jù)需求導(dǎo)入其他示例數(shù)據(jù)庫。示例數(shù)據(jù)庫里面包含一些測試展示用的示例表。下面簡單介紹一下SYS、SYSTEM和自定義用戶。
SYS用戶是Oracle中的一個超級用戶,主要用來維護(hù)系統(tǒng)信息和管理實(shí)例。數(shù)據(jù)庫中所有數(shù)據(jù)字典和視圖都存儲在SYS模式中。數(shù)據(jù)字典存儲了用來管理數(shù)據(jù)庫對象的所有信息,是Oracle數(shù)據(jù)庫中非常重要的系統(tǒng)信息。SYS用戶只能以SYSOPER或SYSDBA角色登錄數(shù)據(jù)庫系統(tǒng)。
SYSTEM用戶是Oracle中默認(rèn)的數(shù)據(jù)庫管理員,它擁有DBA權(quán)限。該用戶模式中存儲了Oracle管理工具使用的內(nèi)部表和視圖。通常通過SYSTEM用戶管理Oracle數(shù)據(jù)庫的用戶、權(quán)限和存儲等,不建議在SYSTEM模式中創(chuàng)建用戶表。SYSTEM用戶不能以SYSOPER或SYSDBA角色登錄系統(tǒng),只能使用以默認(rèn)方式(數(shù)據(jù)庫身份驗(yàn)證的方式)登錄。
Oracle 12c支持創(chuàng)建自定義用戶,由于PDB的引入,自定義用戶范疇和之前版本有所不同。在CDB模式下,用戶分為兩種:公用用戶和本地用戶。公用用戶可以在CDB和PDB中使用,而本地用戶只能在PDB中使用。在CDB環(huán)境中,不允許創(chuàng)建本地用戶。Oracle規(guī)定,在CDB中創(chuàng)建公用用戶時,用戶名必須以c##開頭。
通常情況下,出于安全考慮,對于不同用戶的數(shù)據(jù)表需要不同的訪問權(quán)限,因此,就需要創(chuàng)建不同的用戶。Oracle中的CREATE USER命令用于創(chuàng)建新用戶。每個用戶都有一個默認(rèn)空間和一個臨時表空間。如果沒有指定,Oracle就將USERS設(shè)為默認(rèn)表空間,將TEMP設(shè)為臨時表空間。創(chuàng)建用戶的語法如下:
SQL> create user c##tom identified by 123 default tablespace users temporary tablespace temp quota unlimited on users password expire;
User created.
SQL> alter user c##tom identified by 123456;
User altered.
SQL> drop user c##tom cascade;
User dropped.
權(quán)限是執(zhí)行某種類型的SQL語句揮著存取其他用戶數(shù)據(jù)庫對象的權(quán)力。在Oracle中,權(quán)限分為系統(tǒng)權(quán)限和對象權(quán)限兩類。
系統(tǒng)權(quán)限是指在數(shù)據(jù)庫中執(zhí)行某種系統(tǒng)級別的操作,或者針對某一類的對象執(zhí)行某種操作的權(quán)限。例如,在數(shù)據(jù)庫中創(chuàng)建表空間的權(quán)力,或者在數(shù)據(jù)庫中創(chuàng)建表的權(quán)力,都屬于系統(tǒng)權(quán)限。系統(tǒng)權(quán)限示例如下圖:
常見的系統(tǒng)權(quán)限如下:
CREATE SESSION:連接到數(shù)據(jù)庫;
CREATE TABLE:創(chuàng)建表;
CREATE VIEW:創(chuàng)建視圖;
- CREATE SEQUENCE:創(chuàng)建序列;
一個新用戶創(chuàng)建后,首選要授予其CREATE SESSION權(quán)限,使其可以登錄到數(shù)據(jù)庫。
對象權(quán)限是指針對某個特定的模式對象執(zhí)行操作的權(quán)力。只能針對模式對象來設(shè)置和管理對象權(quán)限,包括數(shù)據(jù)庫中的表、視圖、序列、存儲過程等。如下圖所示:
Oracle數(shù)據(jù)庫用戶有兩種獲取權(quán)限的途徑:①直接向用戶授予權(quán)限;②將權(quán)限授予角色,再將角色授予一個或多個用戶。使用角色能夠更加方便和高效地對權(quán)限進(jìn)行管理。所以數(shù)據(jù)庫管理員通過使用角色向用戶授予權(quán)限,而不是直接向用戶授予權(quán)限。在Oracle數(shù)據(jù)庫系統(tǒng)中預(yù)定義了很多角色,其中最常用的主要有CONNECT角色、RESOURCE角色、DBA角色等。
Oracle中常用的系統(tǒng)預(yù)定義角色如下:
CONNECT:擁有連接數(shù)據(jù)庫的權(quán)限;
RESOURCE:擁有創(chuàng)建表、觸發(fā)器、過程等權(quán)限;
- DBA:數(shù)據(jù)庫管理員角色,擁有管理數(shù)據(jù)庫的最高權(quán)限;一個具有DBA角色的用戶可以授權(quán)任何其他用戶甚至其他DBA權(quán)限,這是很危險的,因此不要輕易授予該角色;
新創(chuàng)建的用戶必須授予一定的權(quán)限才能進(jìn)行相關(guān)數(shù)據(jù)庫的操作。授權(quán)通過CRANT語句,取消授權(quán)則通過REVOKE語句。
SQL> alter session set container=orclpdb;
Session altered.
SQL> create user bob identified by 123456;
User created.
SQL> grant connect,resource to bob;
Grant succeeded.
SQL> revoke connect,resource from bob;
Revoke succeeded.
數(shù)據(jù)庫用戶安全設(shè)計(jì)原則如下:
數(shù)據(jù)庫用戶去哪先按照最小分配原則;
數(shù)據(jù)庫用戶可分為管理、應(yīng)用、維護(hù)、備份四類用戶;
不允許使用sys和system用戶建立數(shù)據(jù)庫應(yīng)用對象;
禁止對普通用戶授予dba權(quán)限;
對查詢用戶只能開放查詢權(quán)限;
- 對新建用戶初次登錄數(shù)據(jù)庫時強(qiáng)制修改密碼;
一般程序開發(fā)人員只要授予 CONNECT和RESOURCE兩個角色即可。特別注意,授予這兩個角色就包含了授予用戶無限制使用默認(rèn)表空間的權(quán)限。
———————— 本文至此結(jié)束,感謝閱讀 ————————