今天將備份的數據庫還原到一台新的電腦上,首先要創建用戶,執行如下語句:
create user fxhy identified by "123456" default tablespace USERS temporary tablespace TEMP;
結果出現了一個錯誤:
我們可以看出提示的是:公共用戶名或角色無效。這時候我就郁悶了,呃,查資料,發現創建用戶的時候要以c##開頭,也就是剛才的創建語句應該這么寫:
create user c##fxhy identified by "123456" default tablespace USERS temporary tablespace TEMP;
就這樣試了一下,果真創建成功了,可是為什么要這么做,有些不明白,然后繼續查資料,原因是這樣的:
Oracle 12C引入了CDB與PDB的新特性,在ORACLE 12C數據庫引入的多租用戶環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。CDB全稱為Container Database,中文翻譯為數據庫容器,PDB全稱為Pluggable Database,即可插拔數據庫。在ORACLE 12C之前,實例與數據庫是一對一或多對一關系(RAC):即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。而實例與數據庫不可能是一對多的關系。當進入ORACLE 12C后,實例與數據庫可以是一對多的關系。下面是官方文檔關於CDB與PDB的關系圖。
CDB組件(Components of a CDB)
一個CDB數據庫容器包含了下面一些組件:
ROOT組件
ROOT又叫CDB$ROOT, 存儲着ORACLE提供的元數據和Common User,元數據的一個例子是ORACLE提供的PL/SQL包的源代碼,Common User 是指在每個容器中都存在的用戶。
SEED組件
Seed又叫PDB$SEED,這個是你創建PDBS數據庫的模板,你不能在Seed中添加或修改一個對象。一個CDB中有且只能有一個Seed. 這個感念,個人感覺非常類似SQL SERVER中的model數據庫。
PDBS
CDB中可以有一個或多個PDBS,PDBS向后兼容,可以像以前在數據庫中那樣操作PDBS,這里指大多數常規操作。
這些組件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。
怎么查看數據庫是否為CDB?
執行下面這條語句:
select CDB from v$database;
如果得到的結果為YES,那么就是CDB的數據庫,否則,則不是。
怎么查看當前的容器?
執行下面這條語句:
show con_name;
執行結果如下:
怎么查看CDB中的PDB信息?
執行下面這條語句:
select con_id, dbid, guid, name , open_mode from v$pdbs;
執行結果如下:
啟動PDB數據庫的方式:
執行下面這條語句:
alter pluggable database PDBORCL open;
執行結果如下:
關閉PDB數據庫的方式:
執行下面這條語句:
alter pluggable database PDBORCL close;
執行結果如下:
在容器間切換:
alter session set container=PDBORCL; alter session set container=CDB$ROOT;
--------------------------------------------------------------分割線------------------------------------------------------------------------
那么說了這么多,怎么就可以創建用戶而不用加c##了呢,我在這里創建一個新的數據庫,步驟如下:
打開 Database Configuration Assistant
出現如下界面:
點擊“下一步”出現如下界面,在創建數據庫的時候將“創建為容器數據庫”項取消勾選。
這樣新創建的數據庫就可以使用了。