如何在 docker 容器内的 Oracle 数据库上使用 sqlldr?

How to use sqlldr on Oracle database inside a docker container?

我使用以下命令在我的 docker 环境中安装了 oracle db 版本 19c:

docker  run --name oracle19c --network host -p 1521:1521 -p 5500:5500
 -v /opt/oracle:/u01/oracle oracle/database:19.3.0-ee

然后我连接到它:

docker exec -ti oracle19c sqlplus system/oracle@orclpdb1
SQL>

然后我设置我的数据库。之后我想从 tbl 文件导入虚拟数据,所以我退出 sqlplus 并使用命令:

sqlldr userid=system control=/home/userhere/sql_loader/control.ctl log=sf1customer.log

并获取 sqlldr:未找到

我对 Docker 没有太多经验,但我的研究使我相信 SQL *Loader 不附带 docker 图像。但是,我不知道如何扩展图像或我将调用 SQL *Loader 的确切位置,即使我这样做了。我在 Ubuntu 服务器上,如有任何帮助,我们将不胜感激。

SQL*加载程序在映像中 - 但 docker 容器与您的主机 OS 是分开的,因此 ubuntu 不知道任何文件或其中的命令存在。容器内的任何命令都应 运行 作为 docker 命令。如果您尝试这样做,它应该连接到您的 运行ning 容器并打印帮助页面:

docker exec -ti oracle19c sqlldr

由于您在 docker 容器上 运行 执行此命令,sqlldr 无权访问您的主机 OS 的任何文件,除非您特别授予它们到容器。但好消息 - 当您使用 docker run 启动数据库时,这就是命令的 -v /opt/oracle:/u01/oracle 部分所做的 - 它映射 Ubuntu 文件系统上的 /opt/oracle/u01/oracle 在 docker 容器中。因此,您放入 /opt/oracle 中的任何文件都将在 /u01/oracle.

下的容器中可用

所以你需要做几件事:

  1. 您的 control.ctl 文件、日志文件以及您正在使用的任何数据文件都需要容器可以访问。将它们移动到 /opt/oracle 或关闭数据库容器并在命令中使用 -v /home/userhere/sql_loader:/u01/oracle 之类的内容重新启动它。
  2. 您可能还需要编辑 control.ctl 文件以确保它不引用主机 OS 上的任何文件路径。使用容器文件系统的相对路径 (./myfile.csv) 或绝对路径 (/u01/oracle/myfile.csv)

现在您应该可以 运行 容器上的 sqlldr,它应该可以访问您的数据文件。

docker exec -ti oracle19c sqlldr userid=system control=/u01/oracle/control.ctl log=/u01/oracle/sf1customer.log

编辑:哦,我应该提一下 - 作为替代方案,如果您在 Ubuntu 中下载并安装 Oracle Instant Client,您可以在 Ubuntu 中本地 运行 sqlldr ,并通过网络连接到 docker 容器作为“远程”数据库:

sqlldr system@localhost:1521/orclpdb1 control=/home/userhere/sql_loader/control.ctl log=sf1customer.log

这样您就不必将文件移动到任何地方。