Oracle 12c PDB淺析
不管怎麼樣,12c出來這麼久,總是因為各種各樣的原因沒有開始學習,現在似乎還是有些晚了。總是耳聞PDB在12c是一種全新的架構模式,在各種技術聊天也大概知道是一種可插撥的新型架構模式,但是似乎SQLServer中也有類似的架構,不管怎麼樣Oracle圈內還是很火,而且聽說12c r2可以支援4096個pdb,這個也太大了,docker裝一下試試:)
自己也在本地嘗試了一下,其實中間了花了些時間,中途總是被各種事情打斷,所以留下的都是一些零碎的知識片段,自己索引把環境重新刪了再做幾次。
在這種嘗試中我試了兩種學習方法,第一種是壓根不看官方文件,純是憑著感覺做,碰到問題查google,百度,metalink來做,最後也勉強出了點成果,但是總體感覺有些問題的解決不是常規思路,月解決離本身的學習好像偏差越大。最後竟然還有改到隱含引數,我覺得對於初入門的學習來說,還是很不可取的,所以儘管勉強出了點東西,但是我的感覺是這種學習方法不繫統不全面,很容易被各種攻略來影響,還是不推薦的。
然後中間隔了一天,今天再來準備抽一個小時左右來學習一下,發現官方文件著實要詳細的多,而且介紹的系統性,更全面,很多部落格中的圖也基本都是官網中的,所以說自己學習的時候就會方便一些,照著做出錯的機率要小,不會很折騰。
不過文件我也是選看,我整理了一下我掌握的資訊,做一個簡單的總結。
這個圖是官方的,我覺得實在弄不出比這個更好的圖了,直接貼出來。這個裡面的CDB就是容器,PDB就是外掛資料庫,hrpdb,salespdb都有對應的PDBA來管理,綜合的管理由CDB管理員來負責。Root是儲存了容器的基本模板,而seed則是提供了一套模板機制。可以基於seed模板來建立對應的PDB,我要演示的也是這個方法。
首先我們建立一個12c的資料庫自帶pluggable database,還是選用dbca silent方式來做,一個命令直接搞定。
這種方式和10g,11g的主要差別就是有一個建立CDB的選項。
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname newtest -sid newtest -characterSet UTF8 -createAsContainerDatabase true -sysPassword oracle -systemPassword oracle
Copying database files
1% complete
3% complete
11% complete
18% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
46% complete
47% complete
52% complete
57% complete
58% complete
59% complete
62% complete
Completing Database Creation
66% complete
70% complete
74% complete
85% complete
96% complete
100% complete
建立完成之後我們就開始來了解一下CDB,PDB的一些簡單操作。
首先來個二連發,看看容器id和容器name
sqlplus / as sysdba
SQL> show con_id con_name
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/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/users01.dbf
切換到seed,檢視容器的id和name
SQL> alter session set container=pdb$seed;
Session altered.
SQL> show con_id con_name
CON_ID
------------------------------
2
CON_NAME
------------------------------
PDB$SEED
檢視資料檔案,這個時候可以看出其實root和seed都會有獨立的system表空間。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/pdbseed/system01.dbf
/U01/app/oracle/oradata/newtest/pdbseed/sysaux01.dbf
當然想得到更清晰的pdb概覽資訊,可以使用show pdbs
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
我們再用sysdba登入,如果存在多個pdb,show pdbs顯示的結果會更多。目前還沒有建立PDB,只有seed一個
SQL> conn / as sysdba
Connected.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
我們來建立一個新的PDB,使用基於seed來建立的方式。
預設建立PDB的時候,如果不指定檔案的對映關係,會有下面的問題,我們可以省事先用OMF來做。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specified
SQL>alter system set db_create_file_dest='/U01/app/oracle/oradata/newtest';
System altered.
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.
啟動一下新的pdb
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
這個時候再次檢視就是兩條記錄了。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
如果檢視更多的角色,可以發現其實DBA相關的角色新增了不少,其中就有PDB_DBA這麼一個角色。
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA%';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
XDBADMIN
OLAP_DBA
LBAC_DBA
6 rows selected.
1* ALTER SESSION SET CONTAINER=PDB$SEED
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
OLAP_DBA
LBAC_DBA
建立了之後,我們來看看怎麼刪除PDB
刪除pdb
SQL> alter session set container=pdb1;
Session altered.
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_system_c3pwol80_.dbf
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_sysaux_c3pwol8c_.dbf
開始刪除。
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database
不能在當前的使用者下刪除,現在也沒有CDB管理員,就用sysdba來刪除。
SQL> conn / as sysdba
Connected.
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65025: Pluggable database PDB1 is not closed on all instances.
想要刪除先得close
SQL> alter pluggable database pdb1 close;
Pluggable database altered.
close之後就可以放心刪除了
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
我們現在來看看CDB的管理員怎麼建立
SQL> create user c##cdbadmin identified by oracle default tablespace users temporary tablespace temp;
User created.
賦予DBA許可權。
SQL> grant dba to c##cdbadmin;
Grant succeeded.
這個時候嘗試連線就可以了,當然CDB的管理員名稱就是c##開頭,就是這麼規定。
SQL> conn c##cdbadmin/oracle
Connected.
SQL> show pdbs
SP2-0382: The SHOW PDBS command is not available
再次建立PDB,可能有朋友想怎麼又開始說PDB建立了,賣個關子,因為有個問題還是值得一說的。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.
SQL>conn / as sysba
SQL> alter session set container=pdb1;
Session altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 MOUNTED
來換個寫法啟動一下,這個時候就有問題了,剛剛還是可以的,怎麼現在修不行了,和語法沒關係。
SQL> startup
Warning: PDB altered with errors.
Pluggable Database opened.
但是檢視PDB的狀態是沒有問題的。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE YES
SQL> conn / as sysdba
Connected.
可以透過下面的方式來分析錯誤。
SQL> select message,time from pdb_plug_in_violations;
MESSAGE
--------------------------------------------------------------------------------
TIME
---------------------------------------------------------------------------
Sync PDB failed with ORA-959 during ' create user c##cdbadmin identified by * d
efault tablespace users temporary tablespace temp container = all'
05-NOV-15 11.30.37.118745 PM
如果對於ora-959還有疑問,就使用oerr來看一下
SQL> !oerr ora 00959
00959, 00000, "tablespace '%s' does not exist"
// *Cause:
// *Action:
這樣問題就一目瞭然了。因為目前沒有uers的表空間
alter session set container=pdb1;
建立一個即可。
SQL> create tablespace users datafile '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf' size 20M;
Tablespace created.
再次shutdown和startup就沒有任何問題了。
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
這些都是PDB學習的開始,也希望繼續總結,把這些地方要不斷練習,要做資料遷移的好手。
自己也在本地嘗試了一下,其實中間了花了些時間,中途總是被各種事情打斷,所以留下的都是一些零碎的知識片段,自己索引把環境重新刪了再做幾次。
在這種嘗試中我試了兩種學習方法,第一種是壓根不看官方文件,純是憑著感覺做,碰到問題查google,百度,metalink來做,最後也勉強出了點成果,但是總體感覺有些問題的解決不是常規思路,月解決離本身的學習好像偏差越大。最後竟然還有改到隱含引數,我覺得對於初入門的學習來說,還是很不可取的,所以儘管勉強出了點東西,但是我的感覺是這種學習方法不繫統不全面,很容易被各種攻略來影響,還是不推薦的。
然後中間隔了一天,今天再來準備抽一個小時左右來學習一下,發現官方文件著實要詳細的多,而且介紹的系統性,更全面,很多部落格中的圖也基本都是官網中的,所以說自己學習的時候就會方便一些,照著做出錯的機率要小,不會很折騰。
不過文件我也是選看,我整理了一下我掌握的資訊,做一個簡單的總結。
這個圖是官方的,我覺得實在弄不出比這個更好的圖了,直接貼出來。這個裡面的CDB就是容器,PDB就是外掛資料庫,hrpdb,salespdb都有對應的PDBA來管理,綜合的管理由CDB管理員來負責。Root是儲存了容器的基本模板,而seed則是提供了一套模板機制。可以基於seed模板來建立對應的PDB,我要演示的也是這個方法。
首先我們建立一個12c的資料庫自帶pluggable database,還是選用dbca silent方式來做,一個命令直接搞定。
這種方式和10g,11g的主要差別就是有一個建立CDB的選項。
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname newtest -sid newtest -characterSet UTF8 -createAsContainerDatabase true -sysPassword oracle -systemPassword oracle
Copying database files
1% complete
3% complete
11% complete
18% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
46% complete
47% complete
52% complete
57% complete
58% complete
59% complete
62% complete
Completing Database Creation
66% complete
70% complete
74% complete
85% complete
96% complete
100% complete
建立完成之後我們就開始來了解一下CDB,PDB的一些簡單操作。
首先來個二連發,看看容器id和容器name
sqlplus / as sysdba
SQL> show con_id con_name
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/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/users01.dbf
切換到seed,檢視容器的id和name
SQL> alter session set container=pdb$seed;
Session altered.
SQL> show con_id con_name
CON_ID
------------------------------
2
CON_NAME
------------------------------
PDB$SEED
檢視資料檔案,這個時候可以看出其實root和seed都會有獨立的system表空間。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/pdbseed/system01.dbf
/U01/app/oracle/oradata/newtest/pdbseed/sysaux01.dbf
當然想得到更清晰的pdb概覽資訊,可以使用show pdbs
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
我們再用sysdba登入,如果存在多個pdb,show pdbs顯示的結果會更多。目前還沒有建立PDB,只有seed一個
SQL> conn / as sysdba
Connected.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
我們來建立一個新的PDB,使用基於seed來建立的方式。
預設建立PDB的時候,如果不指定檔案的對映關係,會有下面的問題,我們可以省事先用OMF來做。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specified
SQL>alter system set db_create_file_dest='/U01/app/oracle/oradata/newtest';
System altered.
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.
啟動一下新的pdb
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
這個時候再次檢視就是兩條記錄了。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
如果檢視更多的角色,可以發現其實DBA相關的角色新增了不少,其中就有PDB_DBA這麼一個角色。
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA%';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
XDBADMIN
OLAP_DBA
LBAC_DBA
6 rows selected.
1* ALTER SESSION SET CONTAINER=PDB$SEED
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
OLAP_DBA
LBAC_DBA
建立了之後,我們來看看怎麼刪除PDB
刪除pdb
SQL> alter session set container=pdb1;
Session altered.
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_system_c3pwol80_.dbf
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_sysaux_c3pwol8c_.dbf
開始刪除。
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database
不能在當前的使用者下刪除,現在也沒有CDB管理員,就用sysdba來刪除。
SQL> conn / as sysdba
Connected.
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65025: Pluggable database PDB1 is not closed on all instances.
想要刪除先得close
SQL> alter pluggable database pdb1 close;
Pluggable database altered.
close之後就可以放心刪除了
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
我們現在來看看CDB的管理員怎麼建立
SQL> create user c##cdbadmin identified by oracle default tablespace users temporary tablespace temp;
User created.
賦予DBA許可權。
SQL> grant dba to c##cdbadmin;
Grant succeeded.
這個時候嘗試連線就可以了,當然CDB的管理員名稱就是c##開頭,就是這麼規定。
SQL> conn c##cdbadmin/oracle
Connected.
SQL> show pdbs
SP2-0382: The SHOW PDBS command is not available
再次建立PDB,可能有朋友想怎麼又開始說PDB建立了,賣個關子,因為有個問題還是值得一說的。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.
SQL>conn / as sysba
SQL> alter session set container=pdb1;
Session altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 MOUNTED
來換個寫法啟動一下,這個時候就有問題了,剛剛還是可以的,怎麼現在修不行了,和語法沒關係。
SQL> startup
Warning: PDB altered with errors.
Pluggable Database opened.
但是檢視PDB的狀態是沒有問題的。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE YES
SQL> conn / as sysdba
Connected.
可以透過下面的方式來分析錯誤。
SQL> select message,time from pdb_plug_in_violations;
MESSAGE
--------------------------------------------------------------------------------
TIME
---------------------------------------------------------------------------
Sync PDB failed with ORA-959 during ' create user c##cdbadmin identified by * d
efault tablespace users temporary tablespace temp container = all'
05-NOV-15 11.30.37.118745 PM
如果對於ora-959還有疑問,就使用oerr來看一下
SQL> !oerr ora 00959
00959, 00000, "tablespace '%s' does not exist"
// *Cause:
// *Action:
這樣問題就一目瞭然了。因為目前沒有uers的表空間
alter session set container=pdb1;
建立一個即可。
SQL> create tablespace users datafile '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf' size 20M;
Tablespace created.
再次shutdown和startup就沒有任何問題了。
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
這些都是PDB學習的開始,也希望繼續總結,把這些地方要不斷練習,要做資料遷移的好手。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1823792/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 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系列(二)|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
- 12c pdb基本操作
- Oracle 12c 多租戶 CDB 與 PDB 備份Oracle
- Oracle 12c PDB的資料備份恢復Oracle
- oracle 12c pdb測試:建立、開關、刪除Oracle
- Oracle Xmltype型別淺析OracleXML型別
- 當12C PDB遇上JDBCJDBC
- Oracle 12c系列(七) | Non-CDB轉換為PDBOracle
- pdb的plug、unplug、drop---oracle 12c 學習(2)Oracle
- oracle 12c 多租戶 pdb 恢復(單個pdb資料檔案、非系統pdb表空間、整個pdb資料庫)Oracle資料庫
- 【ASK_ORACLE】Oracle 12c之CDB與PDB的備份與恢復(一)什麼是CDB與PDB?Oracle
- ORACLE關閉過程淺析Oracle