使用Oracle 12c容器服务创建数据库

1) 启动Oracle服务容器

docker run -d --name oracle -p1521:1521 -v OracleDBData:/ORCL store/oracle/database-enterprise:12.2.0.1-slim

参考:https://hub.docker.com/u/dhyuan/content/sub-2794a3fe-cd52-4dcb-bf8e-3fda40f02a83

通过docker inspect oracle 可以看到被映射在 /var/lib/docker/volumes/OracleDBData

"Mounts": [
    {
        "Type": "volume",
        "Name": "OracleDBData",
        "Source": "/var/lib/docker/volumes/OracleDBData/_data",
        "Destination": "/ORCL",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
],

2)进入Oracle,执行sqlplus。

oracle 12c 是多租户数据库,有个核心概念CDB,PDB需要理解。进入容器oracle:
参考: https://docs.oracle.com/database/121/CNCPT/cdbovrvw.htm#CNCPT89236

docker exec -it oracle bash

sqlplus / as sysdba

show user
show con_name
show pdbs

查看当前用户连接到的数据库是CDB还是PDB。

SELECT NAME, CDB, CON_ID FROM V$DATABASE;

3)创建PDB

创建PDB之前需要设置 FILE_NAME_CONVERT 或者 db_create_file_dest
参考:https://smarttechways.com/2019/03/05/ora-65016-file_name_convert-must-be-specified/
https://segmentfault.com/a/1190000038344836
https://dba.stackexchange.com/questions/190451/unable-to-connect-to-pluggable-database-in-oracle-12c

检查PDB$SEED database文件的位置:

SQL> alter session set container=PDB$SEED;

Session altered.

SQL> select FILE_NAME from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u02/app/oracle/oradata/ORCL/pdbseed/system01.dbf
/u02/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf
/u02/app/oracle/oradata/ORCL/pdbseed/xdb01.dbf

SQL>

因为创建PDB时需要连接在CDB$ROOT,所以先检查当前连接。如果不是,则切换到CDB。

SQL> select sys_context ('USERENV', 'CON_NAME') from dual;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
PDB$SEED

SQL>  alter session set container = CDB$ROOT;

Session altered.

SQL> select sys_context ('USERENV', 'CON_NAME') from dual;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
CDB$ROOT

创建一个PDB: YDPDB 用户:ydhbqb

    SQL> CREATE PLUGGABLE DATABASE YDPDB ADMIN USER ydhbqb IDENTIFIED BY ydhbqb0531 FILE_NAME_CONVERT=('/u02/app/oracle/oradata/ORCL/pdbseed/','/u02/app/oracle/oradata/ORCL/pdbseed/YDPDB/');

赋予sysdba权限:

SQL>  grant SYSDBA to ydhbqb;

Grant succeeded.
   

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 YDPDB              MOUNTED
SQL> 

SQL> alter pluggable database YDPDB open;

Pluggable database altered.

SQL> show pdbs;

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
    2 PDB$SEED              READ ONLY  NO
    3 ORCLPDB1              READ WRITE NO
    4 YDPDB                  READ WRITE NO
SQL> 

让Oracle记住这个状态:

alter pluggable database YDPDB save state;

关闭PDB

alter pluggable database YDPDBclose immediate;

查看错误信息

select * from PDB_PLUG_IN_VIOLATIONS;

4) 连接到PDB。

1) 用sqlplus连接到PDB。

sqlplus ydhbqb/ydhbqb0531@localhost:1521/ydpdb.localdomain

2) Spring DS

spring:
    datasource:
        url:  jdbc:oracle:thin:@localhost:1521/ydpdb.localdomain
        username: ydhbqb
        password: ydhbqb0531