在 CentOS/RHEL Linux 上设置 Oracle 即时客户端 - 适用于 PHP 和 Perl

Ale*_*ber 5 oracle php perl

我正在尝试设置 CentOS 5.5/64 位 VM 以使用 PHP 和 Perl 脚本访问远程 Oracle 数据库。(我没有使用Oracle的经验,之前只编程和管理过一些PostgreSQl和MySQL。)

我已经安装了以下 Oracle Instant Client rpm:

oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

并将以下变量添加到我的 .bash_profile 中:

export TNS_ADMIN=/etc
export ORACLE_HOME=/usr/lib/oracle/11.2
export LD_LIBRARY_PATH=$ORACLE_HOME/client64/lib
PATH=$PATH:$HOME/bin:/sbin:$ORACLE_HOME/client64/bin
Run Code Online (Sandbox Code Playgroud)

/etc/tnsnames.ora我将从运行 Oracle 数据库的远程站点的同事那里收到的信息写入到该文件中:

some_string =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = my_address)(PORT = my_port))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PDTT)
    )
  )
Run Code Online (Sandbox Code Playgroud)

好的部分是我现在可以通过运行从 CLI 进行连接

sqlplus 'my_user/my_password@//my_address:my_port/PDTT'
Run Code Online (Sandbox Code Playgroud)

然后可以通过发出以下命令查看一些表:

select table_name from user_tables;
Run Code Online (Sandbox Code Playgroud)

而且我已经sudo pecl install oci8成功运行,添加了包含以下内容的文件/etc/php.d/oci8.ini

extension=oci8.so
Run Code Online (Sandbox Code Playgroud)

并可以看到以下 phpinfo() 输出

在此输入图像描述

现在我的疑问和问题请:

1)我应该如何设置ORACLE_SID变量以及设置后如何调用sqlplus?我可以/应该使用 PHP 和 Perl 脚本中的 ORACLE_SID 吗?

2)我运行sudo -E perl -MCPAN -e shell并且在安装其他 Perl 模块时它运行良好,但是对于“install DBD::Oracle”它失败并显示:

  CPAN.pm: Going to build T/TI/TIMB/DBD-Oracle-1.26.tar.gz

Using DBI 1.52 (for perl 5.008008 on x86_64-linux-thread-multi) installed in /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/DBI/

Configuring DBD::Oracle for perl 5.008008 on linux (x86_64-linux-thread-multi)

Remember to actually *READ* the README file! Especially if you have any problems.

  The ORACLE_HOME environment variable value (/usr/lib/oracle/11.2) is not valid.
  It must be set to hold the path to an Oracle installation directory
  on this machine (or a machine with a compatible architecture).
  For an Instant Client install, the directory should include an sdk subdirectory.
  See the appropriate README file for your OS for more information.
  ABORTED!
Running make test
  Make had some problems, maybe interrupted? Won't test
Running make install
  Make had some problems, maybe interrupted? Won't install
Run Code Online (Sandbox Code Playgroud)

上面提到了“sdk”目录,但 rpm 根本没有该目录:

# rpm -ql oracle-instantclient11.2-devel | grep -i sdk
#
Run Code Online (Sandbox Code Playgroud)

感谢您提供有关 Oracle 安装和使用的任何提示和有用提示。那里有很多 Oracle 信息,但通常假设 Oracle 安装在同一台计算机上。

DCo*_*kie 1

对于问题#1,要访问远程数据库,ORACLE_SID 是无关紧要的。ORACLE_SID仅当客户端和服务器运行在同一主机上时才有用。给定您的 tnsnames.ora 文件,您应该能够使用以下命令连接到远程数据库:

sqlplus my_user@some_string
Run Code Online (Sandbox Code Playgroud)

你也可以使用

sqlplus my_user/my_password@some_string
Run Code Online (Sandbox Code Playgroud)

然而,我通常回避在命令行上提供密码 - snoopy 用户和 ps 命令有时会泄露密码。让数据库提示您输入密码。事实上,我刚刚养成了这样发出 sqlplus 命令的习惯:

sqlplus /nolog
Run Code Online (Sandbox Code Playgroud)

然后在提示问题

connect my_user/my_password@some_string
Run Code Online (Sandbox Code Playgroud)

甚至没有人看到您连接的用户或数据库,而且我从来不需要考虑它。

至于问题2,无法帮助你。

编辑:

好吧,也许我可以帮忙解决#2。我找到了有关使用 DBD 和即时客户端的链接。显然你还必须下载/安装 sdk 即时客户端。请参阅链接中的步骤 3。