安装DBD::Oracle时出现错误

8
我正在尝试在我的RHEL6.1服务器上安装Perl模块DBD::Oracle。在此过程中,我按照以下步骤进行操作:
  1. 安装以下RPM包:
    • oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
    • oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
    • oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
  2. 导出环境变量
  3. export ORACLE_HOME=/usr/lib/oracle/12.1/client64

    export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib

  4. 安装DBD::Oracle
  5. cpan -i DBD::Oracle

在执行过程中,会出现以下错误信息:
Installing on a linux, Ver#2.6
Using Oracle in /usr/lib/oracle/12.1/client64
DEFINE _SQLPLUS_RELEASE = "1201000200" (CHAR)
Oracle version 12.1.0.2 (12.1)

        Unable to locate an oracle.mk or other suitable *.mk
        file in your Oracle installation.  (I looked in
        /usr/lib/oracle/12.1/client64/rdbms/demo/demo_xe.mk /usr/lib/oracle/12.1/client64/rdbms/lib/oracle.mk /usr/lib/oracle/12.1/client64/rdbms/demo/oracle.mk /usr/lib/oracle/12.1/client64/rdbms/demo/demo_rdbms.mk /usr/lib/oracle/12.1/client64/rdbms/demo/demo_rdbms64.mk /usr/lib/oracle/12.1/client64/rdbms/lib/ins_rdbms.mk /usr/share/oracle/12.1/client64/demo.mk under /usr/lib/oracle/12.1/client64)

        The oracle.mk (or demo_rdbms.mk) file is part of the Oracle
        RDBMS product.  You need to build DBD::Oracle on a
        system which has one of these Oracle components installed.
        (Other *.mk files such as the env_*.mk files will not work.)
        Alternatively you can use Oracle Instant Client.

        In the unlikely event that a suitable *.mk file is installed
        somewhere non-standard you can specify where it is using the -m option:
                perl Makefile.PL -m /path/to/your.mk

        See the appropriate README file for your OS for more information and some alternatives.

     at Makefile.PL line 1187.
Warning: No success on command[/usr/bin/perl Makefile.PL INSTALLDIRS=site]
  PYTHIAN/DBD-Oracle-1.74.tar.gz
  /usr/bin/perl Makefile.PL INSTALLDIRS=site -- NOT OK
Running make test
  Make had some problems, won't test
Running make install
  Make had some problems, won't install

安装过程出了什么问题?我按照这个指南进行操作。
5个回答

25

在安装和设置Oracle Instant Client之后,使用常规的构建步骤而不使用cpan工具,并将-l选项传递给Makefile.PL

  1. 下载tar.gz包并解压缩它

  2. 构建它

perl Makefile.PL -l
make && make test
  • 安装

  • make install
    

    我浪费了半天的时间来寻找这个。谢谢,它解决了我的问题。不过,-l标志实际上是做什么的? - sbnarra
    同样的问题!!在我搜索的所有地方,人们都被告诫要阅读README文件,但该文件对InstantClient几乎没有任何说明!我完全震惊了,因为解决方法只是添加-l。天哪,谢谢你! - Glenn
    另外一个细节:在我尝试安装ding-dong的失败尝试中,我做了一些事情导致创建了两个软链接:## sudo ln -s libclntsh.so.11.1 libclntsh.so ## sudo ln -s libocci.so.11.1 libocci.so ## 是的,我验证过创建这些链接是不够的;关键在于像上面那样添加'-l'。 - Glenn
    @Arran 请查看 DBD::Oracle 的 Makefile.PL 中的第 132 至 134 行或第 192 行。 - tjd

    15

    实际上,如果您想使用RPMS和CPAN安装,则必须将ORACLE_HOME设置为lib文件夹,而不仅仅是client64,并将sqlplus添加到路径中:

    export ORACLE_HOME=/usr/lib/oracle/12.1/client64/lib
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/12.1/client64/lib/
    export PATH=$PATH:/usr/lib/oracle/12.1/client64/bin
    

    使用 cpan -i DBD::Oracle 命令没有返回错误。


    你安装了即时客户端 RPM 包还是整个 Oracle 数据库?当我使用即时客户端安装时,我没有看到错误中提到的 demo/demo.mk。 - partyd

    1
    CPAN安装程序唯一找不到的是一个合适的*.mk文件。Oracle可能正在与CPAN安装程序玩猫捉老鼠的游戏,因为安装程序正在多个位置搜索多个文件名。

    我使用了以下命令:
    locate -r '\.mk$'
    

    现在,您需要找到demo.mk文件的位置,它现在位于/usr/lib/oracle/12.1/client64/demo/而不是/usr/lib/oracle/12.1/client64/

    因此,我创建了一个符号链接。

    sudo ln -s /usr/share/oracle/12.1/client64/demo/demo.mk /usr/share/oracle/12.1/client64/demo.mk
    

    并且CPAN安装程序成功了。

    你是进行了完整的数据库安装还是仅安装了即时客户端?当我仅安装即时客户端时,我无法找到demo/demo.mk文件。 - partyd
    谢谢您的答案,它很有效。CPAN安装程序正常工作非常重要,因为我们尽可能地避免从系统Perl目录中运行所需模块(使用Carton)。 - Marcus

    1
    我能使用CPAN安装DBD::Oracle 11.2.0.4版本,需要安装以下3个Instant Client RPM软件包:
    • oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64
    • oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64
    • oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64

    安装完这些后,cpan 就能够构建了。这是在 CentOS 7.3.1611 上的情况。


    0

    开始之前,您需要:

    • 下载Oracle 12c即时客户端和SDK:

      • instantclient-basic-linux.x64-12.2.0.1.0.zip
      • instantclient-sdk-linux.x64-12.2.0.1.0.zip
      • instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
    • 使用以下命令安装:

      sudo apt-get install libaio1

    • 使用以下命令下载并解压DBD::Oracle包:

      cpan get DBD::Oracle

    如果您拥有DBD::Oracle 1.74 + Oracle 12c(12.2.0.1)和Ubuntu 18应用程序在Windows 10下,则需要进行更多更改。

    1. 在 Makefile.PL 中注释掉第 1613 行

      #local $ENV{PATH} = join $Config{path_sep}, "$OH_path/bin", $OH_path, $ENV{PATH} if $OH;

    2. 替换第 1630 行

      my $sqlplus_release = `sqlplus -S /nolog \@define.sql`;

    为以下内容:

    my $sqlplus_release = qq {SQL> DEFINE _SQLPLUS_RELEASE
    DEFINE _SQLPLUS_RELEASE = "1202000100" (CHAR)
    SQL> QUIT};
    
    1. 执行Perl脚本:

      perl Makefile.PL -l

    2. 将569-581行替换为以下行(因为Windows下的Ubuntu不支持带冒号的路径):

      lib/DBD/Oracle.pm $(INST_MAN3DIR)/DBD_Oracle.$(MAN3EXT) \ lib/DBD/Oracle/GetInfo.pm $(INST_MAN3DIR)/DBD_Oracle_GetInfo.$(MAN3EXT) \ lib/DBD/Oracle/Object.pm $(INST_MAN3DIR)/DBD_Oracle_Object.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Aix.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Aix.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Cygwin.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Cygwin.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Hpux.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Hpux.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Linux.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Linux.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Macos.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Macos.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Sun.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Sun.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Vms.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Vms.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Win32.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Win32.$(MAN3EXT) \ lib/DBD/Oracle/Troubleshooting/Win64.pod $(INST_MAN3DIR)/DBD_Oracle_Troubleshooting_Win64.$(MAN3EXT)

      1. 使用以下命令进行编译:

      make && make test

      1. 使用以下命令进行安装:

      sudo make install

    希望在开始之前您已经安装了所有必要的先决条件。


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