docker 下配置 Oracle Database Server 12c R2 的流程備忘

下載鏡像

https://hub.docker.com/_/oracle-database-enterprise-edition

修改源

採用阿里雲提供的國內源,Docker Desktop 依次進入 SettingsDocker 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章