Oracle 12c PDB淺析

來源:互聯網
上載者:User

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學習的開始,也希望繼續總結,把這些地方要不斷練習,要做資料移轉的好手。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.