下载镜像

  1. 拉取镜像。
    1
    docker pull registry.aliyuncs.com/zhuyijun/oracle:19c
  2. 查看镜像是否下载成功。
    1
    docker images
    查看镜像是否下载成功

部署Oracle容器

  1. 创建挂载文件,将数据和配置挂载到本机。
    1
    mkdir -p /mydata/oracle/oradata
  2. 部署并启动容器。
    1
    docker run -d -p 1521:1521 -p 5500:5500 -e ORACLE_SID=<Your SID> -e ORACLE_PDB=<Your PDB> -e ORACLE_PWD=<Your Password> -e ORACLE_EDITION=standard -e ORACLE_CHARACTERSET=AL32UTF8 -v /mydata/oracle/oradata:/opt/oracle/oradata --name oracle registry.aliyuncs.com/zhuyijun/oracle:19c
    ORACLE_SIDORACLE_PDBORACLE_PWD填写你自己的。例如:
    1
    ...-e ORACLE_SID=ORCL -e ORACLE_PDB=ORCLPDB1 -e ORACLE_PWD=123456 ...
  3. 使用docker ps查看是否部署完成。
    查看是否安装成功
  4. 使用docker logs oracle查看Oracle的docker日志,如下图所示即为成功安装。
    成功安装docker容器

连接数据库

  1. 进入容器。
    1
    docker exec -it oracle bash
  2. 使用sqlplus连接Oracle,并且使用sysdba用户。
    1
    sqlplus / as sysdba
    ![[sysdba连接Oracle.png]]
  3. 至此,已成功安装Oracle。后续几章将会解决安装后可能会出现的问题。

安装后可能出现的问题以及解决方式

本章即本人在安装时遇到的问题,并不全面,仅供参考。

缺少SCOTT用户

Oracle 11后,默认不会自带scott用户,需要我们手动解锁scott用户并导入默认数据。

  1. 临时启用内部脚本兼容模式,创建scott用户,然后级联删除。
    1
    2
    3
    alter session set "_ORACLE_SCRIPT"=true;
    create user scott identified by tiger;
    drop user scott cascade;
  2. 加载脚本。
    1
    @$ORACLE_HOME/rdbms/admin/utlsampl.sql
  3. 解锁用户并修改密码。
    1
    2
    alter user scott account unlock;
    alter user scott identifieed by tiger;
  4. 以scott用户的身份登录即可。
    *记得关闭内部脚本模式:alter session set "_ORACLE_SCRIPT"=false;*。

缺少HR用户

  1. 同scott用户一样。
    1
    2
    3
    alter session set "_ORACLE_SCRIPT"=true;
    create user hr identified by hr;
    drop user hr cascade;
  2. 加载脚本。
    1
    @$ORACLE_HOME/demo/schema/human_resources/hr_main.sql
  3. 解锁用户并修改密码。
    1
    2
    alter user hr account unlock;
    alter user hr identified by hr;
    *记得关闭内部脚本模式:alter session set "_ORACLE_SCRIPT"=false;*。

添加wm_concat函数

在Oracle 19c中,wm_concat函数已被弃用,建议使用更好的listagg函数。如果需要在Oracle 19c中使用wm_concat,我们可以手动实现。

  1. 使用dba用户登录数据库,解锁wmsys用户。
    1
    2
    sqlplus / as sysdba;
    alter user wmsys account unlock;
  2. 修改wmsys用户的密码并赋权。
    1
    2
    alter user wmsys identified by <password>;
    grant connect,resource,create public synonym to wmsys;
  3. 退出sysdba并使用wmsys登录。
    1
    2
    -- eg: conn wmsys/123456;
    conn wmsys/<password>;
  4. 在wmsys用户下执行sql语句。

创建wm_concat函数

  1. 定义类型。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT  
    (
    CURR_STR VARCHAR2(32767),
    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
    P1 IN VARCHAR2) RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
    RETURNVALUE OUT VARCHAR2,
    FLAGS IN NUMBER)
    RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
    SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
    );
    /
  2. 定义类型body。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL  
    IS
    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)
    RETURN NUMBER
    IS BEGIN SCTX := WM_CONCAT_IMPL(NULL);
    RETURN ODCICONST.SUCCESS;
    END;
    MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
    P1 IN VARCHAR2)
    RETURN NUMBER
    IS BEGIN IF (CURR_STR IS NOT NULL) THEN
    CURR_STR := CURR_STR || ',' || P1;
    ELSE
    CURR_STR := P1;
    END IF;
    RETURN ODCICONST.SUCCESS;
    END;
    MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
    RETURNVALUE OUT VARCHAR2,
    FLAGS IN NUMBER)
    RETURN NUMBER
    IS BEGIN RETURNVALUE := CURR_STR;
    RETURN ODCICONST.SUCCESS;
    END;
    MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
    SCTX2 IN WM_CONCAT_IMPL)
    RETURN NUMBER
    IS BEGIN IF (SCTX2.CURR_STR IS NOT NULL) THEN
    SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
    END IF;
    RETURN ODCICONST.SUCCESS;
    END;
    END;
    /
  3. 自定义行变列函数。
    1
    2
    3
    CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)  
    RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
    /
  4. 创建同义词和授权,供其他用户使用。
    1
    2
    3
    4
    5
    6
    7
    8
    create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL  
    /
    create public synonym wm_concat for wmsys.wm_concat
    /
    grant execute on WM_CONCAT_IMPL to public
    /
    grant execute on wm_concat to public
    /
  5. 完成了wm_concat函数的创建。