Oracle 12c PDB淺析
不管怎麼樣,Oracle 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學習的開始,也希望繼續總結,把這些地方要不斷練習,要做資料移轉的好手。