Oracle體系結構和用戶管理

通過博文部署Oracle 12c企業版數據庫已經可以部署Oracle數據庫了,本篇博文主要介紹Oracle的體系結構,包括存儲結構、內存結構和進程結構進行初步瞭解。對進一步學習Oracle數據庫有很大的幫助。

博文大綱:
一、Oracle體系結構
1.Oracle體系結構概述
2.Oracle服務器
3.Oracle存儲結構
4.Oracle內存結構
5.Oracle進程結構
二、CDB與PDB的基本操作
三、用戶管理
四、數據庫權限管理
五、導入測試數據

一、Oracle體系結構

數據庫的體系結構是指數據庫的組成、工作過程、以及數據庫中數據的組織與管理機制,要了解Oracle數據庫的體系結構,必須理解Oracle系統的主要組件和重要概念。

1.Oracle體系結構概述

Oracle體系結構包含一系列組件,如圖:
Oracle體系結構和用戶管理
圖中顯示了Oracle體系結構中的主要組件,包括實例、用戶進程、服務器進程、數據文件及其他文件,如參數文件、口令文件和歸檔日誌文件等。

從圖中可以看出,實例和數據庫是Oracle數據庫體系結構的核心組成部分,也是最重要的兩個概念。

作爲一個DBA管理者,維護實例和數據庫本身的正常運行是最基本的技能。

(1)實例

Oracle實例是後臺進程和內存結構的集合,必須啓動實例才能訪問數據庫中的數據。Oracle實例啓動時,將分配一個系統全局區(SGA)並啓動一系列Oracle後臺進程。

Oracle實例有兩種類型:

  • 單進程Oracle實例使用一個進程執行Oracle的全部操作,在單進程環境下的Oracle實例僅允許一個用戶可存取;
  • 多進程Oracle實例使用多個進程來執行Oracle的不同部分,對於每個連接的用戶都有一個進程;

(2)數據庫

數據庫是數據的集合,物理上指存儲數據庫信息的一組操作系統文件,每個數據庫有一個邏輯結構和物理結構。

  • 物理結構是指構成數據庫的一組操作系統文件,主要由三種類型文件組成、數據文件、控制文件和重做日誌文件;
  • 數據庫的邏輯結構是指數據庫數據的邏輯存儲結構(如表空間、段)和模式對象(如表、視圖等);

(3)可插拔數據庫

從Oracle 12c版本開始,Oracle引入了可插拔數據庫的概念,可插拔是爲雲計算而生。可插拔的結構由一個容器數據庫(CDB)和若干個可組裝數據庫(PDB)組成,每個PDB對外可充當一個獨立的數據庫工應用程序使用,它可以包含自己的數據文件,但是所有的PDB共享CDB的控制文件以及日誌文件。所謂的可插拔,意味着PDB可以像USB一樣隨時插入CDB中,不用了也可以隨時拔下來。一個CDB中最多可以插入250個PDB,在PDB中,seedPDB爲模板PDB,它爲新創建的PDB提供模板,其他的PDB可以根據需要創建、刪除。可插拔功能可以加速數據庫的部署,給一個CDB打補丁就可以經所有的更新同步到其上的所有PDB中。

在Oracle 12c之前的版本中,實例和數據庫只能是一對一或多對一的關係,即只能是一個實例對應一個數據庫,或者多個實例對應一個數據庫。單子啊Oracle 12c版本中,通過引入CDB和PDB,一個實例可以對應多個可插拔數據庫。

可插拔數據庫的使用場景:
(1)企業中有多個應用均需要使用Oracle數據庫,他們僅使用非常少量的硬件資源,但是又不得不爲他們創建多個實例;
(2)一些不是特別重要的數據庫,打包需要DBA花費大量的精力去維護;
(3)爲了更好的利用硬件資源以及減少管理開銷,有必要將大量的部門級應用整合到少數幾個Oracle關係型數據庫中,以便部署和管理;

通過一個集中化的平臺部署多個數據庫,同時又共享一個數據庫實例,可以大大降低成本,即更少的實例損耗和耕地的存儲技術。

如果在生產環境中只需要一個數據庫,並不想使用可插拔數據庫,可以在安裝過程中取消勾選“創建爲容器數據庫”複選框,從而將安裝一個普通數據庫。

2.Oracle服務器

Oracle服務器也是非常重要的概念,它主要由實力和數據庫文件組成,也就是常說的數據庫管理系統(DBMS)。
Oracle服務器的組成如圖:
Oracle體系結構和用戶管理
Oracle服務器除了維護實例和數據庫文件外,還在用戶建立與服務器的連接時啓動服務器進程並分配PGA。

3.Oracle存儲結構

Oracle的存儲結構分爲物理結構和邏輯結構,這兩種存儲結構既相互獨立又相互聯繫。如圖:
Oracle體系結構和用戶管理

  • 物理結構主要描述Oracle數據庫的外部存儲結構,即在操作系統中如何組織、管理數據;
  • 邏輯結構主要描述Oracle數據庫的內部存儲結構,即從邏輯概念上描述在Oracle數據庫中如何組織、管理數據;

(1)Oracle物理結構

物理結構是Oracle數據庫創建後使用的操作系統物理文件,Oracle數據庫的物理文件分爲以下兩類:

1)主要文件

(1)數據文件:數據文件的擴展名通常是.dbf,是物理存儲Oracle數據庫數據的文件。

數據文件的特點:

  • 每個數據文件只與一個數據庫相聯繫;
  • 一個表空間可包含一個或多個數據文件;
  • 一個數據文件只能屬於一個表空間;

(2)重做日誌文件:重做日誌文件的擴展名是.log,它記錄了對數據的所有更改信息,並提供了一種數據恢復機制,確保在系統崩潰或其他意外出現後重新恢復數據庫。

在Oracle數據庫中,重做日誌文件是成組使用的,每個重做日誌文件組可以有一個多多個重做日誌文件。在工作過程中,多個重做日誌文件組之間循環使用,當一個重做日誌文件組寫滿後,會轉向下一個日誌文件組。重做日誌文件用於記錄數據庫變化,是用戶的事務處理日誌。

(3)控制文件:控制文件的擴展名是.ctl,是一個二進制文件。控制文件中存儲的信息很多,其中包括數據文件和重做日誌文件的名稱和位置。控制文件是數據庫啓動及運行所必須的文件。當Oracle讀寫數據時,要根據控制文件 的信息查找數據文件。

由於控制文件的重要性,一個數據庫至少要有兩份控制文件。Oracle 12c默認包含兩個控制文件,各個控制文件內容相同,從而可以避免因爲一個控制文件的損壞而導致無法啓動數據庫的情況發生。

控制文件中記錄了以下信息:

  • 數據文件的位置及大小;
  • 重做日誌文件的位置及大小;
  • 數據庫名稱及創建時間;
  • 日誌序列號;

2)其他文件

其他文件有參數文件、歸檔日誌文件、口令文件等。

(2)邏輯結構

數據庫的邏輯結構是從邏輯的角度分析數據庫的組成的。Oracle數據庫的邏輯結構包括表空間、段、區、塊和模式等。如圖:
Oracle體系結構和用戶管理

1)表空間

每個Oracle數據庫都是由若干個表空間構成的,用戶在數據庫中建立的所有內容都被存儲到表空間中。一個表空間可以由多個數據文件,但一個數據文件只能屬於一個表空間。與數據文件這種物理結構不同,表空間屬於數據庫的邏輯結構。

在每個數據庫中,都有一個名爲“SYSTEM”的表空間,即系統表空間,還會有SYSAUX、UNDO、USERS等表空間,這些都是在創建數據庫時自動創建的。管理員可以創建自定義的表空間並分配給指定用戶,也可以爲表空間增加和刪除數據文件。

表空間基本有以下三類:
(1)永久性表空間:一般保持基表、試圖、過程和索引等的數據。SYSTEM、SYSAUX、USERS表空間是默認安裝的;
(2)臨時性表空間:只用於保存系統中短期活動的數據,如排序數據等;
(3)撤銷表空間:用來幫助回退未提交的事務數據,已提交的數據在這裏是不可以恢復的;

一般不需要創建臨時性表空間和撤銷表空間,除非要把他們轉移到其他磁盤中以提高性能。

表空間的目的如下:

  • 對不同用戶分配不同的表空間,對不同的模式對象分配不同的表空間,方便對用戶操作和對模式對象的管理;
  • 可以將不同數據文件創建不同的磁盤中,有利於管理磁盤空間、提高I/O性能、備份和恢復數據等;

一般在完成Oracle系統的安裝並創建Oracle實例後,Oracle系統自動啊盡力SYSTEM、SYSAUX、USRS等多個表空間。

下面詳細介紹一下這幾種表空間:

  • SYSTEM表空間:用於存放Oracle系統內部表和數據字典的數據,如表名、列名、用戶名等。不建議將用戶創建的表,索引等對象存放到SYSTEM表空間中;
  • SYSAUX表空間:作爲SYSTEM的輔助表空間,用於存放各種數據庫工具用戶的數據;還用於存放各種模式的對象數據,如智能代理用戶DBSNMP等,這些模式在數據庫安裝完成後就建立了相應的對象並都存放在SYSAUX表空間中;
  • USERS表空間:通常作爲用戶使用的表空間,可以在這個表空間上創建各種對象,如表、索引等;
  • TEMP表空間:Oracle系統用於存放臨時數據的特殊表空間。比如:當操作中需要進行排序時,Oracle系統就將排序的數據臨時存放在該表空間內。排序處理完成後即可釋放排序數據所佔用的空間,因此成爲臨時表空間;

除了Oracle系統默認創建的表空間外,用戶可根據應用系統的模式及其所要存儲的對象類型創建多個表空間,以區分用戶數據和系統數據。

創建表空間數據數據定義語言,語法如下:
Oracle體系結構和用戶管理
語法中:

  • tablespacename:表空間名稱;
  • DATAFILE:指定組成表空間的一個或多個數據文件,當有多個數據文件時使用逗號進行分隔;
  • filename:表空間中數據文件的路徑和名稱;
  • SIZE:指定文件的大小,單位可以是K,也可以是M;
  • AUTOEXTEND:用來啓動或禁用數據文件的自動擴展。若設置爲ON時,則表示空間用盡會自動擴展;若設置爲OFF時,很容易出現表空間剩餘容量爲0,造成數據不能存儲到數據庫中的情況出現。

4.Oracle內存結構

內存結構是Oracle數據庫體系中最爲重要的一部分,內存也是影響數據庫性能的第一要素。

Oacle內存存儲的主要內容:

  • 程序代碼;
  • 已經連接的會話的相關信息,包括當前所有活動會話和非活動會話;
  • 程序運行時必需的相關信息,如查詢計劃;
  • Oracle進程之間通信和共享的信息,如鎖;

照內存使用方式不同,Oracle數據庫的內存也可以分爲以下幾種:

  • SGA:所有用戶都可以訪問的實例的共享內存區域。數據塊、事務處理日誌、數據字典信息等都存儲在SGA中;
  • PGA:一類非共享的內存,專用於特定的服務器進程,並且只能夠由這個進程訪問;
  • UGA:爲用戶進程存儲會話狀態的內存區域。根據用戶數據庫時配置爲專用服務器模式,還是配置爲共享服務器模式,UGA可以作爲SGA或PGA的一部分。它爲用戶會話存儲數據。

重點介紹一下SGA和PGA:

(1)SGA

Oracle實例的SGA同來存儲數據庫信息,並由多個數據庫進程共享。當數據庫實例啓動時,SGA的內存被自動分配。SAG是數據庫中佔用服務器內存最大的一個區域,也是影響數據庫性能的一個重要指標。

SGA按其作用不同,可以分爲以下幾個部分:

1)共享池

共享池是對SQL、PL/SQL程序進行語法分析、編譯、執行時用到的內存區域。

共享池由庫緩存和數據字典緩存組成:

  • 庫緩存含有最近執行的SQL、PL/SQL語句的分析碼和執行計劃;
  • 數據字典緩存含有從數據字典中得到的表、索引、列定義、權限信息和其他一些數據庫對象的定義,如果Oracle緩存了這些信息,那麼無疑是縮短了查詢的響應時間;

2)數據緩衝區

數據緩衝區用於存儲從磁盤數據文件中讀入的數據,供所有用戶共享。修改數據時,首先要從數據文件中取出數據,存儲於數據緩衝區中。修改的數據,插入的數據都被存儲於數據緩衝區中,修改完成和其他條件滿足時,數據才被寫入數據文件中。

Oracle服務器進程在處理一個查詢時,首先查找內存中是否存在所需的數據塊。如果在數據緩衝區中沒有找到需要的塊,服務器進程就從數據文件中讀取此塊,並保存在緩衝區中。當後續的請求需要讀取這些塊時,便可以在內存中找到,因此這些請求不需要從磁盤中讀取,從而提高了讀取速度。數據緩衝區的大小對數據庫的讀取速度有直接的影響。

3)重做日誌緩衝區

當用戶執行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操作時,數據發生了變化,這些變化了的數據在寫入數據緩存之前先要寫入重做日誌緩衝區,同時變化之前的數據也放入重做日誌緩存,這樣在數據恢復時Oracle就知道哪些資源需要提交,哪些資源需要撤回。相對於數據緩衝區,日誌緩衝區對數據庫的性能影響較小。

4)大池

在SGA中,大池是一個可選的緩衝區,管理員可以根據需要對其今進行配置。在大規模輸入、輸出及備份過程中也需要大池作爲緩衝空間,如大數據操作、數據庫備份與恢復之類的操作。

5)Java池

在SGA中,Java池也是一個可選的緩衝區,但是在安裝Java或者使用Java程序時必須設置Java池,用於編譯Java語言編寫的指令。

(2)PGA

PGA不是實例的一部分,它包含單個服務器進程或單個後臺進程所需的數據和控制信息。PGA是在用戶進程連接到數據庫並創建一個會話時自動分配的,該分區保留了每個與Oracle數據庫連接的用戶進程所需的內存。在一個用戶結束會話後,PGA將被釋放。

5.Oracle進程結構

Oracle中有幾種不同類型的進程:

  • 用戶進程:在數據庫用戶請求連接Oracle服務器時啓動;
  • 服務器進程:在用戶建立會話並連接Oracle實例時啓動;
  • 後臺進程:在Oracle實例啓動時啓動;

用戶進程是一個需要與Oracle服務器進程交互的程序。當數據庫用戶運行一個應用程序準備向數據庫服務器發送請求時,即創建了用戶進程。例如:用戶啓動數據庫工具Sqlplus時,系統將自動建立一個用戶進程。

服務器進程用於處理連接到實例的用戶進程的請求。當用戶建立與數據庫的連接時,即產生服務器進程。服務器進程和用戶進程通信併爲所連接的用戶請求服務。服務器進程直接與Oracle數據庫交互,實現調用和返回結果的目的。服務器進程及可以處理一個用戶進程的請求,也可以處理多個用戶進程的請求。

在Oracle數據庫中,爲了使系統性能更好地協調多個用戶,實例系統中使用的一些附加進程,稱爲後臺進程。這些後臺進程存在於操作系統中,在實例啓動時自動啓動。其中有五個進程是必須要啓動的,否則數據庫實例無法啓動。這五個進程分別是:

(1)PMON(進程監控)進程

PMON進程在用戶連接意外中斷後執行資源清理工作,包括以下任務:

  • 釋放所有當前掛起的鎖;
  • 回滾用戶當前事務處理;
  • 釋放用戶當前使用的資源;
  • 監控服務器進程和其他後臺進程,出現故障時重啓它們;

(2)SMON(系統監控)進程

SMON進程執行以下任務:

  • 在實例啓動時執行實例恢復。實例恢復包括三個步驟:
    (1)前滾以恢復未寫入的數據文件但已記入聯機日誌文件的數據;
    (2)打開數據庫,以便用戶能登錄並訪問數據;
    (3)回滾爲提交的事務處理;
  • 整理數據文件的自由空間;
  • 釋放不再使用的臨時段;

(3)DBWR(數據寫入)進程

DBWR進程執行以下任務:

  • 管理數據緩衝區,以便能找到空閒的緩衝區讀入數據文件的數據;
  • 將所有修改後的緩衝區數據寫入數據文件;
  • 使用LRU算法經最近使用過的塊保留在內存中;
  • 通過延遲寫入優化磁盤I/O讀寫;

(4)LGWR(日誌寫入)進程

LGWR進程負責將重做日誌緩衝區中的日誌數據寫入日誌文件組。數據庫在運行時,如果對數據進行修改,則產生日誌信息,日誌信息首先產生於重做日誌緩衝區中。此緩衝器按照“先進先出”的原則進行操作,當日志信息滿足一定條件是,由LGWR進程將日誌數據寫入日誌文件。系統通常有多個日誌文件,日誌寫入進程以循環的方式將數據寫入文件。

(5)CKPT(檢查點)進程

CKPT進程是確保數據緩衝區中所有修改過的數據塊都寫入數據文件的機制。當檢查點完成後,CKPT進程負責更新數據文件頭和控制文件、保存檢查點信息,以保證數據庫日誌文件和數據文件同步。在數據庫恢復時只需要找到CKPT保存的最後一次檢查點,就可以根據它確定日誌文件中恢復數據的開始位置,然後重新執行其之後的日誌記錄即可。

(6)ARCn進程

ARCn進程即歸檔日誌進程,是一個可選進程,只有在打開日誌歸檔時纔有該進程。該進程的主要作用是發生日誌切換時將寫滿的聯機日誌文件複製到歸檔目錄。

二、CDB與PDB的基本操作

與之前版本的Oracle不同,Oracle 12c可以作爲單個數據庫使用,也可根據企業需要,提供若干個可插拔PDB數據庫。每個PDB可以由不同的DBA維護。

下面簡單介紹一下CDB與PDB的基本維護:

[oracle@oracle ~]$ sqlplus sys as sysdba                          //以sys用戶登錄數據庫

SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:26:41 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

輸入口令: ******
已連接到空閒例程。

SQL> startup;                                    //啓動數據庫
ORACLE 例程已經啓動。

Total System Global Area 2466250752 bytes
Fixed Size          8795760 bytes
Variable Size         671091088 bytes
Database Buffers     1778384896 bytes
Redo Buffers            7979008 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> show  con_name;                   //查詢當前所在的容器

CON_NAME
------------------------------
CDB$ROOT                                      //表示當前在CDB下
SQL> show pdbs;                             //查詢數據庫中的所有容器  

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED           READ ONLY  NO                  //創建PDB數據庫模板                
     3 ORCLPDB            MOUNTED                           //狀態爲mounted(並沒有open)
SQL> alter pluggable database orclpdb open;             //CDB下將可插拔數據庫orclpdb打開
//如果沒有將PDB打開就已經切換到PDB中,可以使用“shutdown immediate”關閉PDB數據庫、“startup”啓動PDB數據庫
插接式數據庫已變更。

SQL> alter session set container=orclpdb;         //CDB下切換會話到PDB中

會話已更改。

SQL> show con_name;                             //再次查看當前位置已經位於orclpdb中

CON_NAME
------------------------------
ORCLPDB
SQL> alter session set container=cdb$root;                        //回到CDB數據庫

會話已更改。

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

以上是從CDB切換到PDB中,反之,一樣。

連接到可插拔數據庫PDB有兩種方法:

  • 第一種方法就是首選登錄到CDB數據庫,再切換到PDB數據庫;
  • 第二種方法就是登錄時直接登錄到PDB數據庫;

第二種是實現方法如下:

[oracle@oracle ~]$ vim /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora 
LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
----------------------------------------------------                  //分界線,以上不需要進行修改
lzj =                                                                          //根據上面的模板,進行編寫,這個名字可以自定義
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb)                                       //這裏需要指定PDB數據庫名稱
    )
  )
[oracle@oracle ~]$ sqlplus sys@lzj as sysdba                       //登錄數據庫時需指定剛纔定義的名稱

SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:48:50 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

輸入口令: ******

連接到: 
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show con_name;                                    //查看進行驗證

CON_NAME
------------------------------
ORCLPDB

三、用戶管理

在創建一個新數據庫時,Oracle將創建一些默認數據庫用戶,比如:SYS、SYSTEM等用戶。

簡單介紹一下Oracle數據庫的用戶:

(1)SYS

SYS用戶是Oracle中的一個超級用戶,主要用來維護系統信息和管理實例。數據庫中所有數據字典和視圖都存儲在SYS模式中。數據字典存儲了用來管理數據庫對象的所有信息,是Oracle數據庫中非常重要的系統信息。SYS用戶只能以SYSOPER或SYSDBA角色登錄數據庫系統。

(2)SYSTEM

SYSTEM用戶是Oracle中默認的數據庫管理員,它擁有DBA權限。該用戶模式中存儲了Oracle管理工具使用的內部表和視圖。通常通過SYSTEM用戶管理Oracle數據庫的用戶、權限和存儲等,不建議在SYSTEM模式中創建用戶表。SYSTEM用戶不能以SYSOPER或SYSDBA角色登錄數據庫系統,只能使用默認方式(數據庫身份驗證的方式)登錄。

(3)自定義用戶

Oracle 12c支持創建自定義用戶,由於PDB的引入,自定義用戶範疇和之前版本有所不同。在CDB模式下,用戶分爲兩種:公用用戶和本地用戶。公用用戶可以在CDB和PDB中使用,而本地用戶只能在PDB中使用。在CDB環境中,不允許創建本地用戶。Oracle規定,在CDB中創建公用用戶是,用戶名必須以c##開頭。

通常情況下,出於安全考慮,對於不同用戶的數據表需要不同的訪問權限,因此,就需要創建不同的用戶。Oracle中的CREATE USER命令用於創建新用戶。每個用戶都有一個默認空間和一個臨時表空間。如果沒有指定,Oracle就將USERS設爲默認表空間,將TEMP設爲臨時表空間。

創建用戶的語法如下:
Oracle體系結構和用戶管理
在語法中:
Oracle體系結構和用戶管理

SQL> create user c##lzj
  2  identified by 123456;                            //創建用戶

用戶已創建。

SQL> alter user c##lzj identified by 654321;     //修改用戶密碼

用戶已更改。

SQL> drop user c##lzj cascade;                 //刪除用戶

用戶已刪除。
//刪除用戶時,不帶 cascade則表示只刪除用戶,帶上 cascade則表示刪除用戶即用戶模式對象

四、數據庫權限管理

權限是執行某種類型的SQL語句揮着存取其他用戶數據庫對象的權利。在Oracle中,權限分爲系統權限和對象權限兩類。

1.系統權限

系統權限是指在數據庫中執行某種系統級別的操作,或者針對某一類的對象執行某種操作的權限。如圖:
Oracle體系結構和用戶管理
常見的系統權限如下:

  • CREATE SESSION:連接到數據庫;
  • CREATE TABLE:創建表;
  • CREATE VIEW:創建視圖;
  • CREATE SEQUENCE:創建序列;

一個新用戶創建完成後,首選要授予其CREATE SESSION權限,使其可以登錄到數據庫。

2.對象權限

對象權限是指針對某個特定的模式對象執行操作的權力。如圖:
Oracle體系結構和用戶管理
Oracle數據庫用戶有兩種獲取權限的途徑:①直接向用戶授予權限;②將權限授予角色,再將角色授予一個或多個用戶。使用角色能夠更加方便和高效地對權限進行管理。所以數據庫管理員通過使用角色向用戶授予權限,而不是直接向用戶授予權限。在Oracle數據庫系統中預定義了很多角色,其中最常用的主要有CONNECT角色、RESOURCE角色、DBA角色等。

Oracle中常用的系統預定義角色如下:

  • CONNECT:擁有連接數據庫的權限;
  • RESOURCE:擁有創建表、觸發器、過程等權限;
  • DBA:數據庫管理員角色,擁有管理數據庫的最高權限;

新創建的用戶必須授予一定的權限纔可對數據庫進行相關的操作。

SQL> grant connect,resource to c##lzj;

授權成功。

SQL> revoke connect,resource from c##lzj;

撤銷成功。

數據庫用戶安全設計原則如下:

  • 數據庫用戶去哪先按照最小分配原則;
  • 數據庫用戶可分爲管理、應用、維護、備份四類用戶;
  • 不允許使用sys和system用戶建立數據庫應用對象;
  • 禁止對普通用戶授予dba權限;
  • 對查詢用戶只能開放查詢權限;
  • 對新建用戶初次登錄數據庫時強制修改密碼;

一般程序開發人員只要授予 connect和resource兩個角色即可。注意:授予這兩個角色就包含了授予用戶無限制使用默認表空間的權限。

在PDB模式下創建用戶lzj,並對其授權,具體操作:

SQL> select name from v$pdbs;                        //查詢所有的可插拔數據庫

NAME
--------------------------------------------------------------------------------
PDB$SEED
ORCLPDB

SQL> alter session set container=orclpdb;                 //切換到可插拔數據庫orclpdb

會話已更改。

SQL> show con_name;                                    //查詢當前所在的數據庫容器

CON_NAME
------------------------------
ORCLPDB

SQL> create user lzj identified by 123456;                //在PDB創建用戶(不需要添加c##)

用戶已創建。

SQL> alter user lzj identified by 654321;                   //修改用戶密碼:

用戶已更改。

SQL> grant connect to lzj;                        //對用戶進行授權

授權成功。

SQL> alter session set container=cdb$root;                      //切換到CDB容器

會話已更改。

SQL> show con_name;                            //查看當前的容器

CON_NAME
------------------------------
CDB$ROOT

五、導入測試數據

在Oracle 12c以前的版本中,安裝完成之後默認會scott用戶,該用戶模式下存放了用於測試的表,而Oracle 12c安裝完成之後默認沒有scott用戶。爲了以後測試方便,下面介紹如何在Oracle 12c中導入測試數據的方法。

下載test.sql腳本,然後執行以下操作:

[oracle@oracle ~]$ ll                       //準備腳本測試文件
總用量 8
-rw-r--r-- 1 oracle oinstall 7658 6月  15 2017 test.sql
[oracle@oracle ~]$ sqlplus / as sysdba                       

SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 17:19:15 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

連接到: 
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> create user c##scott identified by scott default tablespace users temporary tablespace temp quota unlimited on users;
//創建用戶c##scott

用戶已創建。

SQL> grant connect,resource to c##scott;                  //用戶授權

授權成功。

SQL> @test.sql                      //導入腳本文件,不帶路徑表示當前目錄下
…………………………             //創建過程省略
SQL> conn c##scott/scott;                         //切換用戶c##scott
已連接。 
SQL> show user;                               //查看當前用戶
USER 爲 "C##SCOTT"
SQL> col tname for a10;              //格式化輸出,讓一行中顯示所有的列,調整tname列的寬度爲10
SQL> select * from tab;                     //查詢當前用戶下的所有的表

TNAME      TABTYPE        CLUSTERID
---------- --------------------- ----------
BONUS      TABLE
DEPT       TABLE
EMP    TABLE
SALGRADE   TABLE
SQL> desc emp;                            //查詢emp表的結構
 名稱                                    是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 EMPNO                     NOT NULL NUMBER(4)
 ENAME                          VARCHAR2(10)
 JOB                            VARCHAR2(9)
 MGR                            NUMBER(4)
 HIREDATE                       DATE
 SAL                            NUMBER(7,2)
 COMM                           NUMBER(7,2)
 DEPTNO                         NUMBER(2)
SQL> col empno for 9999;              //格式化輸出,empno列爲數字,9999代表寬度爲4
 SQL> select * from emp;                        //根據實際情況,自行修改,怎麼好看怎麼來

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7369 SMITH CLERK       7902 17-12月-80        800                    20
 7499 ALLEN SALES       7698 20-2月 -81       1600        300         30
        MAN

 7521 WARD  SALES       7698 22-2月 -81       1250        500         30
        MAN

 7566 JONES MANAG       7839 02-4月 -81       2975                    20
        ER

 7654 MARTI SALES       7698 28-9月 -81       1250       1400         30

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
      N     MAN

 7698 BLAKE MANAG       7839 01-5月 -81       2850                    30
        ER

 7782 CLARK MANAG       7839 09-6月 -81       2450                    10
        ER

 7788 SCOTT ANALY       7566 19-4月 -87       3000                    20
        ST

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7839 KING  PRESI            17-11月-81       5000                    10
        DENT

 7844 TURNE SALES       7698 08-9月 -81       1500          0         30
      R     MAN

 7876 ADAMS CLERK       7788 23-5月 -87       1100                    20
 7900 JAMES CLERK       7698 03-12月-81        950                    30
 7902 FORD  ANALY       7566 03-12月-81       3000                    20
        ST

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7934 MILLE CLERK       7782 23-1月 -82       1300                    10
      R

已選擇 14 行。
SQL> select * from c##scott.emp;                   //如果使用的是非c##scott用戶,需要指定用戶.表名

———————— 本文至此結束,感謝閱讀 ————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章