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';
-- 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
Connected.
SQL> alter session set container=pdb1;
Session altered.
SQL> grant connect,resource to c##jeanron container=all ;
然後再次登入pdb,看看剛建的表是否還存在。
SQL> conn c##jeanron/oracle@pdb1;
Connected.
SQL> select *from cat;
no rows selected
透過這個小例子就會明白大體的區別了吧。
最後來刪除一下pdb,整個操作類似表空間級的操作。
SQL> alter pluggable database all close;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
檢視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
在上次的基礎上繼續來學習學習。
首先關於多租戶的架構設計來說,就好比在一座已經幾十年的老房子上動地基一般,這個變化著實夠大,如此重大的變化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';
-- 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
Connected.
SQL> alter session set container=pdb1;
Session altered.
SQL> grant connect,resource to c##jeanron container=all ;
然後再次登入pdb,看看剛建的表是否還存在。
SQL> conn c##jeanron/oracle@pdb1;
Connected.
SQL> select *from cat;
no rows selected
透過這個小例子就會明白大體的區別了吧。
最後來刪除一下pdb,整個操作類似表空間級的操作。
SQL> alter pluggable database all close;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
檢視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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-2089581/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 12c PDB淺析Oracle
- Oracle 12c系列(二)|PDB的建立Oracle
- Oracle 12c Relocate PDBOracle
- Oracle 12C -- 使用seed PDB建立新的pdbOracle
- Oracle 12c PDB遷移(一)Oracle
- Oracle 12c系列(六)|Relocate a PDBOracle
- Oracle 12c系列(五)|PDB RefreshOracle
- oracle 12c rman備份pdbOracle
- Oracle 12C RMAN transport tablespace from PDB of RAC CDB to remote PDBOracleREM
- ORACLE 12C pdb受限解決思路Oracle
- ORACLE 12C新特性——CDB與PDBOracle
- oracle 12c使用dblink克隆pdbOracle
- oracle 12c PDB隨CDB啟動和連結PDB的方式Oracle
- Oracle 12c 多租戶 手工建立 pdb 與 手工刪除 pdbOracle
- Oracle 12C RMAN Duplicating Tablespaces Within a PDBOracle
- Oracle 12C RMAN Duplicating the PDB to remote CDBOracleREM
- Oracle 12c CDB&PDB 基本維護Oracle
- Oracle 12c DBCA淺析(r12筆記第48天)Oracle筆記
- Oracle 12c 多租戶在 CDB 中 Plug A PDB,Unplugging A PDBOracle
- Oracle 12c RMAN Cross-Platform Transport of a Closed PDBOracleROSPlatform
- ORACLE 12C PDB 維護基礎介紹Oracle
- Oracle 12c 使用Non-CDB來建立PDBOracle
- Oracle 12C 建立使用者連線pdbOracle
- Oracle 12c PDB中碰到的DG問題Oracle
- Oracle 12c 手工建立 和 刪除 PDB 示例Oracle
- 建立、克隆pdb---oracle 12c 學習(1)Oracle
- oracle的TAF淺析Oracle
- NIO(二)淺析IO模型模型
- 【MySQL】replace into 淺析之二MySql
- 12c pdb基本操作
- Oracle 12c 多租戶 CDB 與 PDB 備份Oracle
- Oracle 12c PDB的資料備份恢復Oracle
- oracle 12c pdb測試:建立、開關、刪除Oracle
- RXSwift原始碼淺析(二)Swift原始碼
- Oracle Xmltype型別淺析OracleXML型別
- 當12C PDB遇上JDBCJDBC
- Oracle 12c系列(七) | Non-CDB轉換為PDBOracle
- pdb的plug、unplug、drop---oracle 12c 學習(2)Oracle