如何在 macOS Catalina 上使用 Oracle Instant Client 安装 Perl DBD::Oracle?

3

我正在运行macOS Catalina 10.15.7,需要安装Oracle Instant Client来运行连接到数据库的Perl脚本。

1. 安装Oracle Instant Client

我下载了需要的软件包:

  • Basic Light Package (DMG)
  • SDK Package (DMG)
  • ODBC Package (DMG)

从Instant Client 19.8并按照安装说明进行操作(只需复制和粘贴)。

文件将被提取到/Users/username/Downloads/instantclient_19_8

2. 设置ORACLE_HOME

然后,我将ORACLE_HOME设置为/Users/username/Downloads/instantclient_19_8

export ORACLE_HOME=/Users/username/Downloads/instantclient_19_8

3. 安装DBD::Oracle

当我尝试安装DBD::Oracle时,出现了以下错误:

$ cpanm DBD::Oracle
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz ... OK
Configuring DBD-Oracle-1.80 ... N/A
! Configure failed for DBD-Oracle-1.80. See /Users/username/.cpanm/work/1608142485.48272/build.log for details.

日志文件的内容:
$ cat /Users/username/.cpanm/work/1608142485.48272/build.log
cpanm (App::cpanminus) 1.7044 on perl 5.032000 built for darwin-thread-multi-2level
Work directory is /Users/username/.cpanm/work/1608142485.48272
You have make /usr/bin/make
You have LWP 6.47
You have /usr/bin/tar: bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
You have /usr/bin/unzip
Searching DBD::Oracle () on cpanmetadb ...
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
-> OK
Unpacking DBD-Oracle-1.80.tar.gz
Entering DBD-Oracle-1.80
Checking configure dependencies from META.json
Checking if you have Config 0 ... Yes (5.032000)
Checking if you have Encode 0 ... Yes (3.06)
Checking if you have Math::BigInt 0 ... Yes (1.999818)
Checking if you have Devel::Peek 0 ... Yes (1.28)
Checking if you have Test::More 0 ... Yes (1.302177)
Checking if you have ExtUtils::MakeMaker 6.58 ... Yes (7.44)
Checking if you have Data::Dumper 0 ... Yes (2.174)
Checking if you have DBI 1.623 ... Yes (1.643)
Checking if you have Test::NoWarnings 0 ... Yes (1.04)
Configuring DBD-Oracle-1.80
Running Makefile.PL
Using DBI 1.643 (for perl 5.032000 on darwin-thread-multi-2level) installed in /usr/local/Cellar/perl/5.32.0/lib/perl5/site_perl/5.32.0/darwin-thread-multi-2level/auto/DBI/
Configuring DBD::Oracle for perl 5.032000 on darwin (darwin-thread-multi-2level)

If you encounter any problem, a collection of troubleshooting
guides are available under lib/DBD/Oracle/Troubleshooting.
'DBD::Oracle::Troubleshooting' is the general troubleshooting
guide, while platform-specific troubleshooting hints
live in their labelled sub-document (e.g., Win32
hints are gathered in 'lib/DBD/Oracle/Troubleshooting/Win32.pod').

Trying to find an ORACLE_HOME
Your DYLD_LIBRARY_PATH env var is set to ''

      The ORACLE_HOME environment variable is not set and I couldn't guess it.
      It must be set to hold the path to an Oracle installation directory
      on this machine (or a machine with a compatible architecture).
      See the appropriate troubleshooting guide for your OS for more information.
      ABORTED!

-> N/A
-> FAIL Configure failed for DBD-Oracle-1.80. See /Users/username/.cpanm/work/1608142485.48272/build.log for details.

我在这里读到,ORACLE_HOME应该被设置为包含/bin目录的目录路径,但是我找不到任何/bin目录。


2
如果有人投票要关闭这个问题,请您写下评论解释原因好吗?(“这个问题不符合 Stack Overflow 的指南”是什么意思?) - Bilal
2个回答

3

macOS一直在不断变化,但在Mojave上,我从DMG安装了Instant Client,然后执行以下操作:

brew install perl
ln -s $HOME/Downloads/instantclient_19_8 $HOME/instantclient
export DYLD_LIBRARY_PATH=$HOME/instantclient
cpan -i -T DBI
cpan -i -T DBD::Oracle

通常不要为Instant Client设置ORACLE_HOME(否则可能会读取错误的配置文件)。ORACLE_HOME用于“完整”的数据库或完整的客户端安装,而不是用于Instant Client。然而一些安装程序仍然引用该变量来查找构建文件,所以您至少需要在构建时使用它。如果没有设置$ORACLE_HOME,DBD::Oracle将内部搜索Instant Client,并使用$HOME/instantclient。
由于DYLD_LIBRARY_PATH未传递给子shell,因此macOS逐渐减少了其有用性。这意味着它不能可靠地使用。在Mojave上,我发现可以将Instant Client库复制到$HOME/lib/中,而不需要设置DYLD_LIBRARY_PATH。
另外注意:如果您正在使用DBD::Oracle,则不需要Instant Client ODBC包。

0

Christopher Jones的回答对我来说不够充分(macOS Monterey 12.2,Apple M1 Pro)。安装停止并出现以下错误:

./Oracle.h:37:10: fatal error: 'oci.h' file not found

为解决此问题,需要安装Oracle SDK包 https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst

第二条评论:

export DYLD_LIBRARY_PATH=$HOME/instantclient

无法运行(请参见以'DYLD'开头的Bash变量未加载到环境中:是bug还是feature?

==================================================

但这并不是问题的终点。安装的DBD::Oracle无法使用。它失败了:

Can't load '/Users/myname/.perlbrew/libs/perl-5.34.1@eien6/lib/perl5/darwin-2level/auto/DBD/Oracle/Oracle.bundle'
for module DBD::Oracle: dlopen(/Users/myname/.perlbrew/libs/perl-5.34.1@eien6/lib/perl5/darwin-2level/auto/DBD/Oracle/Oracle.bundle, 0x0001):
symbol not found in flat namespace '_OCIAttrGet' at 
/Users/myname/perl5/perlbrew/perls/perl-5.34.1/lib/5.34.1/darwin-2level/DynaLoader.pm line 197.

这与MacOS SIP机制有关吗?如何使用DBD::Oracle?


请不要在回答他人问题时提出你自己的问题。最好是创建一个单独的问题,并详细描述您的问题,并附上其他相关问题的链接,如果它们与您的问题有关。 - eNca
这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - eNca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接