Oracle Database Instant Client
http://www.oracle.com/technetwork/database/features/oci/ic-faq-094177.html
本文内容
- Instant Client 一般问题与回答
- Instant Client 可以做什么?
- Instant Client 是否收费?
- Instant Client 是否支持 Pro*C?
- Instant Client 是否支持 SQL*Plus?
- Instant Client 是否可以使用 LDAP?
- 独立软件供应商(Independent Software Vendors,ISV)是否可以捆绑 Instant Client?
- Instant Client 是否可以重新部署?
- Instant Client 与不同版本数据库的互操作性如何?
- Instant Client 是否用 Oracle Names 运行?
- 如何在 Instant Client 模式指定连接?
- 如何保证 Instant Client 正在使用的是我的 "tnsnames.ora" 文件?
- Windows 上的 Instant Client 如何使用注册表设置?
- Instant Client 如何与 ORACLE_HOME 交互?
- Instant Client 如何与一个现存的、基于 ORACLE_HOME 客户端的安装进行交互?
- Instant Client 对 Oracle 环境变量都有哪些行为的变化?
- Instant Client 常见错误
- 为什么得到 "message file not found" 错误信息?
- 当用 Instant Client 运行你的应用程序时,为什么看到一个增加虚拟内存的提示?
- PL/SQL Developer 连接数据库服务器时提示 "无法加载 DLL (oci.dll)"
- PL/SQL Developer 连接数据库服务器时提示 "ORA-12154: TNS:无法解析指定的连接标识符"
- PL/SQL Developer 连接数据库服务器时提示 "ORA-12737:instant client light :不支持服务器字符集 ZHS16GBK"
- PL/SQL Developer 可以成功连接数据库服务器,但是应用程序抛出异常 "'Oracle.DataAccess.Client.OracleConnection' 类型初始值设定项引发异常"
- 演示使用 Instant Client
- 参考资料
- 修改记录
Oracle Instant Client 一般问题与回答
Instant Client 可以做什么?
Instant Client 可以在不安装完整的 Oracle 客户端的情况下,运行你的 OCI、OCCI、Pro*C、JDBC 和 ODBC 应用程序。另外,Instant Client 支持 SQL*Plus。从 Instant Client 10.2 开始,可以通过 Instant Client SDK 用 OCI 和 OCCI 开发应用程序。
Instant Client 是否收费?
Instant Client 是完全免费的,用于开发或产生环境。但用户只能调用 Oracle 服务。
Instant Client 是否支持 Pro*C?
是。Unix 平台从 Instant Client 10.2.0.x 开始支持 Pro*C,但 Windows 上目前还不支持。
Instant Client 是否支持 SQL*Plus?
是。
Instant Client 是否可以使用 LDAP?
是。从Instant Client 10.1.0.4 开始支持 LDAP。
独立软件供应商(Independent Software Vendors,ISV)是否可以捆绑 Instant Client?
是。
Instant Client 是否可以重新部署?
是。参考 Instant Client 许可证:http://www.oracle.com/technology/software/htdocs/client_lic.html
Instant Client 与不同版本数据库的互操作性如何?
兼容各个版本的数据库。
下面一些问题关系到如何在不安装标准的 Oracle 客户端的情况下,仅仅利用复制 Instant Client 以及适当的配置连接 Oracle 数据库。
Instant Client 是否用 Oracle Names 运行?
否。Instant Client 不用 Oracle Names。Instant Client 向后兼容,但不支持现在已经过时的功能,包括 Oracle Names。
如何在 Instant Client 模式指定连接?
所有的 Oracle 网络命名方法都可以在 Instant Client 模式下运行,无需使用 ORACLE_HOME 或 TNS_ADMIN(用来定位配置文件,如 tnsnames.ora 或 sqlnet.ora)。特别地,可以指定形式的连接字符串:
一个 SQL 连接 URL 字符串的形式:
//host:[port][/service name]
例如:
//dbase-server-5:4321/ORDERS
而一个 Oracle 的网络键值对。例如:
"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=dlsun242)
(PORT=5521))
(CONNECT_DATA=(SERVICE_NAME=bjava21)))"
如果设置了 TNS_ADMIN 环境变量,那么就使用它指定的配置文件。
如果没有设置 TNS_ADMIN 环境变量,以及使用 TNSNAMES 条目,如 inst1,等等,则必须设置 ORACLE_HOME 环境变量,并且期望配置文件位于 $ORACLE_HOME/network/admin 目录。
注意,在这种情况下,ORACLE_HOME 变量用来定位 Oracle 网络配置文件,而客户端代码库组件(OCI、NLS 等等)不会使用 ORACLE_HOME 变量的值。
不支持 bequeath adapter 或空连接字符串。但使用空连接字符串的一个方法是,在 UNIX 系统上设置 TWO_TASK 环境变量为 tnsnames.ora 文件路径或一个 Oracle 网络键值对;而 Windows 上设置 LOCAL 变量。如果 TWO_TASK 或 LOCAL 变量设置为 tnsnames.ora 文件路径,那么 tnsnames.ora 文件必须能够被必须是能够被 TNS_ADMIN 或 ORACLE_HOME 设置加载。
Instant Client 如何与 ORACLE_HOME 交互?
只要库加载路径包含 Instant Client 文件目录(例如 instantclient 目录),并在 ORACLE_HOME 中的库目录之前,那么应用程序将在 Instant Client 模式下操作,就不会再使用 ORACLE_HOME 中的库。
Instant Client 对 Oracle 环境变量都有哪些行为的变化?
环境变量 ORA_NLS33、ORA_NLS32 和 ORA_NLS 在 Instant Client 模式下被忽略。ORA_TZFILE 环境变量应设置为大的时区文件的名称,而不是它的完整路径。其他环境变量(如 NLS_LANG)在行为上没有任何变化。
Windows 上的 Instant Client 如何使用注册表设置?
Special settings for Instant Client enabled applications can be set in the registry for all users or on a per-user basis.
- 使用注册表编辑器(regedit 或 regedt32),在 HKEY_LOCAL_MACHINE\SOFTWARE 下进行全局设置(或在 HKEY_LOCAL_MACHINE\HKEY_CURRENT_USER\SOFTWARE 下为每个特定用户进行设置)。
- 添加 ORACLE 组键。
- 在 ORACLE 键内添加你需要的新值(NLS_LANG、TNS_ADMIN 等)。
Instant Client 如何与一个现存的、基于 ORACLE_HOME 客户端的安装进行交互?
如果在你的机器上已经安装了 Oracle 客户端,那么建议:
- 不要解压或复制 Instant Client 库到 ORACLE_HOME/lib 或 ORACLE_HOME/bin 目录,以避免覆盖文件,处于不一致的状态。一般地,建议把 Instant Client 库单独放到一个干净的目录。
- 不要把 Instant Client 和 Oracle Client 目录的路径都放到环境变量指定的库路径中,无论以什么顺序。请在库的路径(LD_LIBRARY_PATH 或 PATH,依赖系统平台)中使用它们其中一个,不能都使用,这是基于你使用的版本。
如何保证 Instant Client 正在使用的是我的 "tnsnames.ora" 文件?
必须设置 TNS_ADMIN 环境变量或设置相应的注册表键值(值为 tnsnames.ora 绝对路径)。这样将保证,当你运行 Instant Client 时,正在使用正确的 tnsnames.ora 文件。
Instant Client 常见错误
为什么得到 "message file not found" 错误信息?
一些 Oracle 应用程序在 Instant Client 下会验证。一旦验证完成,该消息就会消失。
当用 Instant Client 运行你的应用程序时,为什么看到一个增加虚拟内存的提示?
The Instant Client libraries occupy a virtual address space that is equal to the size of the files. However, only frequently used error messages from the libraries occupy physical memory. Under most cases, the physical memory load is a few kilobytes despite the larger reserved virtual address space.
以下是我在 Windows 7 家庭版上连接 Oracle 数据库所遇到的问题。
PL/SQL Developer 连接数据库服务器时提示 "无法加载 DLL (oci.dll)"
当你客户端的操作系统为 Windows 7 64 位,而数据库服务器是 Oracle 32/64 位时,你若想使用 PL/SQL Developer 连接数据库服务器,就只能安装 32 位相关的 Oracle 客户端。因为 PL/SQL Developer 是 32 位,它不能加载 64 位的 OCI.dll。
另外,不能在 Windows 7 64 位操作系统安装完整的 Oracle 客户端,甚至通不过安装前的检查。因此,只能安装 Instant Client 或 ODAC。如只是要用像 PL/SQL Developer 这样的三方工具,安装并配置 Instant Client 就行。如果除了这样,还要一个开发环境,比如使用 ODP.NET,那就要安装 ODAC。
PL/SQL Developer 连接数据库服务器时提示 "ORA-12154: TNS:无法解析指定的连接标识符"
从 Oracle 官网下载、解压,并复制 Instant Client 到本地后,若没有正确配置 TNS_ADMIN 和 ORACLE_HOME 环境变量,意味着 PL/SQL Developer 不能正确找到连接数据库服务器所需的相关文件或库,就会提示该信息。
PL/SQL Developer 连接数据库服务器时提示 "ORA-12737:instant client light :不支持服务器字符集 ZHS16GBK"
当你客户端的操作系统为 Windows 7 64 位,而数据库服务器是 Oracle 11g 32/64 位,并且安装时指定的字符集是 ZHS16GBK 时,上面讲到,Oracle 数据库附带的完整客户端是按不上的,只能搞个 Instant Client,虽说 Instant Client 是向下兼容的,可你要是找个 Instant Client 10g 来用,即便正确配置了 TNS_ADMIN 和 ORACLE_HOME 环境变量,PL/SQL Developer 连接数据库服务器时,就会提示不支持 ZHS16GBK。因为 Instant Client 10g 只支持英文。
PL/SQL Developer 可以成功连接数据库服务器,但是应用程序抛出异常 "'Oracle.DataAccess.Client.OracleConnection' 类型初始值设定项引发异常"
此时,你需要的不仅仅是用 PL/SQL Developer 连接数据库服务器,你还需要一个开发环境。因此,当你客户端的操作系统为 Windows 7 64 位,数据库服务器是 Oracle 11g 32 位,开发环境是 VS 时,正确安装 Instant Client 11g 只能让你的 PL/SQL Developer 可以连接上 Oracle 数据库,但是使用 ODP.NET 的 VS 不能连接数据库。因为没有 Oracle.DataAccess.dll,即便你复制到应用程序直接引用,也是不行的。
关键问题在于 ODP.NET 在你开发环境和 Oracle 客户端之间还不存在任何联系。此时,别按 Instant Client 了,直接 ODAC。你会发现,它们安装后的目录结构完全相同,只是内容上的不同。
将 $ORACLE_HOME/NETWORK/ADMIN 目录复制到 ODAC 的安装目录,VS 就可以连接 Oracle 数据库。
演示使用 Instant Client
环境
- 服务器端操作系统 Windows 2003
- 服务器端数据库 Oracle 11g Release 1 (11.1) 32 位
- 客户端操作系统 Windows 7 64 位家庭版
- 客户端连接数据库三方工具 PL/SQL Developer 7
- 客户端数据库客户端 instantclient basic 32 位 11.2.0.1.0
PL/SQL Developer 连接 Oracle 数据库的配置
假设你把 instantclient basic 复制到 "C:\app\product\11.2.0\instantclient_11_2"。那么,
- 设置操作系统环境变量 ORACLE_HOME 为 C:\app\product\11.2.0\instantclient_11_2
- 设置操作系统环境变量 TNS_ADMIN 为 $ORACLE_HOME\NETWORK\ADMIN
- 随便从哪个地方复制 sqlnet.ora 和 tnsnames.ora 文件到 $ORACLE_HOME\NETWORK\ADMIN 路径下,并添加数据库连接到 tnsnames.ora。
ora11 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.247)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11)
)
)
其中,HOST 为数据库服务器的 IP 地址;SERVICE_NAME 为数据库实例。
此时,PL/SQL Developer 就应该可以连接 Oracle 数据库。另外,instantclient basiclite 是 instantclient basic 的精简版,还是不要用的好。
配置时,像 sqlnet.ora 和 tnsnames.ora 文件的位置,最好不要改变。
目前为止,我见过五个跟 Oracle 客户端有关的程序。它们的侧重点不同,使用的场景和用户群不同:
- Oracle 服务器端自安装完之后,你会在 instantclient 目录,里边除了 NETWORK\ADMIN,几乎什么都没有。
- Oracle 客户端,这个是安装程序。
- Oracle instant client basic 程序。这个不需要安装,直接复制就行。
- Oracle instant client basiclite 程序。比 Oracle instant client basic 还要小,是精简版。
- ODAC 程序,更 Oracle 客户端安装程序类似。用于开发。
无论它们有什么不同,目录结构都是一样的。
开发环境配置
假设你的开发环境是 VS,并使用 ODP.NET 连接 Oracle 数据库。
以上只能保证 PL/SQL Developer 能连接 Oracle 数据库。但是你开发的应用程序却不能。此时,别安装 instantclient basic,而是安 ODAC 更方便。如果你将 ODAC 安装到 "C:\app\product\11.2.0\instantclient_11_2",那么,
按照上面的三个设置,你用 VS 开发的应用程序就可以连接 Oracle 数据库。
参考资料
- Instant Client Downloads http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
- Oracle Database Instant Client http://www.oracle.com/technetwork/database/features/instant-client/index-100365.html
- 32-bit Oracle Data Access Components (ODAC) with Oracle Developer Tools for Visual Studio http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html
修改记录
- 第一次 2012-8-21 [ADD]