本篇博客將對Oracle的體系結構、存儲結構、內存結構和進程結構進行初步介紹,從而從宏觀上把握它的物理組成、文件組成和各種進程,對於進一步的瞭解可以起到很好地作用
一、Oralce體系結構
1、概述
Oracle的體系結構是數據庫的組成,工作過程,以及數據庫中數據的組織與管理機制,要了解oracle數據庫的體系結構,就必須要理解oracle的主要組件和重要的概念。Oracle體系結構包含一系列組件,包括實例、用戶進程、服務進程、數據文件及其他文件,如參數文件、口令文件和歸檔日誌文件等。如下圖所示:
實例和數據庫是oracle數據庫體系結構的核心組成部分,也是最重要的兩個概念,dba的主要工作就是維護實例和數據庫。
1)實例
實例是後臺進程和內存的集合,必須啓動實例才能訪問數據庫中的數據。
Oracle啓動時,將分配一個系統全局區(SGA),並啓動一系列oracle後臺進程
一個實例只能打開並使用一個數據庫
Oracle分爲單進程實例和多進程實例,現在普遍都是多進程實例,多進程就是多用戶,不同用戶使用不同進程來執行oracle的不同部分。
2)數據庫
數據庫是一個數據的集合,該集合被視爲一個邏輯單元。
Oracle 數據庫由操作系統文件組成,這些文件爲數據庫信息提供實際物理存儲區
Oracle 數據庫包括邏輯結構和物理結構。
物理結構:是指存儲數據庫信息的一組操作系統文件,每個數據庫有一個邏輯結構和一個物理結構。物理結構是指構成數據庫的一組操作系統文件,主要由3種類型文件組成:數據文件,控制文件和重做日誌文件。
邏輯結構:是指數據庫數據的邏輯存儲結構,包括:表空間,數據段,表,視圖等。
二、oracle存儲結構
Oracle的存儲結構分爲物理結構和邏輯結構,這兩種存儲結構既相互獨立又相互聯繫。
1、物理結構:
物理結構就是oracle數據庫創建後使用的操作系統物理文件,分爲以下兩種:
1)主要文件
數據文件:數據文件是物理存儲數據庫的文件,數據文件的特點:每個數據文件只與一個數據庫相聯繫,一個表空間可以包含一個或多個數據文件,一個數據文件只能屬於一個表空間。數據文件包含數據庫的用戶或應用程序數據,以及元數據和數據字典。
重做日誌文件:它記錄了對數據的所有更改信息,並提供一種數據恢復機制,如果數據庫服務器發生崩潰,但未丟失任何數據文件,那麼實例便可使用這些文件中的信息恢復數據庫。
控制文件:當數據庫讀取時,要根據控制文件的信息查找數據文件。控制文件存儲了數據文件和重做日誌文件的名稱和位置。一個數據庫至少有兩份控制文件,oracle11g默認包括3個控制文件,各個控制文件內容相同,可以避免因爲一個控制文件的損壞導致無法啓動數據庫。控制文件記錄了以下關鍵信息:數據文件的位置和大小、重做日誌文件的位置及大小、數據庫名稱及創建時間、日誌序列號。控制文件對數據庫至關重要。沒有這些文件,就無法打開數據文件以訪問數據庫中的數據。
2)其他文件
參數文件:用於定義實例啓動時的配置
口令文件:允許sysdba、sysoper 和sysasm 遠程連接到實例並執行管理任務
歸檔日誌文件:使用這些文件和數據庫備份,可以恢復丟失的數據文件。也就是說,歸檔日誌能夠恢復還原的數據文件
2、oracle邏輯結構
Oracle的邏輯組件包括表空間、段、區、塊和模式等。
1)表空間
表空間是數據庫中最大的邏輯單位, SYSTEM 和SYSAUX 表空間是在創建數據庫時創建的必須存在的表空間,還會有TEMP,USERS等。
每個表空間是由一個或多個數據文件組成的,一個數據文件只能與一個表空間相關聯。
表空間的大小等於構成該表空間的所有數據文件大小之和。
表空間和數據文件是相對應的,如果沒有數據文件,表空間不可能獨立存在,如果只有表空間沒有數據文件也是不行的,就好比如果電腦沒有硬盤,你不能再邏輯上看到C盤D盤,在這裏硬盤就相當於是數據文件,而C盤就相當於是表空間。我們可以把多個數據文件組成一個表空間,然後在表空間裏面存儲數據,表空間和數據文件是對應的,一個表空間可以是由一個或多個數據文件組成的,但是一個數據文件只能在一個表空間當中。
表空間的作用:
對於不同的用戶分配不同的表空間,對不同的模式對象分配不同的表空間,方便對用戶操作和模式對象的管理。
可以將不同數據文件創建到不同的磁盤中,有利於管理磁盤空間,提高i/o性能,備份和恢復數據等。
SYSTEM表空間:用於存放oracle系統內部表和數據字典的數據,如表明、列名、用戶名等。
SYSAUX表空間:作爲SYSTEM的輔助表空間,用於存放各種數據庫工具(如企業管理器、StasPack、logMiner等)用到的數據。用於存放各種模式的對象數據,如智能代理用戶DBSNMP、數據挖掘用戶ODM等。
USERS表空間:作爲用戶使用的表空間,可以在這個表空間上創建各種對象,如創建表,索引等。
TEMP表空間:存放臨時數據的特殊表空間,例如:當需要進行排序時,系統就將排序的數據臨時存放在該表空間,排序處理完成後,即可釋放排序數據所佔用的空間,稱之爲臨時表空間。
以上表空間我們不能創建,系統安裝好之後自動創建好了,我們也可以根據需要自己創建。
創建表空間的語法是:
CREATE TABLESPACE tablespacename
DATAFILE ‘filename’ [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
案例一:創建一個自動增長的表空間tbs_work
如果不能創建,說明數據庫沒有啓動,執行STARTUP命令之後再創建。
如果空間不夠用了,可以調整表空間大小。
方法一:更改數據文件大小,並指明數據文件的存放路徑,使用RESIZE關鍵字執行調整後的表空間大小。
方法二:向表空間內添加新的數據文件,當數據文件滿了之後自動存儲到新的數據文件。
案例二:改變表空間的讀寫狀態,ONLY表示只讀,WRITE表示可讀寫。
刪除表空間
案例三、想查看系統中有多少個數據文件
案例四、如何查看錶空間
案例五、查看錶空間和數據文件之間的對應關係
2)段
段存在於表空間中,是一種指定類型的邏輯存儲結構。
段由一組區組成
段分爲4類:數據段、索引段、回退段、臨時段。
3)區
區是磁盤空間分配的最小單位。磁盤按區劃分,每次至少分配一個區。
區是由連續的數據塊組成。
段主要有一個或多個區構成,當創建段時,至少包含一個區。
區不能跨數據文件存在,只能存在於一個數據文件中。
4)數據塊
是數據中最小的數據組織單位與管理單位
Oracle數據中的數據存儲於數據塊中
數據塊是oracle服務器所能讀取或寫入的最小存儲單元
數據塊的取值範圍是2K-64KB,默認值與oracle版本有關
5)模式
模式是數據庫對象的集合。包括:表、視圖、索引、同義詞、序列、過程和程序包等。
當創建一個用戶時,oracle會自動創建一個與用戶名相同的模式,因此,模式又稱爲用戶模式。
用戶登錄後,默認訪問的是與自己的名稱相同的模式中的數量庫對象。
三、oracle的內存結構
內存是影響數據庫性能的第一要素,oracle內存存儲的主要內容如下:
程序代碼
關於已經連接的會話信息,包括當前所有活動會話和非活動會話
程序運行時必須的相關信息,如查詢計劃
Oracle進程之間通信和共享的信息,如鎖
按照內存的使用方法不同,oracle數據庫的內存又可分爲系統全局區(SGA)、程序全局區(PGA)、用戶全局區(UGA)
1、系統全局區 ( SGA )
數據庫信息存儲於系統全局區,由多個數據庫進程共享,當數據庫實例啓動時SGA的內存本自動分配,SGA是數據庫中佔用服務器內存最大的一個區域,也是影響數據庫性能的一個重要指標,SGA按作用不同,分爲以下幾個部分。
2、PGA
PGA不是實例的一部分,包含單個服務器進程或者單個後臺進程所需的數據和控制信息。
PGA是在用戶進程連接到數據庫並創建一個會話時自動分配
該區域內保留每個與oracle數據庫連接的用戶進程所需的內存
當一個用戶會話結束,PAG就會釋放
3、UGA
用戶全局區(UGA)爲用戶進程存儲會話狀態
UGA可以作爲SGA或者PGA的一部分。具體位置取決於如何連接Oracle:
如果通過一個共享服務器連接,UGA包含在SAG中
如果通過一個專有服務器連接,UGA就包含在專有服務器的PGA中
案例一:驗證內存結構工作的原理(select語句是如何被執行的?)
當用戶執行語句select * from scott.emp的時候,工作原理分爲四步,如下:
第一步:先做編譯,編譯包含了語法的檢查和語義的檢查。
第二步:如果編譯沒有問題會進入shared pool(共享池 )中,而shared pool 是由library cache和data dictionary cache(數據字典緩存)組成。Sql語句第一時間會進入library cache中,即library cache中會存放被編譯過的正確的sql語句,僅僅是sql語句而已。library cache中沒有緩存的sql語句需要進行硬解析(即需要耗費設備的I/0資源從硬盤讀取)。假設library cache中有這個sql語句,就不需要做硬解析,接着會查 data dictionary cache。data dictionary cache中緩存了權限和對象數據及屬性,所有data dictionary cache檢查用戶是否對scott.emp表是否具有訪問權限,如果有權限繼續往下執行,如果沒有權限,直接給用戶返回一個結果。如果一條語句從來都沒有被執行過,這條語句首先被緩存在share pool中的library cache中,下一次被執行的時候直接從share pool中取sql語句。存放sql語句也需要佔用空間,share pool的空間也是有限的,爲了防止share pool空間不夠用,採用先進先出的規則即後執行的sql語句會覆蓋先執行的sql語句來釋放空間,當然share pool的空間越大越好。
第三步:data buffer cache現在hr用戶可以訪問scott.emp表了,data buffer cache的作用就是從磁盤或存儲中將數據塊調入內存,緩存在buffer cache中。總結:buffer cache緩存數據本身,library cache緩存sql語句本身。
第四步:redo log buffer<重做日誌緩衝區>當用戶執行insert,update,delete,create,alter等操作後,數據發生了變化,這些變化了的數據寫入數據緩衝區(buffer cache)之前,先寫入重做日誌緩衝區,同時變化之前的數據也放入重做日誌緩存中,這樣做,是爲了保證在數據恢復時oracle就知道哪些事務需要提交,哪些事務需要撤回。
可以通過企業管理器來查看share pool的相關信息
如果控制檯打不開,可以執行命令打開:
可以從v$sgainfo中查看shared pool size
測試語句執行時間:
SQL> set timing on
SQL> select * from scott.emp;第一次執行sql語句
已用時間: 00: 00: 00.05
SQL> /再次執行上一條命令所用的時間爲00: 00: 00.00
已用時間: 00: 00: 00.00
通過上面的測試發現,緩存提高了查詢的速度。
四、oracle進程結構
Oracle有5個後臺進程是必須啓動的,否則數據庫實例無法啓動成功,分別是:進程監控(PMON)進程、系統監控(SMON)進程、數據寫入(DBWR)進程、日誌寫入(LGWR)進程、檢查點(CKPT)進程。
CKPT進程:確保數據緩衝區中所有修改過的數據塊都被寫入數據庫文件的機制。保證數據庫日誌文件和數據文件的同步。
相關命令:
1、查看用戶進程和數據庫進程
Ps –elf | greporacleocl |grep–v grep
2、守護進程
Ps –elf |grep oha
3、查看日誌進程LGWR
Ps –elf |grep ora_ | grep lgwr
五、oracle用戶管理
當創建一個新數據庫時,oracle將常見一些默認的數據庫用戶,如SYS,SYSTEM和SCOTT等用戶。SYS和SYSTEM用戶都是oracle管理用戶,而SCOTT用戶是oracle數據庫的一個示範用戶,SCOTT數據庫裏面包含一些測試展示用的示例表(用於學習交流)
1、默認數據庫用戶
1)SYS
SYS用戶是oracle中的一個超級用戶,數據庫中所有數據字典和視圖都存在SYS模式中,數據字典存儲了用來管理數據庫對象的所有信息,是oracle數據庫中非常重要的系統信息。SYS用戶主要用來維護系統信息和管理實例。SYS用戶只能以SYSOPER或SYSDBA角色登錄系統。
2)SYSTEM
SYSTEM用戶是oracle中默認的數據庫管理員,它擁有DBA權限。該用戶模式中存儲了oracle管理工具使用的內部表和視圖。通常通過SYSTEM用戶管理數據庫的用戶、權限和存儲等。不建議在SYSTEM模式中創建用戶表。SYSTEM不能以SYSOPER和SYSDBA角色登錄系統,只能以默認方式登錄。
3)SCOTT
SCOTT用戶是oracle數據庫的一個示範用戶,一般在數據庫安裝時創建。SCOTT用戶模式包含4個示例表,其中一個是EMP表,使用USERS表空間存儲模式對象。
通常出於安全考慮,對於不同用途的表需要不同的訪問權限,此時,就需要創建不同的用戶,oracle中的create user命令用於創建用戶,每個用戶都有一個默認表空間和一個臨時表空間。如果沒有指定,oracle就將USERS設爲默認表空間,將TEMP設爲臨時表空間。
4)Sysdba和sysoper兩個系統權限區別
sysdba和sysoper屬於system privilege,也稱爲administrative privilege,擁有例如數據庫開啓關閉之類一些系統管理級別的權限。sysdba和sysoper具體的權限如下:
【SYSOPER】權限,即數據庫操作員權限,權限包括:
打開數據庫服務器
關閉數據庫服務器
備份數據庫
恢復數據庫
日誌歸檔
會話限制
【SYSDBA】權限,即數據庫管理員權限,權限包括:
打開數據庫服務器
關閉數據庫服務器
備份數據庫 恢復數據庫
日誌歸檔
會話限制
管理功能
創建數據庫
【sysdba】擁有最高的系統權限,登陸後是sys。
【sysoper】主要用來啓動、關閉數據庫,sysoper 登陸後用戶是public。
2、創建自定義用戶
步驟:
選擇用戶名和密碼
識別用戶需用於存儲對象的表空間
決定每個表空間的限額
分配缺省表空間和臨時表空間
創建用戶
向用戶授予權限和角色
語法:
CREATE USER user
IDENTIFIED BY password
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {integer [K|M] | UNLIMITED}ON tablespace
[QUOTA {integer [K|M] | UNLIMITED}ON tablespace ] ...]
[PASSWORD EXPIRE ]
案例1:創建用戶YDW
CREATE USER YDW --用戶名爲YDW
IDENTIFIED BY pwd123 --密碼爲martinpwd
DEFAULT TABLESPACE tbs_work --默認表空間爲tbs_work
TEMPORARY TABLESPACE temp --臨時表空間爲temp
QUOTA UNLIMITED ON tbs_work --對tbs_work表空間的使用沒有限制
PASSWORD EXPIRE; --第一次登錄需要修改密碼
3、修改YDW用戶的密碼爲pwd123456
4、刪除用戶YDW
5、查詢oracle的所有用戶
6、解鎖用戶
1)先查看hr用戶的狀態是鎖定的
六、oracle數據庫權限管理
權限指的是執行特定命令或訪問數據庫對象的權利
權限有兩種類型,系統權限和對象權限
系統權限允許用戶執行某些數據庫操作,如創建表就是一個系統權限
對象權限允許用戶對數據庫對象(如表、視圖、序列等)執行特定操作
角色是一組相關權限的組合,可以將權限授予角色,再把角色授予用戶,以簡化權限管理
1、使用系統權限
系統權限是指在數據庫中執行某種系統級別的操作,或者針對某一類對象執行某種操作的權利,例如:在數據庫中創建表空間的權利,或者創建表的權利,都屬於系統權限,具體如下圖:
常用的系統權限如下:
CREATE SESSION:連接到數據庫
CREATE TABLE:創建表
CREATE VIEW:創建視圖
CREATE SEQUENCE:創建序列
2、對象權限
對象權限是指針對某個特定模式對象執行操作的權利,只能針對模式對象來設置管理對象權限,包括:表、視圖、序列、存儲過程等。
3、授權
Oracle數據庫用戶有兩種途徑獲得權限
1)直接向用戶授予權限
2)將權限授予給角色,再將角色授予給一個或者多個用戶
使用角色能更高效,方便地對權限進行管理,所以數據庫管理員通常使用角色向用戶授予權限,而不是直接向用戶授予權限。
Oracle中常用系統預定義角色有以下種類:
1)CONNECT:擁有連接數據庫權限
2)RESOURCE:擁有創建表、觸發器、過程等權限
3)DBA:數據庫管理員,擁有管理數據庫最高權限
新用戶必須授予一定的權限才能進行相關數據庫操作,授權通過grant語句,取消授權通過revoke語句
授權的語法:
1)GRANT CONNECT TO MARTIN;
授予授予CONNET角色給MARTIN
2)GRANT CONNECT,RESOURCE TO MARTIN;
同時授予CONNET,RESOURCE這2個角色給MARTIN
3)GRANT SELECT ON SCOTT.emp TO MARTIN;
允許用戶MARTIN查詢 SCOTT.emp表的記錄
4)GRANT UPDATE ON SCOTT.emp TO MARTIN;
允許用戶MARTIN更新 SCOTT.emp表中的記錄
5)GRANT ALL ON SCOTT.emp TO MARTIN;
允許用戶MARTIN插入、刪除、更新和查詢SCOTT.emp表中的記錄
4、撤銷權限的語法:
使用REVOKE命令撤銷用戶分配的權限或角色
1)REVOKE CONNECT,RESOURCE FROM MARTIN;
撤銷CONNET,RESOURCE這2個角色
2)REVOKE SELECT FROM SCOTT.emp TO MARTIN;
撤銷MARTIN查詢 SCOTT.emp表的記錄的權限
案例1:爲用戶設置權限
1)首先建立用戶YDW
2)使用YDW用戶登錄
提示第一次登錄需要更改密碼
3)使用新密碼重新登錄,提示沒有任何權限。
4)爲用戶授予session(連接到數據庫)權限
5)重新登錄oracle
6)測試YDW能否創建表,提示權限不足
7)授予用戶創建表的權限
8)再次使用YDW登錄,測試能夠創建表
創建成功了
9)測試插入數據,並查詢
10)查看用戶擁有的權限
11)撤銷用戶的權限
12)測試用戶YDW能夠查詢scott.emp
提示沒有權限
13)授予用戶查詢scott.emp的權限
14)測試查詢scott.emp
查詢成功了