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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容