使用docker安装Oracle 19c
下载镜像
- 拉取镜像。
1
docker pull registry.aliyuncs.com/zhuyijun/oracle:19c
- 查看镜像是否下载成功。
1
docker images
部署Oracle容器
- 创建挂载文件,将数据和配置挂载到本机。
1
mkdir -p /mydata/oracle/oradata
- 部署并启动容器。
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_SID
、ORACLE_PDB
和ORACLE_PWD
填写你自己的。例如:1
...-e ORACLE_SID=ORCL -e ORACLE_PDB=ORCLPDB1 -e ORACLE_PWD=123456 ...
- 使用
docker ps
查看是否部署完成。
- 使用
docker logs oracle
查看Oracle的docker日志,如下图所示即为成功安装。
连接数据库
- 进入容器。
1
docker exec -it oracle bash
- 使用
sqlplus
连接Oracle,并且使用sysdba用户。![[sysdba连接Oracle.png]]1
sqlplus / as sysdba
- 至此,已成功安装Oracle。后续几章将会解决安装后可能会出现的问题。
安装后可能出现的问题以及解决方式
本章即本人在安装时遇到的问题,并不全面,仅供参考。
缺少SCOTT用户
Oracle 11后,默认不会自带scott用户,需要我们手动解锁scott用户并导入默认数据。
- 临时启用内部脚本兼容模式,创建scott用户,然后级联删除。
1
2
3alter session set "_ORACLE_SCRIPT"=true;
create user scott identified by tiger;
drop user scott cascade; - 加载脚本。
1
@$ORACLE_HOME/rdbms/admin/utlsampl.sql
- 解锁用户并修改密码。
1
2alter user scott account unlock;
alter user scott identifieed by tiger; - 以scott用户的身份登录即可。
*记得关闭内部脚本模式:alter session set "_ORACLE_SCRIPT"=false;
*。
缺少HR用户
- 同scott用户一样。
1
2
3alter session set "_ORACLE_SCRIPT"=true;
create user hr identified by hr;
drop user hr cascade; - 加载脚本。
1
@$ORACLE_HOME/demo/schema/human_resources/hr_main.sql
- 解锁用户并修改密码。 *记得关闭内部脚本模式:
1
2alter 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
,我们可以手动实现。
- 使用dba用户登录数据库,解锁wmsys用户。
1
2sqlplus / as sysdba;
alter user wmsys account unlock; - 修改wmsys用户的密码并赋权。
1
2alter user wmsys identified by <password>;
grant connect,resource,create public synonym to wmsys; - 退出sysdba并使用wmsys登录。
1
2-- eg: conn wmsys/123456;
conn wmsys/<password>; - 在wmsys用户下执行sql语句。
创建wm_concat
函数
- 定义类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14CREATE 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
);
/ - 定义类型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
34CREATE 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;
/ - 自定义行变列函数。
1
2
3CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/ - 创建同义词和授权,供其他用户使用。
1
2
3
4
5
6
7
8create 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
/ - 完成了
wm_concat
函数的创建。