先說遇到問題:
創建用戶時
先按11G之前進行
conn / as sysdba;
create user test identifed by test;
ORA-65096: 公用用戶名或角色名無效.
查官方文檔得知“試圖創建一個通用用戶,必需要用C##或者c##開頭”,這時候心里會有疑問,什么是common user?不管先建成功了再說
create C##user test identifed by test;
創建成功
Oracle數據庫的結構是一個數據庫實例下有許多用戶,每一個用戶有自己的表空間,即每一個用戶相當於MySQL中的一個數據庫。
不久前下了oracle 12c的數據庫,安裝之后建user時才知道oracle12c 有一個很大的變動就是引入了pdb可插入數據庫,而且在cdb中只能創建c##或者C##開頭的用戶,只有在pdb數據庫中才能創建我們習慣性命名的用戶,oracle稱之為Local User,前者稱之為Common User,於是乎查詢相關的資料,得到以下解決方法:
oracle pdb和cdb的區別
區別一:包含關系不同
1、PDB全稱為Pluggable Database,即可插拔數據庫
2、CDB全稱為Container Database,中文翻譯為數據庫容器,一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)
區別二:用戶使用時存放位置不同
1、COMMON USERS(普通用戶):經常建立在CDB層,用戶名以C##或c##開頭;
2、 LOCAL USERS(本地用戶):僅建立在PDB層,建立的時候得指定CONTAINER。
CDB中可以有一個或多個PDBS,PDBS向后兼容,可以像以前在數據庫中那樣操作PDBS,這里指大多數常規操作。
這些組件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。
在12c數據庫創建完成后,默認情況下使用sqlplus / as sysdba 登錄連接的是CDB。
我們需要將CDB修改為PDB
1.首先用system用戶登陸sqlplusd
2.查看當前模式
SQL>show con_name;
CON_NAME
------------------------------
CDB$ROOT
3.
SQL> select con_id,name,open_mode from v$pdbs;
CON_ID----------NAME--------------------------------------------------------------------------------OPEN_MODE----------
2 PDB$SEED READ ONLY
3 ORCLPDB MOUNTED
發現oracle12c在安裝時為我們創建了一個pdb為ORCLPDB,但默認是mounted的,所以需要打開它
4.
SQL> alter pluggable database ORCLPDB open;
SQL> select con_id,name,open_mode from v$pdbs;
CON_ID----------NAME--------------------------------------------------------------------------------OPEN_MODE----------
2 PDB$SEED READ ONLY
3 ORCLPDB READ WRITE
5.創建觸發器:指定pdb和實例同時開啟
SQL> create trigger open_pdbsky after startup on database
2 begin
3 execute immediate 'alter pluggable database pdbsky open';
4 end;
5 /
觸發器已創建
如下為測試下重啟實例,看pdb有沒有同時啟動
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 2550136832 bytes
Fixed Size 8922136 bytes
Variable Size 671091688 bytes
Database Buffers 1862270976 bytes
Redo Buffers 7852032 bytes
Database mounted.
Database opened.
SQL> select con_id,name,open_mode from v$pdbs;
CON_ID----------NAME--------------------------------------------------------------------------------OPEN_MODE----------
2 PDB$SEED READ ONLY
3 ORCLPDB READ WRITE
6.修改當前容器為pdb
SQL> alter session set container=ORCLPDB;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
ORCLPDB
SQL>
現在可以按之前版本操作命令執行sql了。
7.pdb數據庫怎么新增
在12C安裝時,會提示你是否安裝可插接式數據庫,我是安裝了設為ORCLPDB;如果你沒有安裝的話可以用以下語句創建一個可插入數據庫
[sql] view plaincopy
create pluggable database pdborcl admin user pdbadmin identified by Learnin
g roles=(connect)
file_name_convert=
('C:\app\Administrator\virtual\oradata\orcl\pdbseed',
'C:\app\Administrator\virtual\oradata\orcl\pdborcl');
其中pdborcl是我創建的可插接式數據庫,pdbadmin是創建的用戶,Learning是密碼。
file_name_convert換成相應目錄就OK了
創建完成之后
打開sql*plus
alter session set container=pdborcl;
alter pluggable database pdborcl open;
grant dba to pdbadmin;
接下來關鍵來了,在oracle_home\product\12.1.0\dbhome_1\NETWORK\ADMIN目錄下找到tnsnames.ora,用記事本打開,在
ORCL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
之下添加
PDBORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PDBORCL)
)
)
PDBORCL就是你創建的可插入數據庫,保存好之后重啟oracle服務(貌似只重啟監聽程序就OK),打開sql*plus
用戶名是PDBADMIN@PDBORCL
密碼是Learning
OK,你現在已經創建了一個PDB用戶了。現在你可以登錄這個用戶了
接下來是用sql developer創建連接的時候了,顯然有sql developer這么強大的工具,怎么能不用呢
創建連接時連接名隨意取,用戶名就是PDBADMIN, 密碼是Learning,選服務名稱,填入PDBORCL
至此可以用sql developer操作PDB數據庫了