我正在尝试设置 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
并将以下变量添加到我的.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
/etc/tnsnames.ora
我将从运行 Oracle 数据库的远程站点的同事收到的信息写入了该文件:
some_string =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = my_address)(PORT = my_port))
)
(CONNECT_DATA =
(SERVICE_NAME = PDTT)
)
)
好消息是,我现在可以通过运行以下命令从 CLI 进行连接
sqlplus 'my_user/my_password@//my_address:my_port/PDTT'
然后可以通过以下命令查看一些表格:
select table_name from user_tables;
而且我已经sudo pecl install oci8
成功运行,添加了包含以下内容的文件/etc/php.d/oci8.ini
:
extension=oci8.so
并可以看到以下 phpinfo() 输出
现在我的问题和问题是:
1) 我应该如何设置 ORACLE_SID 变量以及设置后如何调用 sqlplus?我可以/应该在 PHP 和 Perl 脚本中使用 ORACLE_SID 吗?
2) 我运行sudo -E perl -MCPAN -e shell
它,在安装其他 Perl 模块时它运行良好,但对于“安装 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
上面提到了“sdk”目录,但是 rpm 根本没有该目录:
# rpm -ql oracle-instantclient11.2-devel | grep -i sdk
#
感谢您提供任何有关 Oracle 安装和使用的提示和有用技巧。那里有很多 Oracle 信息,但通常假设 Oracle 安装在同一台机器上。
答案1
对于问题 1,要访问远程数据库,ORACLE_SID 无关紧要。只有当客户端和服务器在同一主机上运行时,ORACLE_SID 才有用。有了您的 tnsnames.ora 文件,您应该能够使用以下命令连接到远程数据库:
sqlplus my_user@some_string
你也可以使用
sqlplus my_user/my_password@some_string
但是,我通常不愿意在命令行上提供密码 - 爱管闲事的用户和 ps 命令有时会泄露密码。让数据库提示您输入密码。事实上,我刚刚养成了发出 sqlplus 命令的习惯:
sqlplus /nolog
然后在提示问题
connect my_user/my_password@some_string
并且没有人看到您连接的用户或数据库,而我永远不需要考虑它。
至于问题#2,我无法帮助你。
编辑:
好吧,也许我可以帮忙解决第二个问题。我发现此链接关于使用 DBD 与即时客户端。显然您还必须下载/安装 sdk 即时客户端。请参阅链接中的步骤 3。
答案2
我也遇到了同样的问题。已解决,调整环境变量 ORACLE_HOME,如下所示:
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
在 $ORACLE_HOME 内部我有相应的子目录:
垃圾桶 库 开发工具包
之后我可以安装数据库::Oracle正好。
答案3
1)如果您想省略@connect_string,您可以将TWO_TASK 环境变量设置为名称tnsnames别名(在本例中为some_string)。
在 Windows 上使用 LOCAL 变量可以实现相同的效果。
2) 听起来 sudo 正在重置您的环境变量。您需要将 $ORACLE_HOME 和其他变量添加到 sudoers 文件中的 env_keep 行。将讨论对 sudoers 文件进行的其他更改,这些更改将实现相同的效果这里。