MacBook M4芯片 Arm64架构 基于docker安装Oracle 19c

前提

在网上找到很多mac安装oracle的版本是amd架构,奈何本人的电脑是arm架构。查看自己的电脑是什么架构可以进入终端

输入uname -m

可以看到本人的是arm架构

安装步骤

1、打开终端,拉取 Oracle 19c 镜像(ARM64 架构),安装的时间可能有点久,需要等待一会

这一步骤参考文章:MacBook M系列芯片基于docker安装Oracle 19c

bash 复制代码
docker pull docker.cnb.cool/kangaroohy/open-source/images/oracle:19.19.0-ee-arm64

安装成功后在终端中输入 docker images,出现以下内容

2、由于我的电脑在docker下创建文件夹的话会报错,所以选择换一种方法

方法一(直接创建):失败

方法二:成功
3、在终端中输入:

bash 复制代码
docker run -d \
  --name oracle \   # (自己设计)容器名称,我这里设置为了oracle
  -p 1521:1521 \    # (不变)Oracle 数据库端口映射(本机可访问)
  -p 5500:5500 \    # (不变)Enterprise Manager 控制台端口
  -e ORACLE_PDB=ORCL \   # 不变
  -e ORACLE_PWD=12345678 \   # (自己设计)设置oracle初始密码
  -e ORACLE_CHARACTERSET=AL32UTF8 \   # 不变
  -e INIT_SGA_SIZE=3000 \             # 不变
  -e INIT_PGA_SIZE=1000 \             # 不变

  # (自己设计)注意这一步,我首先在自己电脑中创建了oracle-data文件夹,然后把本地目录挂载为 Oracle 数据文件存储目录
  -v /自己电脑中oracle-data的文件夹路径/oracle-data:/oracle-data \  
  
  # 刚刚安装的Oracle 19c 镜像
  docker.cnb.cool/kangaroohy/open-source/images/oracle:19.19.0-ee-arm64

4、验证容器是否正常运行

查看日志确认数据库是否启动完成,输入

bash 复制代码
docker logs -f oracle   # oracle是刚刚起的容器名称

如果出现以下内容则证明启动完成,第一次输入需要初始化,可能要等待一段时间:

5、验证挂载是否生效

进入容器,输入

bash 复制代码
docker exec -it oracle /bin/bash   # 注意oracle是刚刚起的容器名字

如果看到了以下提示符,则已经成功进入了 Oracle 容器的 Bash 终端,当前提示符 bash-4.4$ 表示已经在容器内部了

然后执行

bash 复制代码
ls /oracle-data

如果出现空目录,则表示容器成功挂载了你自己电脑中oracle-data的文件夹路径

6、连接oracle数据库

bash-4.4$中输入

bash 复制代码
sqlplus / as sysdba

如果成功,会看到类似下方的内容

在上一步中显示目前已经成功登录了容器内部的 Oracle 数据库,说明数据库服务已正常启动,下面需要确认 Docker 容器是否暴露了1521 端口

7、确认 Docker 容器是否暴露了 1521 端口

先输入exit退出容器,回到自己的macOS终端,然后再执行docker ps命令

如果 1521:1521 存在,说明 Oracle 数据库的监听端口已经映射出来,可以在 Navicat 中使用


8、使用Navicat连接Oracle

在Navicat中新建Oracle,本人的信息填写如下,点击测试链接后却显示未加载oracle数据库。于是开始排错

排错步骤一:确认服务名

输入

bash 复制代码
docker exec -it oracle bash
cat $ORACLE_HOME/network/admin/tnsnames.ora

可以看到文件中同时出现 ORCLCDB ORCL,这是 Oracle 19c 多租户架构下的标准现象

查询之后发现结论如下,还是推荐使用ORCL连接

排错步骤二:测试数据库监听是否开放

在终端上执行

bash 复制代码
telnet localhost 1521

或(Mac 没有 telnet 时)用

bash 复制代码
nc -zv localhost 1521

输出如果类似红框内容,说明监听服务正常。如果失败,说明监听器没启用(容器内部监听未启动)


排错步骤三:容器内检查监听器状态

终端输入

bash 复制代码
docker exec -it oracle bash
lsnrctl status

如果显示类似于下方图片内容,则表示监听器状态成功启动

可以看到本人电脑这两个内容都没有问题,后来查出这不是数据库没连接上,而是我的Navicat 本身缺少 Oracle 客户端库

问题本质:

Navicat 连接 Oracle 时需要调用 Oracle 客户端驱动(OCI 动态库),而 macOS 默认是没有安装这个驱动的,Navicat 会报这个错:


9、现在开始安装 Oracle Instant Client(轻量官方驱动)

进入https://www.oracle.com/database/technologies/instant-client/macos-arm64-downloads.html

下载后解压
instantclient-basic-macos.arm64-19.22.0.0.0dbru.dmg
instantclient-sdk-macos.arm64-19.22.0.0.0dbru.dmg


假设解压在/Users/123/ins路径下,打开终端执行

bash 复制代码
echo 'export DYLD_LIBRARY_PATH=/Users/123/ins' >> ~/.zshrc
source ~/.zshrc

之后重启Navicat,再次连接,发现还是显示测试失败

10、需要在程序简介中勾选Rosetta,勾选完成之后再次重启Navicat

连接成功

相关推荐
Sheffi661 小时前
Objective-C 黑魔法:Method Swizzling 的正确姿势与滥用风险
开发语言·macos·objective-c
Aftery的博客1 小时前
flutter运行macos报错:Error: CocoaPods not installed or not in valid state.
flutter·macos·cocoapods
曦云沐1 小时前
Docker双模式实战:从零到精通,Dockerfile与Docker Compose全方位构建部署
docker
风逸柏1 小时前
dockerfile说明
docker·容器
喵霓1 小时前
mac-终端
macos
p***43481 小时前
后端在消息系统中的顺序保证
数据库·数据仓库·docker
玩电脑的辣条哥1 小时前
苹果Mac OS磁盘工具怎么把Win10系统磁盘空余空间分配给Mac系统?
macos·磁盘工具
z***89711 小时前
[golang][MAC]Go环境搭建+VsCode配置
vscode·macos·golang
想不明白的过度思考者1 小时前
数据库基础与MySQL核心组件解析
数据库·mysql·oracle