1. 程式人生 > >淺談Oracle12c 數據庫、用戶、CDB與PDB之間的關系

淺談Oracle12c 數據庫、用戶、CDB與PDB之間的關系

所有 bing 名詞 1.0 容器 ner 們的 roo val

名詞介紹:

數據庫:數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生 於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以 後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管 理的方式。
C D B:CDB全稱為Container Database,中文翻譯為容器數據庫。
P D B:PDB全稱為Pluggable Database,中文翻譯為可插拔數據庫。

首先,我來談一下數據庫、user和schema之間的關系。在我看,數據庫就像是含有好多小房間的一個大大的倉庫,然後我們把這個大倉庫分了好幾塊,這就是schema。分出來的小倉庫得有人管理啊,管理的就叫做user。當然了,用戶可以在這些小倉庫內放置許多許多的貨物,這個貨物就是表和數據。至於很多人不懂user和schema之間的區別,我在此引用網上的一段話來解釋下他們之間的關系:
“user即Oracle中 的用戶,和所有系統的中用戶概念類似,用戶所持有的是系統的權限及資源;而schema所涵蓋的是各種對象,它包含了表、函數、包等等對象的“所在地”, 並不包括對他們的權限控制。好比一個房子,裏面放滿了家具,對這些家具有支配權的是房子的主人(user),而不是房子(schema)。你可以也是一個 房子的主人(user),擁有自己的房子(schema).可以通過alter session的方式進入別人的房子。如果你沒有特別指定的話,你所做的操作都是針對你當前所在房子中的東西。至於你是否有權限使用(select)、搬 動(update)或者拿走(delete)這些家具就看這個房子的主人有沒有給你這樣的權限了,或者你是整個大廈(DB)的老大(DBA)。alter session set schema可以用來代替synonyms。如果你想調用其他schema的對象(有權限的前提下),但並沒有建synonym,同時又不想把其他 schema名字放入代碼中,就可以首先使用alter session set schema=<其他schema名字>。”
這段話形象的闡釋了user和schema的區別和聯系。
下面我再談一下12c與之前的版本中的區別,那麽大家來猜猜最“Strongly”的區別是什麽呢。Bingo,就是pdb和cdb概念的引入。
這裏引用一下Oracle12c新特性的文檔中的一張圖來更方便的解釋CDB和PDB的關系。

CDB都有什麽組成部分呢。其實通過上圖我們可以清楚的看到:
1、ROOT:root,又名CDB$ROOT,用來存儲Oracle提供的metadata和common user 的。metadata的一個例子是Oracle提供的PL/SQL包的源代碼。Common user 指的是一個所有容器都知道的數據庫用戶(註意,當我們想在數據庫中創建 用戶的時候,一般是不能往ROOT中創建的。我們需要先通過語句alter session set container = PDB’s name 轉換到相應名稱的PDB下再創建用戶, 要想詳細了解關於common user 和 local user 的區別的話,請參考Oracle 官方文檔《Oracle Database Security Guide》)。 一個CDB只能有一個根。
2、SEED:seed,又名PDB$SEED,是用來創建新的PDB的模版。但是,你不能在seed 裏添加或者修改對象,一個CDB只能有一個SEED。
3、PDB:PDB展現給用戶和應用的形象就像是一個沒有CDB的普通數據庫一樣。例 如,一個PDB可以包括支持一個特定應用程序所需的所有數據和代碼。PDB 完全向後兼容Oracle12c之前版本的所有數據庫。
以上的每個組成部分都被稱為容器(container),ROOT、SEED、PDB都是容器。而這些容器在CDB中都有他們自己唯一的容器ID和名稱。我們可以很輕松的向CDB中插入一個PDB或者從CDB中拔出一個PDB。當我們將一個PDB插入CDB中時,相當於將這個PDB與CDB連接起來。反之則解除關系。
什麽?你問我Oracle為什麽這麽幹,這令你感到麻煩並且困擾。那麽,我告訴你。這其實大大方便了數據的遷移。我們可以很方便的將一個特定的PDB從一個CDB挪到另一個CDB上面而不改變裏面的任何數據和架構。這難道不是很wonderful嗎?當然,一個PDB只能在同一時間內插入一個CDB而不是多個。每一個PDB都有自己獨一無二的全局唯一標識符(GUID)來預防PDB的錯亂使用。

實戰::::
plsql相關
使用sql developer ,同連接cdb一樣,只是選擇“服務名”,然後服務名處填寫“pdborcl”,即可。
使用sqlplus, conn sys/passwd@//localhost:1521/pdborcl as sysdba。

java開發連接Oracle 12c采用PDB遇到問題記錄
今天初次使用java連接Oracle 12c,遇到各種問題,為方便後續查詢,在匯總了問題記錄及解決方案如下。

ORA-28040: No matching authentication protocol

需要在 ...\product\12.1.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora

文件中加入

SQLNET.ALLOWED_LOGON_VERSION=8

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

SID應該是存在的id才可以。java連接Oracle 12c時,無法識別格式不正確的SID,應該跟下面的問題一樣處理。

ORA-01017: invalid username/password; logon denied

在pdb模式下,連接串應該是這種格式

jdbc:oracle:thin:@localhost:1521/pdborcl

類似後面是冒號,或者locahost前加//的,都無法正常使用。

alter session set container = pdborcl;

淺談Oracle12c 數據庫、用戶、CDB與PDB之間的關系