1. 版本选择
Oracle 19c:生产环境的"压舱石"
如果你期望容器能稳定运行,模拟一个可靠的企业级数据库环境,19c 是目前最稳妥、最主流的选择。
- 官方定位 :它是一个长期支持版本(LTS),支持周期长,稳定性经过了全球无数生产环境的检验。
- 对你而言:绝大多数教程和网上的经验分享都是以 19c 为基础的。这意味着你在安装或使用中遇到问题时,更容易找到解决方案。正如资料里提到的,19c 是目前企业生产环境中的标准配置。
Oracle 23ai (原名23c):面向未来的"创新者"
如果你想尝鲜,体验 Oracle 的最新特性,23ai(即原来的 23c)就是下一代的选择。
- 官方定位 :它也是一个长期支持版本(LTS),是 Oracle 目前主推的融合了 AI 能力的旗舰版本。
- 核心亮点:它引入了 AI 向量搜索、JSON 关系二元性等面向现代应用开发的功能。
- 对你而言:如果你在做个人学习或新项目开发,希望技术不落后,可以考虑它。它的免费版 (23ai Free) 在 Docker 上也很容易获取。
各主要版本速览
| 版本 | 当前定位 | 一句话选型建议 |
|---|---|---|
| 11g | 经典老将 | 不再推荐。由于主流支持已结束,缺乏安全更新,适合有特定需求的遗留系统。 |
| 12c / 18c | 过渡版本 | 不推荐。它们引入了多租户架构,但目前已停止或即将停止服务,没有理由在新项目中选用。 |
| 21c | 创新尝鲜版 | 不推荐。作为短期创新版本,支持周期短,更像是一个向 23ai 过渡的中间版本。 |
| 19c | 稳定首选 | 强烈推荐。最成熟、文档最丰富、网上资料最多的版本,适合绝大多数学习、测试和准生产环境。 |
| 23ai (23c) | 未来旗舰 | 新手尝鲜推荐。最新长期支持版本,融合 AI 能力,适合新项目和个人开发者学习未来技术方向。 |
在 Docker 里安装 Oracle 19c,国内网络环境下最稳妥的方式是使用国内镜像源,配合持久化配置,大约 10-20 分钟就能完成。下面分步说明。
2. Oracle安装
步骤一:拉取镜像
国内访问 Docker Hub 拉取大镜像可能很慢甚至超时。推荐使用阿里云镜像,速度快且稳定。
bash
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
步骤二:创建数据持久化目录
为了防止容器删除后数据丢失,需要在宿主机上创建一个目录来存放数据库文件,并确保容器内的 oracle 用户有写入权限。
bash
# 创建目录(路径可自定义)
sudo mkdir -p /docker/oracle19c/oradata
# 授予读写权限
sudo chmod 777 /docker/oracle19c/oradata
步骤三:创建并运行容器
执行以下 docker run 命令来创建和启动容器:
bash
docker run -d \
--name oracle19c \
--restart=unless-stopped \
-p 1521:1521 \
-p 5500:5500 \
-e ORACLE_SID=ORCLCDB \
-e ORACLE_PDB=ORCLPDB \
-e ORACLE_PWD=oracle \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /opt/install/docker/oracle19c/oradata:/opt/oracle/oradata \
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
各参数说明:
| 参数 | 说明 |
|---|---|
-d |
后台运行容器 |
--name oracle19c |
容器名称,后续管理方便 |
--restart=unless-stopped |
宿主机重启后自动启动容器 |
-p 1521:1521 |
映射数据库连接端口 |
-p 5500:5500 |
映射 Web 管理端口 (EM Express) |
-e ORACLE_SID=ORCLCDB |
数据库实例名(容器数据库 CDB) |
-e ORACLE_PDB=ORCLPDB |
可插拔数据库名(实际存放数据的 PDB) |
-e ORACLE_PWD=oracle |
管理员 SYS 和 SYSTEM 的密码 |
-e ORACLE_CHARACTERSET=AL32UTF8 |
字符集,支持中文 |
-v |
数据卷挂载,实现数据持久化。" :" 分隔符,左边是宿主机路径(如果不存在,可以提前用 mkdir -p 创建),右边是容器内路径(官方 Docker 镜像预设的路径) |
步骤四:等待初始化完成
Oracle 数据库的初始化需要较长时间(约 5-10 分钟)。执行以下命令实时查看日志进度,直到看到 DATABASE IS READY TO USE! 字样,才算真正成功:
bash
docker logs -ft oracle19c
⚠️ 注意 :如果看到
DEPRECATION NOTICE警告,那是镜像格式的提醒,不影响使用,可以放心忽略。
步骤五:连接数据库
数据库初始化成功后,可以通过下面几种方式连接和验证:
方式1:进入容器内连接
bash
# 进入容器内部
docker exec -it oracle19c /bin/bash
# 在容器内以 sysdba 身份登录
sqlplus / as sysdba
# 查看所有可插拔数据库 (PDB)
SQL> show pdbs;
方式2:使用客户端工具(如 DBeaver/Navicat)外部连接
| 项目 | 值 |
|---|---|
| 主机 | 宿主机IP 或 localhost |
| 端口 | 1521 |
| 服务名 | ORCLPDB(这就是 PDB 的名称) |
| 用户名 | system |
| 密码 | oracle(你设置的值) |
方式3:通过 Web 管理界面(EM Express)
打开浏览器,访问 https://宿主机IP:5500/em,用用户名 system、密码 oracle 登录(浏览器会提示证书风险,点击"高级"->"继续访问"即可)。
步骤六:创建用户
bash
-- 创建一个名为 root 的用户,密码为 123456
CREATE USER root IDENTIFIED BY 123456;
-- 给这个用户连接数据库和创建一些基本对象(如表、视图)的权限
GRANT CONNECT, RESOURCE TO developer;
-- 给予开发者操作自己对象的权限
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO developer;
你给出的 GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO developer; 这组权限是够用的,但仅限于最基础的开发。这为开发者打开了连接数据库、创建和修改自己表、创建视图的大门。
不过,为了让开发体验更顺畅,通常还需要补充几个核心权限。我把它们整理成了一个表格,你可以对照着看:
📝 核心权限速查表
| 你需要的能力 | 对应的权限 | 为什么需要它 | 是否必要? |
|---|---|---|---|
| 连接数据库 | CREATE SESSION |
已经授予,这是访问数据库的"门票"。 | ✅ 已有 |
| 在自己的Schema下建表、视图 | CREATE TABLE CREATE VIEW |
已经授予,这是开发的基础。 | ✅ 已有 |
| 创建存储过程、函数或包 | CREATE PROCEDURE |
如果后端逻辑需要用PL/SQL实现,这是必备权限。 | 强烈推荐 |
| 创建触发器 | CREATE TRIGGER |
实现复杂数据约束或自动化日志记录时会用到。 | 按需授予 |
| 创建序列 | CREATE SEQUENCE |
常用于生成自增主键,是很多表的标准配置。 | 强烈推荐 |
| 创建同义词 | CREATE SYNONYM |
让复杂的对象名变得简单,提升开发便利性。 | 可选 |
| 无限使用表空间 | UNLIMITED TABLESPACE |
这个非常重要!否则建表时一旦超过系统默认配额(通常是0),就会报错。 | 必须补充 |
| (备选)使用推荐的角色包 | CONNECT, RESOURCE |
这两个角色包含了上述大部分开发者所需的系统权限,是更省事的"一键授予"方案。 | ⭐ 强烈推荐 |
注:
CONNECT角色实际上就包含了CREATE SESSION权限,而RESOURCE角色则包含了CREATE TABLE、CREATE PROCEDURE、CREATE SEQUENCE等核心开发权限。这两个角色搭配使用,基本能满足绝大部分开发需求。
直接授权DBA管理员权限,方便开发
sql
GRANT DBA TO root;
💡 补充说明
-
关于中文显示:如果查询中文时出现乱码,是因为客户端
-
字符集设置不匹配。可以在连接前执行
export NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8来解决。 -
资源要求 :Oracle 19c 对内存有一定要求,建议给 Docker 分配至少 4GB 内存,宿主机建议 6GB 以上。
-
常用管理命令:
bash
# 查看运行状态
docker ps | grep oracle19c
# 停止容器
docker stop oracle19c
# 启动容器
docker start oracle19c
# 查看日志
docker logs -f oracle19c