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



我用以下命令在docker环境中安装了oracledb版本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容器与主机操作系统是分开的,因此ubuntu不知道其中存在任何文件或命令。容器中的任何命令都应该作为docker命令运行。如果你尝试这样做,它应该连接到你正在运行的容器并打印帮助页面:

docker exec -ti oracle19c sqlldr

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

所以你需要做几件事:

  1. 您的control.ctl文件、日志文件以及您正在使用的任何数据文件都需要可访问容器。要么将它们移动到/opt/oracle,要么关闭数据库容器并在命令中使用类似-v /home/userhere/sql_loader:/u01/oracle的东西重新启动它
  2. 您可能还需要编辑control.ctl文件,以确保它没有引用主机操作系统上的任何文件路径。对容器的文件系统(/u01/oracle/myfile.csv(使用相对路径(./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

这样你就不必把文件移到任何地方。

相关内容

  • 没有找到相关文章

最新更新