數據庫的體系結構是指數據庫的組成、工做過程、以及數據庫中數據的組織與管理機制,要了解Oracle數據庫的體系結構,必須理解Oracle系統的主要組件和重要概念。算法
Oracle體系結構包含一系列組件,以下圖所示,圖中顯示了Oracle體系結構中的主要組件,包括實例、用戶進程、服務器進程、數據文件及其餘文件,如參數文件、口令文件和歸檔日誌文件等。從圖中能夠看出,實例和數據庫是Oracle數據庫體系結構的核心組成部分,也是最重要的兩個概念;DBA一個很重要的工做就是維護實例和數據庫自己的正常工做。sql
Oracle實例是後臺進程和內存結構的集合,必須啓動實例才能訪問數據庫中的數據。Oracle實例啓動時,將分配一個系統全局區(SGA)並啓動一系列Oracle後臺進程。Oracle實例有兩種類型:單進程實例和多進程實例,單進程Oracle實例使用一個進程執行Oracle的所有操做,在單進程環境下的Oracle實例僅容許一個用戶可存取;多進程Oracle實例(又稱多用戶Oracle)使用多個進程來執行Oracle的不一樣部分,對於每一個鏈接的用戶都有一個進程。數據庫
數據庫是數據的集合,物理上指存儲數據庫信息的一組操做系統文件,每一個數據庫有一個邏輯結構和物理結構。物理結構是指構成數據庫的一組操做系統文件,主要由三種類型文件組成:數據文件、控制文件和重作日誌文件。數據庫的邏輯結構是指數據庫數據的邏輯存儲結構(如表空間、段)和模式對象(如表、視圖等)。vim
從Oracle 12c版本開始,Oracle引入了可插拔數據庫的概念,可插拔是爲雲計算而生。可插拔的結構由一個容器數據庫(CDB)和若干個可組裝數據庫(PDB)組成,每一個PDB對外可充當一個獨立的數據庫工應用程序使用,它能夠包含本身的數據文件,可是全部的PDB共享CDB的控制文件以及日誌文件。所謂的可插拔,意味着PDB能夠像USB同樣隨時插入CDB中,不用了也能夠隨時拔下來。一個CDB中最多能夠插入250個PDB,在PDB中,seedPDB爲模板PDB,它爲新建立的PDB提供模板,其餘的PDB能夠根據須要建立、刪除。可插拔功能能夠加速數據庫的部署,給一個CDB打補丁就能夠經全部的更新同步到其上的全部PDB中。c#
在Oracle 12c以前的版本中,實例和數據庫只能是一對一或多對一(RAC,Real Application Clusters,實時應用集羣)的關係,即只能是一個實例對應一個數據庫,或者多個實例對應一個數據庫。但在Oracle 12c版本中,經過引入CDB和PDB,一個實例能夠對應多個可插拔數據庫。緩存
可插拔數據庫的使用場景:安全
企業中有多個應用均須要使用Oracle數據庫,他們僅使用很是少許的硬件資源,可是又不得不爲他們建立多個實例;bash
一些不是特別重要的數據庫,打包須要DBA花費大量的精力去維護;服務器
- 爲了更好的利用硬件資源以及減小管理開銷,有必要將大量的部門級應用整合到少數幾個Oracle關係型數據庫中,以便部署和管理;
經過在一個集中化的平臺部署多個數據庫,同時又共享一個數據庫實例,能夠大大下降成本,即更少的實例損耗和耕地的存儲技術。session
若是在生產環境中只須要一個數據庫,並不想使用可插拔數據庫,能夠在安裝過程當中取消勾選「建立爲容器數據庫」複選框,從而將安裝一個普通數據庫。
Oracle服務器它主要由實力和數據庫文件組成,也就是常說的數據庫管理系統(Database Management System,DBMS)。Oracle服務器的組成以下圖:
Oracle服務器除了維護實例和數據庫文件外,還在用戶創建與服務器的鏈接時啓動服務器進程並分配PGA.(Program Area,程序全全局區)。
Oracle的存儲結構分爲物理結構和邏輯結構,這兩種存儲結構既相互獨立又相互聯繫。以下圖所示:
物理結構主要描述Oracle數據庫的外部存儲結構,即在操做系統中如何組織、管理數據。
物理結構是Oracle數據庫建立後使用的操做系統物理文件,Oracle數據庫的物理文件分爲如下兩類:
①數據文件:數據文件(Data File)的擴展名一般是.dbf,是物理存儲Oracle數據庫數據的文件。
數據文件的特色:
每一個數據文件只與一個數據庫相聯繫;
一個表空間可包含一個或多個數據文件;
- 一個數據文件只能屬於一個表空間;
②重作日誌文件:重作日誌文件(Redo Log File)的擴展名是.log,它記錄了對數據的全部更改信息,並提供了一種數據恢復機制,確保在系統崩潰或其餘意外出現後從新恢復數據庫。
在Oracle數據庫中,重作日誌文件是成組使用的,每一個重作日誌文件組能夠有一個或多個重作日誌文件。在工做過程當中,多個重作日誌文件組之間循環使用,當一個重作日誌文件組寫滿後,會轉向下一個日誌文件組。重作日誌文件用於記錄數據庫變化,是用戶的事務處理日誌。
③控制文件:控制文件(Control File)的擴展名是.ctl,是一個二進制文件。控制文件中存儲的信息不少,其中包括數據文件和重作日誌文件的名稱和位置。控制文件是數據庫啓動及運行所必須的文件。當Oracle讀寫數據時,要根據控制文件 的信息查找數據文件。
因爲控制文件的重要性,一個數據庫至少要有兩份控制文件。Oracle 12c默認包含兩個控制文件,各個控制文件內容相同,從而能夠避免由於一個控制文件的損壞而致使沒法啓動數據庫的狀況出現。
控制文件中記錄瞭如下關鍵信息:
數據文件的位置及大小;
重作日誌文件的位置及大小;
數據庫名稱及建立時間;
- 日誌序列號;
其餘文件有參數文件、歸檔日誌文件、口令文件等。
數據庫的邏輯結構是從邏輯的角度分析數據庫的組成的。Oracle數據庫的邏輯結構包括表空間、段、區、塊和模式等。如圖:
每一個Oracle數據庫都是由若干個表空間構成的,用戶在數據庫中創建的全部內容都被存儲到表空間中。一個表空間能夠由多個數據文件,但一個數據文件只能屬於一個表空間。與數據文件這種物理結構不一樣,表空間屬於數據庫的邏輯結構。
在每一個數據庫中,都有一個名爲「SYSTEM」的表空間,即系統表空間,還會有SYSAUX、UNDO、USERS等表空間,這些都是在建立數據庫時自動建立的。管理員能夠建立自定義的表空間並分配給指定用戶,也能夠爲表空間增長和刪除數據文件。
表空間基本有如下三類:
①永久性表空間:通常保持基表、試圖、過程和索引等的數據。SYSTEM、SYSAUX、USERS表空間是默認安裝的;
②臨時性表空間:只用於保存系統中短時間活動的數據,如排序數據等;
- ③撤銷表空間:用來幫助回退未提交的事務數據,已提交的數據在這裏是不能夠恢復的;
通常不須要建立臨時性表空間和撤銷表空間,除非要把他們轉移到其餘磁盤中以提升性能。
表空間的目的以下:
①對不一樣用戶分配不一樣的表空間,對不一樣的模式對象分配不一樣的表空間,方便對用戶操做和對模式對象的管理;
- ②能夠將不一樣數據文件建立不一樣的磁盤中,有利於管理磁盤空間、提升I/O性能、備份和恢復數據等;
通常在完成Oracle系統的安裝並建立Oracle實例後,Oracle系統自動創建SYSTEM、SYSAUX、USRS等多個表空間。
下面詳細介紹一下SYSTEM表空間、SYSAUX表空間、TEMP表空間和TEMP表空間:
SYSTEM表空間:用於存放Oracle系統內部表和數據字典的數據,如表名、列名、用戶名等。不建議將用戶建立的表,索引等對象存放到SYSTEM表空間中。
SYSAUX表空間:做爲SYSTEM的輔助表空間,用於存放各類數據庫工具用戶的數據;還用於存放各類模式的對象數據,如智能代理用戶DBSNMP等,這些模式在數據庫安裝完成後就創建了相應的對象並都存放在SYSAUX表空間中。
USERS表空間:一般做爲用戶使用的表空間,能夠在這個表空間上建立各類對象,如表、索引等。
除了Oracle系統默認建立的表空間外,用戶可根據應用系統的模式及其所要存儲的對象類型建立多個表空間,以區分用戶數據和系統數據。
建立表空間數據數據定義語言,語法以下:
SQL> create tablespace benet datafile'/u01/app/oracle/oradata/benet.DBF' size 10M autoextend on;
在語法中:
tablespacename是表空間名稱。
DATAFILE指定組成表空間的一個或多個數據文件,當有多個數據文件時使用逗號進行分隔。
filename是表空間中數據文件的路徑和名稱。
SIZE指定文件的大小,用K指定千字節大小,用M指定兆字節大小。
- AUTOEXTEND子句用來啓動或禁用數據文件的自動擴展。若設置AUTOEXTEND參數爲ON,則空間用盡會自動擴展;當設置AUTOEXTEND參數爲OFF時很容易出現表空間剩餘容量爲0,形成數據不能存儲到數據庫中的狀況出現。
建立完表空間以後,能夠對錶空間進行相應的管理,主要包括如下幾種操做。
調整表空間大小,當遇到數據插入失敗,表空間已滿的狀況,能夠經過ALTER語句來調整表空間的大小,此時有兩種調整表空間大小的方式。
方法一:更改數據文件的大小,並指明數據文件的存放路徑,其中還使用了RESIZE關鍵字,用於指定調整後的數據文件的大小,代碼以下:
SQL> alter database datafile'/u01/app/oracle/oradata/benet.DBF' resize 50M; Database altered.
方法二:向表空間內添加數據文件。爲表空間添加一個新的數據文件的代碼以下:
SQL> alter tablespace benet add datafile '/u01/app/oracle/oradata/benet01.DBF' size 20M autoextend no; Tablespace altered.
改變表空間的讀寫狀態。當數據是歷史數據,只容許查詢,不但願被修改使,能夠將表空間設置爲只讀狀態。READ ONLY表示該表空間爲只讀狀態,READ WRITE表示該表空間爲可讀寫狀態。具體語法格式以下:
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)存在於表空間中,是一種指定類型的邏輯存儲結構,段由一組區組成。段可分紅四類:數據段、索引段、回退段、臨時段。例如,對於每一個非彙集表有一個數據段,表的全部數據存儲再該段;而對於每一個索引都有一個索引段。
區(Extent)是磁盤空間分配的最小單位。磁盤按區劃分,每次至少分配一個區。區由連續的數據塊組成。段主要由一個或者多個區構成,當段建立後,它至少包含一個區。當段中的全部空間都徹底使用時,系統將自動爲該段分配一個新區。區不能跨數據文件存在,只能存在於一個數據文件中。
數據塊(Data Block)是數據庫中最小的數據組織單位於管理單位。Oracle數據庫中的數據存儲於數據塊中。數據塊是Oracle服務器所能讀取或寫入的最小存儲單元。Oracle服務器以數據塊爲單位管理數據文件的存儲空間。數據塊的取值範圍爲2~64KB,其默認大小與Oracle版本有關。
模式(Schema)是數據庫對象(又稱模式對象)的集合。模式對象包括表、視圖、索引、同義詞、序列、過程和程序包等。每建立一個用戶,Oracle會自動建立一個與用戶名相同的模式,所以,模式又稱用戶模式。用戶登陸後,默認訪問的是與本身的名稱相同的模式中的數據庫對象。
內存結構是Oracle數據庫體系中最爲重要的一部分,內存也是影響數據庫性能的第一要素。
Oacle內存存儲的主要內容:
程序代碼;
已經鏈接的會話的相關信息,包括當前全部活動會話和非活動會話;
程序運行時必需的相關信息,如查詢計劃;
- Oracle進程之間通訊和共享的信息,如鎖;
按照內存使用方式不一樣,Oracle數據庫的內存也能夠分爲SGA、PGA、和UGA(User Global Area,用戶全局區)。
SGA:全部用戶均可以訪問的實例的共享內存區域。數據塊、事務處理日誌、數據字典信息等都存儲在SGA中。
UGA:爲用戶進程存儲會話狀態的內存區域。根據用戶數據庫時配置爲專用服務器模式,仍是配置爲共享服務器模式,UGA能夠做爲SGA或PGA的一部分。它爲用戶會話存儲數據。接下來重點介紹一下SGA和PGA:
Oracle實例的SGA同來存儲數據庫信息,並由多個數據庫進程共享。當數據庫實例啓動時,SGA的內存被自動分配。SAG是數據庫中佔用服務器內存最大的一個區域,也是影響數據庫性能的一個重要指標。SGA按其做用不一樣,可分爲共享池、數據緩衝區、重作日誌緩衝區、大池和Java池等。
共享池是對SQL、PL/SQL程序進行語法分析、編譯、執行時用到的內存區域。共享池由庫緩存和數據字典緩存組成。
庫緩存含有最近執行的SQL、PL/SQL語句的分析碼和執行計劃。
數據緩衝區用於存儲從磁盤數據文件中讀入的數據,供全部用戶共享。修改數據時,首先要從數據文件中取出數據,存儲於數據緩衝區中。修改的數據,插入的數據都被存儲於數據緩衝區中,修改完成和其餘條件知足時,數據才被寫入數據文件中。
Oracle服務器進程在處理一個查詢時,首先查找內存中是否存在所需的數據塊。若是在數據緩衝區中沒有找到須要的塊,服務器進程就從數據文件中讀取此塊,並保存在緩衝區中。當後續的請求須要讀取這些塊時,即可以在內存中找到,所以這些請求不須要從磁盤中讀取,從而提升了讀取速度。數據緩衝區的大小對數據庫的讀取速度有直接的影響。
當用戶執行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操做時,數據發生了變化,這些變化了的數據在寫入數據緩存以前先要寫入重作日誌緩衝區,同時變化以前的數據也放入重作日誌緩存,這樣在數據恢復時Oracle就知道哪些資源須要提交,哪些資源須要撤回。相對於數據緩衝區,日誌緩衝區對數據庫的性能影響較小。
在SGA中,大池是一個可選的緩衝區,管理員能夠根據須要對其今進行配置。在大規模輸入、輸出及備份過程當中也須要大池做爲緩衝空間,如大數據操做、數據庫備份與恢復之類的操做。
在SGA中,Java池也是一個可選的緩衝區,可是在安裝Java或者使用Java程序時必須設置Java池,用於編譯Java語言編寫的指令。
PGA不是實例的一部分,它包含單個服務器進程或單個後臺進程所需的數據和控制信息。PGA是在用戶進程鏈接到數據庫並建立一個會話時自動分配的,該分區保留了每一個與Oracle數據庫鏈接的用戶進程所需的內存。在一個用戶結束會話後,PGA將被釋放。
Oracle中有幾種不一樣類型的進程:用戶進程、服務器進程和後臺進程。
用戶進程:在數據庫用戶請求鏈接Oracle服務器時啓動;
服務器進程:在用戶創建會話並鏈接Oracle實例時啓動;
- 後臺進程:在Oracle實例啓動時啓動;
用戶進程是一個須要與Oracle服務器進程交互的程序。當數據庫用戶運行一個應用程序準備向數據庫服務器發送請求時,即建立了用戶進程。例如:用戶啓動數據庫工具Sqlplus時,系統將自動創建一個用戶進程。
在Oracle數據庫中,爲了使系統性能更好地協調多個用戶,實例系統中使用的一些附加進程,稱爲後臺進程。這些後臺進程存在於操做系統中,在實例啓動時自動啓動。其中有五個進程是必需要啓動的,不然數據庫實例沒法啓動。這五個重要且必需的後臺進程爲進程監控(Process Monitor,PMON)進程、系統監控(System Monitor,SMON)進程、數據寫入(Database Writer,DBWR)進程、日誌寫入(Log Writer,LGWR)進程、檢查點(Check Point,CKPT)進程。
PMON進程在用戶鏈接意外中斷後執行資源清理工做,包括如下任務:
釋放全部當前掛起的鎖;
回滾用戶當前事務處理;
釋放用戶當前使用的資源;
- 監控服務器進程和其餘後臺進程,出現故障時重啓它們;
SMON進程執行如下任務:
- 在實例啓動時執行實例恢復。實例恢復包括三個步驟:
①前滾以恢復未寫入的數據文件但已記入聯機日誌文件的數據;
②打開數據庫,以便用戶能登陸並訪問數據;
③回滾爲提交的事務處理;
整理數據文件的自由空間;
- 釋放再也不使用的臨時段;
DBWR進程執行如下任務:
管理數據緩衝區,以便能找到空閒的緩衝區讀入數據文件的數據;
將全部修改後的緩衝區數據寫入數據文件;
使用LRU算法經最近使用過的塊保留在內存中;
- 經過延遲寫入優化磁盤I/O讀寫;
LGWR進程負責將重作日誌緩衝區中的日誌數據寫入日誌文件組。數據庫在運行時,若是對數據進行修改,則產生日誌信息,日誌信息首先產生於重作日誌緩衝區中。此緩衝器按照「先進先出」的原則進行操做,當日志信息知足必定條件是,由LGWR進程將日誌數據寫入日誌文件。系統一般有多個日誌文件,日誌寫入進程以循環的方式將數據寫入文件。
CKPT進程是確保數據緩衝區中全部修改過的數據塊都寫入數據文件的機制。當檢查點完成後,CKPT進程負責更新數據文件頭和控制文件、保存檢查點信息,以保證數據庫日誌文件和數據文件同步。在數據庫恢復時只須要找到CKPT保存的最後一次檢查點,就能夠根據它肯定日誌文件中恢復數據的開始位置,而後從新執行其以後的日誌記錄便可。
ARCn進程即歸檔日誌進程,是一個可選進程,只有在打開日誌歸檔時纔有該進程。該進程的主要做用是發生日誌切換時將寫滿的聯機日誌文件複製到歸檔目錄。
和以前版本的Oracle不一樣,Oracle 12c能夠做爲單個數據庫使用(經過再安裝時取消勾選「建立爲容器數據庫」複選框),也可根據企業須要,提供若干個可插拔PDB數據庫。每一個PDB能夠由不一樣的DBA維護。下面介紹CDB和PDB的基本維護。
[oracle@oracle ~]$ source .bash_profile [oracle@oracle ~]$ sqlplus / as sysdba <!--以sys用戶登陸數據庫--> 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 <!--CDB$ROOT表明當前在CDB下面--> SQL> SQL> show pdbs; <!--查看數據庫的全部容器--> CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB MOUNTED <!--狀態爲mounted(並無open)--> SQL> SQL> alter pluggable database orclpdb open; <!--CDB下修改可插拔數據庫orclpdb爲打開狀態--> Pluggable database altered. SQL> SQL> alter session set container=orclpdb; <!--CDB下切換會話到PDB(orclpdb)中--> Session altered. SQL> SQL> show con_name; <!--再次查看當前位置已經位於orclpdb中--> CON_NAME ------------------------------ ORCLPDB SQL>
從CDB切換到PDB以及相關的操做以下:
SQL> show con_name; <!--查看當前位置--> CON_NAME ------------------------------ CDB$ROOT SQL> SQL> alter session set container=orclpdb; <!--切換會話到PDB中--> Session altered. SQL> SQL> show con_name; <!--查詢當前容器--> CON_NAME ------------------------------ ORCLPDB SQL> SQL> shutdown immediate; <!--在PDB中關閉可插拔數據庫--> Pluggable Database closed. SQL> SQL> startup; <!--在PDB中打開可插拔數據庫--> Pluggable Database opened. SQL> SQL> alter session set container=cdb$root; <!--切換會話到CDB中--> Session altered. SQL> SQL> show con_name; <!--再次查看當前的位置--> CON_NAME ------------------------------ CDB$ROOT SQL>
經過上面的操做能夠發現,能夠在CDB中管理PDB,如CDB中經過命令「alter pluggable database orclpdb open」能夠將PDB數據設置爲打開狀態。固然也能夠在PDB中維護,如執行「shutdown immediate」命令和「startup」命令分別關閉和打開PDB數據庫。在CDB和PDB中切換也是很是方便的,只需執行「alter session set container=xxx」命令便可。
鏈接到可插拔數據PDB有兩種方法,一種是執行命令「sqlplus / as sysdba」進入CDB,而後經過「alter session set container=xxx」命令切換到PDB;另外一種方法是執行「sqlplus sys/oracle@orclpdb sa sysdba」命令直接進入PDB數據庫,其中orclpdb是pdb容器的名稱,並且還要在/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora文件中增長如下內容:
[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) ) )
在建立一個新數據庫時,Oracle將建立一些默認數據庫用戶,好比:SYS、SYSTEM等用戶。SYS和SYSTEM用戶都是Oracle的管理用戶。若是在安裝過程當中選擇安裝示例數據庫,則會自動建立HR用戶,HR用戶是Oracle數據庫的一個示範用戶,也能夠根據需求導入其餘示例數據庫。示例數據庫裏面包含一些測試展現用的示例表。下面簡單介紹一下SYS、SYSTEM和自定義用戶。
SYS用戶是Oracle中的一個超級用戶,主要用來維護系統信息和管理實例。數據庫中全部數據字典和視圖都存儲在SYS模式中。數據字典存儲了用來管理數據庫對象的全部信息,是Oracle數據庫中很是重要的系統信息。SYS用戶只能以SYSOPER或SYSDBA角色登陸數據庫系統。
SYSTEM用戶是Oracle中默認的數據庫管理員,它擁有DBA權限。該用戶模式中存儲了Oracle管理工具使用的內部表和視圖。一般經過SYSTEM用戶管理Oracle數據庫的用戶、權限和存儲等,不建議在SYSTEM模式中建立用戶表。SYSTEM用戶不能以SYSOPER或SYSDBA角色登陸系統,只能使用以默認方式(數據庫身份驗證的方式)登陸。
Oracle 12c支持建立自定義用戶,因爲PDB的引入,自定義用戶範疇和以前版本有所不一樣。在CDB模式下,用戶分爲兩種:公用用戶和本地用戶。公用用戶能夠在CDB和PDB中使用,而本地用戶只能在PDB中使用。在CDB環境中,不容許建立本地用戶。Oracle規定,在CDB中建立公用用戶時,用戶名必須以c##開頭。
一般狀況下,出於安全考慮,對於不一樣用戶的數據表須要不一樣的訪問權限,所以,就須要建立不一樣的用戶。Oracle中的CREATE USER命令用於建立新用戶。每一個用戶都有一個默認空間和一個臨時表空間。若是沒有指定,Oracle就將USERS設爲默認表空間,將TEMP設爲臨時表空間。建立用戶的語法以下:
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.
權限是執行某種類型的SQL語句揮着存取其餘用戶數據庫對象的權力。在Oracle中,權限分爲系統權限和對象權限兩類。
系統權限是指在數據庫中執行某種系統級別的操做,或者針對某一類的對象執行某種操做的權限。例如,在數據庫中建立表空間的權力,或者在數據庫中建立表的權力,都屬於系統權限。系統權限示例以下圖:
常見的系統權限以下:
CREATE SESSION:鏈接到數據庫;
CREATE TABLE:建立表;
CREATE VIEW:建立視圖;
- CREATE SEQUENCE:建立序列;
一個新用戶建立後,首選要授予其CREATE SESSION權限,使其能夠登陸到數據庫。
對象權限是指針對某個特定的模式對象執行操做的權力。只能針對模式對象來設置和管理對象權限,包括數據庫中的表、視圖、序列、存儲過程等。以下圖所示:
Oracle數據庫用戶有兩種獲取權限的途徑:①直接向用戶授予權限;②將權限授予角色,再將角色授予一個或多個用戶。使用角色可以更加方便和高效地對權限進行管理。因此數據庫管理員經過使用角色向用戶授予權限,而不是直接向用戶授予權限。在Oracle數據庫系統中預約義了不少角色,其中最經常使用的主要有CONNECT角色、RESOURCE角色、DBA角色等。
Oracle中經常使用的系統預約義角色以下:
CONNECT:擁有鏈接數據庫的權限;
RESOURCE:擁有建立表、觸發器、過程等權限;
- DBA:數據庫管理員角色,擁有管理數據庫的最高權限;一個具備DBA角色的用戶能夠受權任何其餘用戶甚至其餘DBA權限,這是很危險的,所以不要輕易授予該角色;
新建立的用戶必須授予必定的權限才能進行相關數據庫的操做。受權經過CRANT語句,取消受權則經過REVOKE語句。
SQL> alter session set container=orclpdb; <!--切換到orclpdb數據庫--> Session altered. SQL> create user bob identified by 123456; <!--建立帳戶bob--> User created. SQL> grant connect,resource to bob; <!--受權bob用戶擁有鏈接數據庫和建立表、觸發器、過程等權限--> Grant succeeded. SQL> revoke connect,resource from bob; <!--撤銷受權--> Revoke succeeded.
數據庫用戶安全設計原則以下:
數據庫用戶去哪先按照最小分配原則;
數據庫用戶可分爲管理、應用、維護、備份四類用戶;
不容許使用sys和system用戶創建數據庫應用對象;
禁止對普通用戶授予dba權限;
對查詢用戶只能開放查詢權限;
- 對新建用戶初次登陸數據庫時強制修改密碼;
通常程序開發人員只要授予 CONNECT和RESOURCE兩個角色便可。特別注意,授予這兩個角色就包含了授予用戶無限制使用默認表空間的權限。
———————— 本文至此結束,感謝閱讀 ————————