Oracle 12c

不一樣的天空w發表於2017-03-17

Oracle 12C

Oracle 12c 也在雲端的基礎上發展為多租戶架構 新的資料庫讓企業可以在 單一實體機器中部署多個資料庫 ,而且每個資料庫都能以 動態插拔 的方式,在12c多租戶架構下擴充、整合、升級與備份

杜奕鋒認為,12c多租戶雲端架構的概念,是一種類虛擬化技術,沒有真的採用虛擬化技術,而是 像虛擬化使用VM來打包執行環境的概念來設計資料庫,在一個大資料庫之下,由多個小的資料庫組成,這就是所謂的多租戶雲端架構

 目前, 12c 的多租戶架構最多可支援252個資料庫 ,而且資料庫管理員可以把多個資料庫當作一個資料庫來管理,不論升級或備份都可以插拔的方式完成。

Oracle 12C引入了CDB與PDB的新特性,在ORACLE 12C資料庫引入的多租使用者環境(Multitenant Environment)中,允許一個 資料庫容器 (CDB)承載多個 可插拔資料庫 (PDB)。CDB全稱為Container Database,中文翻譯為資料庫容器,PDB全稱為Pluggable Database,即可插拔資料庫。在ORACLE 12C之前,例項與資料庫是一對一或多對一關係(RAC):即一個例項只能與一個資料庫相關聯,資料庫可以被多個例項所載入。而例項與資料庫不可能是一對多的關係。當進入ORACLE 12C後,例項與資料庫可以是一對多的關係。下面是官方文件關於CDB與PDB的關係圖。


其實大家如果對 SQL SERVER 比較熟悉的話,這種CDB與PDB是不是感覺和SQL SERVER的單例項多資料庫架構是一回事呢。像PDB$SEED可以看成是master、msdb等系統資料庫,PDBS可以看成使用者建立的資料庫。而可插拔的概念與SQL SERVER中的使用者資料庫的分離、附加其實就是那麼一回事。看來ORACLE也“抄襲”了一把SQL SERVER的概念,只是改頭換面的包裝了一番。

Oracle 資料庫12c的組成包括三個部分

分別是:

1 最底層的CDB(Container Database)

CDB則是一個後端平臺,讓資料庫管理員可以將多個PDB資料庫當作一個來管理,對於終端使用者來說並沒有任何差異。

當資料庫需要遷移時,拔出的PDB會攜帶自己的資訊與設定,比如修補程式以及加密資訊等,而若需要擴充套件PDB時,則需要另外增加記憶體才能應用。

2 中間層的Root

Root則是用來定義需要共享的後端內容,比如修補程式更新,只需要在Root做一次,在Root之上運作的PDB就可以多個一起完成更新;

3 最上層的PDB(Plugable Database)。

每個PDB都是一個可獨立插拔與管理的資料庫 ;

CDB 元件(Components of a CDB)

一個CDB資料庫容器包含了下面一些元件:

ROOT 元件

ROOT又叫CDB$ROOT, 儲存著ORACLE提供的後設資料和Common User,後設資料的一個例子是ORACLE提供的PL/SQL包的原始碼,Common User 是指在每個容器中都存在的使用者。

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SEED 元件

  Seed又叫PDB$SEED,這個是你建立PDBS資料庫的模板,你不能在Seed中新增或修改一個物件。一個CDB中有且只能有一個Seed. 這個感念,個人感覺非常類似SQL SERVER中的model資料庫。

SQL> show pdbs

    CON_ID CON_NAME            OPEN MODE  RESTRICTED

---------- -----------------------------------      ----------

         2 PDB$SEED                 READ ONLY  NO

         3 PDBORCL                  READ WRITE NO

PDBS

    CDB中可以有一個或多個PDBS,PDBS向後相容,可以像以前在資料庫中那樣操作PDBS,這裡指大多數常規操作。

這些元件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。

1 )連線到CDB資料庫

連線到CDB資料庫容器非常簡單,跟以前連線資料庫是一樣的

[oracle@chen12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Tue May 12 18:37:11 2015

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

2 )檢視資料庫是否為CDB

SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;

NAME      Multitenant Option         OPEN_MODE                CON_ID

---------       --------------------------      --------------------              ----------

ORCL      Multitenant Option enabled     READ WRITE                  0

 

SQL> select cdb from v$database;

CDB

---

YES

3 )檢視當前容器(Container)

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select sys_context('userenv','con_name') "Container DB" from dual;

Container DB

--------------------------------------------------------------------------------

CDB$ROOT

4 )檢視CDB容器中的PDBS資訊

檢視CDB中有多少個pluggable database

資料庫起來後,預設PDB為mount狀態

SQL> set linesize 200

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID   DBID     NAME     OPEN_MODE

---------- ----------  --------      ----------

         2  790056509  PDB$SEED   READ ONLY

         3 2636272535  PDBORCL    MOUNTED

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        READ WRITE NO

5 )啟動PDB資料庫

方式1:

開啟pdb資料庫

SQL> alter pluggable database pdborcl open;

Pluggable database altered.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

    CON_ID       DBID NAME     OPEN_MODE

---------- ---------- -------- ----------

         2  790056509 PDB$SEED READ ONLY

         3 2636272535 PDBORCL  READ WRITE

方式2:

SQL> select con_id,dbid,name,open_mode from v$pdbs;

    CON_ID       DBID   NAME     OPEN_MODE

---------     ----------  --------   ----------

         2  790056509 PDB$SEED READ ONLY

         3 2636272535 PDBORCL  MOUNTED

進入pdb資料庫

SQL> alter session set container=pdborcl;

Session altered.

SQL> startup

Pluggable Database opened.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

   CON_ID      DBID   NAME  OPEN_MODE

----------     ---------- -------- ----------

     3     2636272535 PDBORCL  READ WRITE

6 )關閉PDB資料庫

SQL> alter pluggable database pdborcl close;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME     OPEN_MODE

--------      ----------

PDBORCL  MOUNTED

7 )在容器間切換

SQL> show con_name

CON_NAME

------------------------------

PDBORCL

SQL> alter session set container=cdb$root;

Session altered.

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        MOUNTED

SQL> alter session set container=chen ;

ERROR:

ORA-65011: Pluggable database CHEN does not exist.

SQL> alter session set container=pdborcl;

Session altered.

SQL> show con_name

CON_NAME

------------------------------

PDBORCL

建立使用者

1 切換到容器資料庫

SQL> alter session set container=cdb$root;

Session altered.

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

---------------- ------------

orcl             OPEN

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        MOUNTED

2 建立使用者(容器資料庫)

SQL> create user chen identified by chen;

create user chen identified by chen

            *

ERROR at line 1:

ORA-65096: invalid common user or role name

SQL> ! oerr ora 65096

65096, 00000, "invalid common user or role name"

// *Cause:  An attempt was made to create a common user or role with a name

//          that was not valid for common users or roles.  In addition to

//          the usual rules for user and role names, common user and role

//          names must start with C## or c## and consist only of ASCII

//          characters.

// *Action: Specify a valid common user or role name.

//

錯誤資訊的解析非常明確地告知“試圖建立一個通用使用者,必需要用C##或者c##開頭”

SQL> create user c##chen identified by chen default tablespace users;

User created.

SQL> grant dba to c##chen;

Grant succeeded.

SQL> select username from dba_users where username='C##CHEN';

USERNAME

----------

C##CHEN

SQL> conn c##chen/chen

Connected.

SQL> create table t1(id number);

Table created.

SQL> declare

  2  begin

  3  for i in 1..10 loop

  4  insert into t1 values(i);

  5  end loop;

  6  end;

  7  /

PL/SQL procedure successfully completed.

SQL> show user

USER is "C##CHEN"

建立使用者(可插拔資料庫)

[oracle@chen12c ~]$ cd /u01/app/oracle/product/12.1.0/network/admin/


[oracle@chen12c admin]$ vim tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

ORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

    )

  )

PDBORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = pdborcl)

    )

  )


[oracle@chen12c admin]$ tnsping pdborcl

TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 12-MAY-2015 18:21:31

Copyright (c) 1997, 2014, Oracle.  All rights reserved.

Used parameter files:

/u01/app/oracle/product/12.1.0/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdborcl)))

OK (0 msec)

--啟動關閉PDB  

--pdb的管理可以在cdb中進行也可以在pdb中進行,  

--如果是cdb中進行,需要PLUGGABLE關鍵字(如下alter),  

--如果是pdb中直接和普通資料庫一樣(startup/shutdown immediate)  

--開啟單個pdb  

alter  pluggable  database  pdborcl  open ;  

--開啟所有pdb  

alter  pluggable  database  all  open ;  

--關閉所有pdb  

alter  pluggable  database  all  close  immediate;    

--進入pdb  

alter  session  set  container=pdborcl;  

--//  

conn sys/sys@localhost:1521/pdborcl  as  sysdba;  

[oracle@chen12c admin]$ sqlplus sys/oracle@pdborcl as sysdba

--進入cdb  

alter  session  set  container=cdb$root;  

--//  

conn /  as  sysdba;  

--建立使用者  

--建立使用者預設的是container=all,在cdb中只能建立全域性使用者(c##開頭),  

--會在cdb和所有的pdb中建立該使用者(但是pdb中的全域性使用者需要另外授權才能夠在pdb中訪問)。  

--在pdb中只能建立的使用者為本地使用者  

--建立全域性使用者  

create  user c##xff identified  by  xifenfei;   

--建立本地使用者  

alter  session  set  container=pdborcl;  

create  user xxx identified  by  123;    

--使用者授權  

--使用者授權預設情況下是隻會給當前container,在cdb中也可以指定container=all,對所有open的pdb且存在該使用者都進行授權  

grant   connect   to  c##xff;  

grant  resource  to  c##xff container=all    

--修改引數  

--在cdb中修改,pdb會繼承進去;如果在pdb中修改會覆蓋pdb從cdb中繼承的引數含義  

  alter  system  set  open_cursors=500 container=all;  

 show parameter open_cursors;  

  alter  session  set  container=pdborcl;  

 show parameter open_cursors;  

 --//  

  alter  system  set  open_cursors=100;  

 show parameter open_cursors;  

 conn /  as  sysdba  

 show parameter open_cursors;  

參考:

http://www.cnblogs.com/kerrycode/p/3386917.html

http://blog.csdn.net/zzvnzz/article/details/24840541

http://blog.itpub.net/11954956/viewspace-1079297/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2135508/,如需轉載,請註明出處,否則將追究法律責任。

相關文章