天天看點

Oracle 12c PDB淺析(二)

之前寫了第一篇Oracle 12c PDB淺析 http://blog.itpub.net/23718752/viewspace-1823792/?         

在上次的基礎上繼續來學習學習。

    首先關于多租戶的架構設計來說,就好比在一座已經幾十年的老房子上動地基一般,這個變化着實夠大,如此重大的變化Oracle不遺餘力的想引入進來,肯定有更深層次的原因,當然關于這種設計在SQLServer中确實已經早有實作,在Oracle中卻被大家相傳為一種略帶神奇的架構設計。不過話說回來,這個和Oracle堅定不移的雲戰略是息息相關的。

   在這種設計中,PDB作為可插拔的資料庫,多個PDB會擁有自己獨立的system表空間,temp表空間,但是redo,conrolfile,undo都是共享的。

還是先花點時間是說明一下環境。

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

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

newtest                         Multitenant Option enabled     READ WRITE      0

檢視PDB

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

    CON_ID       DBID GUID                             NAME                           OPEN_MODE

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

         2 2188059502 23CD335E7F55687CE0532F857F0A714A PDB$SEED                       READ ONLY

         3 4013429668 23CDBE4149E16F08E0532F857F0A58E3 PDB1                           READ WRITE

或者使用快捷方式

SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 PDB1                           READ WRITE NO

然後我們生成控制檔案的trace,來看看和早期版本有什麼差别。

alter database backup controlefile to trace 之後,在trace目錄下得到的檔案内容如下:

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "NEWTEST" RESETLOGS  NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 1024

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 '/U01/app/oracle/oradata/newtest/redo01.log'  SIZE 50M BLOCKSIZE 512,

  GROUP 2 '/U01/app/oracle/oradata/newtest/redo02.log'  SIZE 50M BLOCKSIZE 512,

  GROUP 3 '/U01/app/oracle/oradata/newtest/redo03.log'  SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

  '/U01/app/oracle/oradata/newtest/system01.dbf',

  '/U01/app/oracle/oradata/newtest/sysaux01.dbf',

  '/U01/app/oracle/oradata/newtest/undotbs01.dbf',

  '/U01/app/oracle/oradata/newtest/pdbseed/system01.dbf',

  '/U01/app/oracle/oradata/newtest/users01.dbf',

  '/U01/app/oracle/oradata/newtest/pdbseed/sysaux01.dbf',

  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_system_c3px88q0_.dbf',

  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_sysaux_c3px88q1_.dbf',

  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf'

CHARACTER SET UTF8

;

從這部分日志可以看出,這個PDB是采用了omf的方式建立的,産生的一個GUID會預設作為對應的PDB目錄名稱。每個PDB中都有獨立的系統表空間system,sysaux

下面是控制檔案中的附加日志

-- Commands to re-create incarnation table

-- Below log names MUST be changed to existing filenames on

-- disk. Any one log file from each branch can be used to

-- re-create incarnation records.

-- ALTER DATABASE REGISTER LOGFILE '/U01/app/oracle/fast_recovery_area/NEWTEST/archivelog/2016_03_05/o1_mf_1_1_%u_.arc';

-- Recovery is required if any of the datafiles are restored backups,

-- or if the last shutdown was not normal or immediate.

RECOVER DATABASE USING BACKUP CONTROLFILE

-- Database can now be opened zeroing the online logs.

ALTER DATABASE OPEN RESETLOGS;

-- Open all the PDBs.

ALTER PLUGGABLE DATABASE ALL OPEN;

-- Commands to add tempfiles to temporary tablespaces.

-- Online tempfiles have complete space information.

-- Other tempfiles may require adjustment.

ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/temp01.dbf'

     SIZE 206569472  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER SESSION SET CONTAINER = PDB$SEED;

ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/pdbseed/pdbseed_temp012015-11-05_10-47-05-PM.dbf'

     SIZE 104857600  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER SESSION SET CONTAINER = PDB1;

ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_temp_c3px88q2_.dbf'

     SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER SESSION SET CONTAINER = CDB$ROOT;

-- End of tempfile additions.

可以看到在重建控制檔案的時候,會自動建立臨時表空間,都是彼此獨立的。

如果我們使用sqlplus / as sysdba登入之後,預設接入的就是cdb的環境。

是以我們如果嘗試建立一個普通使用者,就會抛出下面的問題。

SQL> create user test identified by test

  2  ;

create user test identified by test

            *

ERROR at line 1:

ORA-65096: invalid common user or role name

這個時候需要用c##的格式來建立使用者,這個時候,CDB的使用者和PDB的使用者的一個最大不同,就是CDB的是一個共有的使用者,在PDB中依舊可見,但是在PDB中具體的權限會有所不同。

SQL> create user c##jeanron identified by oracle;

User created.

如果檢視角色的資訊,會發現存在PDB_DBA,CDB_DBA,但是細看對應的權限,權限也着實少的可憐,和角色DBA完全不在一個級别啊。

SQL> SElect *from dba_sys_privs where grantee='CDB_DBA';

GRANTEE PRIVILEGE                                ADM COM

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

CDB_DBA SET CONTAINER                            NO  YES

可以把這個權限付給c##jeanron

SQL> grant cdb_dba to c##jeanron;

Grant succeeded.

當然使用cdb的使用者可以正常連接配接到執行個體

conn c##jeanron/oracle

Connected.

SQL> show con_id con_name

CON_ID

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

1

CON_NAME

CDB$ROOT

我們在cdb的使用者下建立一個表作為标記。

SQL> create table cdb_test as select * from cat;

Table created.

SQL> select *from cat;

TABLE_NAME                     TABLE_TYPE

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

CDB_TEST                       TABLE

然後使用同樣的使用者登入PDB1,就胡抛出下面的錯誤。

SQL> conn c##jeanron/oracle@pdb1

ERROR:

ORA-01045: user C##JEANRON lacks CREATE SESSION privilege; logon denied

這個例子就充分說明了,這些權限資訊對于PDB而言都是需要重新來初始化的。但是如果有大量的PDB容器,可以指定container的方式。

SQL> conn / as sysdba

SQL> alter session set container=pdb1;

Session altered.

SQL> grant connect,resource to c##jeanron container=all ;

然後再次登入pdb,看看剛建的表是否還存在。

SQL> conn c##jeanron/oracle@pdb1;

no rows selected

通過這個小例子就會明白大體的差別了吧。

最後來删除一下pdb,整個操作類似表空間級的操作。

SQL> alter pluggable database all close;

Pluggable database altered.

         3 PDB1                           MOUNTED

SQL> drop pluggable database pdb1 including  datafiles;

Pluggable database dropped.

檢視alert日志會發現,檔案是确确實實删掉了。

drop pluggable database pdb1 including  datafiles

Sat Mar 05 20:57:56 2016

Deleted file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf

Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_temp_c3px88q2_.dbf

Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_sysaux_c3px88q1_.dbf

Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_system_c3px88q0_.dbf

Completed: drop pluggable database pdb1 including  datafiles