下載鏡像
https://hub.docker.com/_/oracle-database-enterprise-edition
修改源
採用阿里雲提供的國內源,Docker Desktop 依次進入 Settings
→Docker Engine
,在 registry-mirrors
屬性下添加地址(格式僅供參考):
{
"registry-mirrors": [
"https://67ewp9up.mirror.aliyuncs.com"
],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
}
執行鏡像
以 win10 爲例。根據文檔,將本地 D:\oracledata
掛載到 /ORCL
,命令行如下:
docker run --name oracle -d -p 1521:1521 --restart=always -v D:/MyProjectMix/oracledata:/ORCL 12a359cd0528
登錄
使用 Docker Desktop 進入容器命令行,執行 source /home/oracle/.bashrc
激活環境變量,再執行 sqlplus /nolog
,否則提示找不到命令。
或按照文檔提示,直接執行
$ docker exec -it <Oracle-DB> bash -c "source /home/oracle/.bashrc; sqlplus /nolog"
,效果相同。
.bashrc
內容如下:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export OH=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u01/app/oracle/product/12.2.0/dbhome_1/bin
export TNS_ADMIN=/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB
export ORACLE_SID=ORCLCDB;
進入後連接至 SYS 賬戶 connect / as sysdba
修改密碼(可選)
alter user sys identified by oracle;
alter user system identified by oracle;
之後可在命令行輸入 sqlplus,用上述用戶登錄即可
注:SYS 賬戶必需以 dba 權限登錄,應輸入用戶名
sys as sysdba
CDB 和 PDB
Oracle 12c 引入了 CDB 與 PDB,在 ORACLE 12c 數據庫引入的多租用戶環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。CDB 全稱爲 Container Database,翻譯爲數據庫容器,PDB 全稱爲 Pluggable Database,即可插拔數據庫。在 ORACLE 12c 之前,實例與數據庫是一對一或多對一關係(RAC),即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。而實例與數據庫不可能是一對多的關係。當進入 ORACLE 12c 後,實例與數據庫可以是一對多的關係。
CDB 相當於操作系統,調用並管理各個 PDB。PDB 相當於真正提供業務需求的數據庫實例。ORACLE 12c 安裝後只創建了 CBD,需要自己生成相應的 PDB。平時的數據庫操作大多數和 PDB 相關。
注:數據庫創建完成後默認帶有一個名爲 ORCLPDB1 的 PDB
相關命令:
-
select name,open_mode from v$pdbs;
用來查看當前 CDB 容器中包含的 PDB 容器 -
show pdbs;
查看全部目前的 PDB -
show con_name;
查看當前所在是 CDB 還是 PDB
用戶分類
Oracle 12c 的用戶分爲公共用戶和本地用戶
公共用戶:可以爲 CDB 管理員創建,公共用戶是在所有的 PDB 中都可以使用的用戶,公共用戶的信息存在 CDB$ROOT 中,並且存在於所有的 PDB 中。公共用戶需要連到 CDB 進行創建和管理。在 CDB 中創建的用戶默認就是公共用戶,可以省略 container=all,在 CDB 中只能創建公共用戶,不能創建本地用戶。
本地用戶:本地用戶只會存儲在對應的 PDB 中,在 PDB 中創建的用戶默認就是本地用戶,可以省略 container=current,在 PDB 中只能創建本地用戶,不能創建公共用戶。
爲了區分公共用和本地用戶,引進了新的參數 common_user_perfix,表示公共用戶的前綴,默認爲 c##,也就是說如果創建了一個公共用戶,必須帶上前綴,如果不加 c##,則會提示錯誤 ORA-65096:公用用戶名或角色名無效
。此前綴是可以進行修改的,但是建議不要修改。執行以下命令查看前綴:
show parameter common_user;
創建用戶並授權
create user C##test identified by 123456;
grant connect,source,dba to C##test;
切換至 PDB
注意:使用這個命令需要的 sysdba 級別的權限,否則無法執行。切換後纔可使用當前 PDB 的私有用戶進行操作,12c 數據庫創建完成後,默認情況下,使用 sqlplus / as sysdba
登錄連接的是 CDB
執行 show con_name;
,當前在 CDB 容器中
CON_NAME
------------------------------
CDB$ROOT
使用 show pdbs;
查詢目前現有的 PDB 容器
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
使用下列命令切換
SQL> alter session set container=ORCLPDB1;
執行 show con_name;
驗證:
CON_NAME
------------------------------
ORCLPDB1
說明切換成功,此時就可以創建本地用戶了
SQL> create user test identified by 123456;
切換至 CDB
如果要切換回 CDB 容器只需將容器名換爲 CDB 容器的名字即可,一個 CDB 只有一個根
SQL> alter session set container=CDB$ROOT;
登陸或連接
使用 DataGrip 登錄 PDB 使用 serviceName 登錄,默認爲實例名稱後加 localdomain(例如 ORCLPDB1.localdomain),可通過 tnsnames.ora 查看。查找文件所在路徑:
find / -name tnsnames.ora
/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/samples/tnsnames.ora
/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/tnsnames.ora
觀察環境變量 export TNS_ADMIN=/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB
可知正確路徑。從 ORCLCDB/tnsnames.ora
可看到 ORCLCDB 和 ORCLPDB 的 serviceName,或用命令查詢當前可用 serviceName
SQL> select name,pdb from v$services order by name;
查看用戶
如果處在 CDB$ROOT 中查詢 DBA 視圖,那麼只能查詢到公共的數據字典;如果處在 PDB 中,那麼查詢 DBA 視圖只能查到此 PDB 的數據字典。12c 中新增了 CDB 數據字典,可以查看所有的數據字典。所以,當在 CDB 中查詢 dba_users,那你只能查詢到公共的用戶,當處於 PDB 中,只能查到 PDB 中的本地用戶;如果想查詢所有的用戶,可以使用下的語句。其中新增 oracle_maintained 字段提示了此用戶是否由 oracle 管理:
SQL> select a.username,a.common,a.con_id,decode(a.CON_ID,1,'CDB$ROOT',b.pdb_name) name from cdb_users a,cdb_pdbs b
where a.con_id=b.con_id(+) and oracle_maintained='N'
order by a.con_id,a.username;
以此類推,公共用戶修改密碼只能在 CDB$ROOT
中進行修改;本地用戶只能在 PDB 中進行修改:
SQL> alter user c##cdb identified by newcdb;
刪除用戶
命令:drop user C##用戶名
若用戶擁有對象,則不能直接刪除,否則將返回一個錯誤值。指定關鍵字 cascade,可刪除用戶所有的對象,然後再刪除用戶。
用戶授權
創建一個公共用戶,此時是沒有任何登錄權限的:
SQL> create user c##cdb identified by cdb;
User created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> conn c##cdb/cdb
ERROR:
ORA-01045: user c##cdb lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
在 CDB 中賦予 c##cdb 登錄權限後,就可以登錄到 CDB。登錄 sys 賬戶進行授權(登錄時默認在 CDB 中):
conn / as sysdba
Connected.
SQL> grant create session to c##cdb;
Grant succeeded.
注:grant 不添加 container 子句,則默認爲當前容器,即
grant create session to c##cdb container=current;
配置權限後可成功切換用戶:
SQL> conn c##cdb/cdb
Connected.
在 PDB 內部的授權爲本地授權,可以在 PDB 中對公共用戶進行授權。公共用戶雖然在所有 PDB 中都存在,但並不是創建了公共用戶就有權限訪問所有 PDB,還需要單獨賦予 create session 權限。此時還沒有賦予單獨的 PDB 權限給賬戶,當嘗試連接其他 PDB 時會報錯:
SQL> alter session set container=ORCLPDB1;
ERROR:
ORA-01031: insufficient privileges
通過登錄 sys 賬戶連接 PDB,再對賬戶進行授權:
SQL> conn / as sysdba
Connected.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=brent;
Session altered.
SQL> grant create session to c##cdb with admin option container=current;
Grant succeeded.
或者對公共用戶進行公共授權,授權之後的用戶就擁有了所有 PDB 的相關權限:
SQL> grant create session to c##cdb container=all;
查看權限
SQL> select * from dba_sys_privs where grantee like 'C##%';
撤銷權限
SQL>revoke create table from test;
新建 PDB
查找 pdbseed 目錄的路徑,例如 /u02/app/oracle/oradata/ORCL/pdbseed
,使用 sys 用戶下執行下列命令:
SQL> create pluggable database ORCLPDB2 admin user pdbadmin identified by oracle roles=(resource) file_name_convert=('/u02/app/oracle/oradata/ORCL/pdbseed','/u02/app/oracle/oradata/ORCL/orclpdb2');
Pluggable database created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
4 ORCLPDB2 MOUNTED
注:orclpdb2 目錄不存在,執行後自行建立
更改 PDB 模式
alter pluggable database ORCLPDB2 open read write;
登陸時提示錯誤
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
注意用戶是否授權,另外要增加連接符,具體在 tnsnames.ora 文件中新加一個連接符,再重新啓動監聽器 lsnrctl start
保持 PDB 模式
完成常規配置後,當 CDB 實例關閉重新開啓後會重置 PDB 的模式爲 MOUNTED
,此時可執行 alter pluggable database ORCLPDB2 open;
手動啓動。或在 PDB 啓動後使用 alter pluggable database all save state;
命令,保持狀態,讓 PDB 保持啓動。
其他相關命令:
-
alter pluggable database all except ORCLPDB2 close;
,除 ORCLPDB2 外關閉全部 PDB -
alter pluggable database all open;
,開啓全部 PDB -
shutdown immediate;
,關閉 CDB -
startup mount;
,啓動 CDB