十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ODAC Xcopy部署详解:从解压到连接Oracle数据库的全流程

ODAC Xcopy部署详解:从解压到连接Oracle数据库的全流程 简介《ODAC1120320Xcopy_32bit.zip》是面向.NET开发者的Oracle数据访问组件ODAC驱动包专为连接Oracle 11.2.0.3数据库设计采用32位编译版本适用于需要从32位.NET应用程序访问Oracle数据库的场合。资源包为ZIP压缩格式整体约51.43MB文件类型与数量未单独统计核心内容为ODAC驱动及配套安装脚本可满足开发、测试环境快速部署需求。目前已有1131人学习/下载在CSDN同类资源中具备一定参考价值。该包使用Xcopy方式提供安装执行INSTALL ALL指定安装目录后再运行configure.bat将驱动注册到全局程序集缓存相比传统安装包更为轻量、便于迁移与备份。对在.NET项目中集成Oracle 11g数据库、排查连接驱动版本冲突的开发人员而言本驱动能显著简化环境配置过程降低连接失败概率是构建数据库应用时实用的基础组件。 写这篇东西的起因是上周帮同事排查一个老项目的数据库连接问题对方从共享盘里翻出一个命名为ODAC1120320Xcopy_32bit.zip的压缩包第一反应是问我“这跟Oracle客户端安装包有什么区别直接解压能连数据库吗”。说实话这问题我在不同公司见过不下十次Xcopy部署每次都被当成普通解压绿色版来操作然后连不上库就开始怀疑人生。花点时间把这个包讲清楚后面遇到类似场景至少不会手忙脚乱。这篇笔记按照“这个包是什么、装之前要确认什么、完整部署怎么做、容易踩哪些坑”的顺序来写适合开发、运维、实施岗的同学参考尤其是还在维护Oracle 11g时代老系统的朋友。1. 这个zip包到底是什么ODAC Xcopy部署的定位1.1 版本号怎么读先把文件名拆开看这串字符本身信息量就很大ODAC是 Oracle Data Access Components 的缩写翻译过来就是Oracle数据访问组件包含我们开发.NET应用时最常用的Oracle.DataAccess.dllODP.NET、Oracle Providers for ASP.NET、ODAC相关的Instant Client基础库。1120320实际是11.2.0.3.20的压缩写法表示这是Oracle 11g R211.2.0.x时代的组件patch set编号为3最后面的20对应的是第20个补丁集更新PSU。这个版本在2013年前后是比较主流的版本今天在不少老系统里依然能见到。Xcopy指部署方式即直接把文件拷到目标机器跳过Oracle Universal InstallerOUI的交互式安装流程类似把整个程序目录用xcopy命令复制过去就能使用的做法。32bit说明组件是32位编译版本运行环境、进程位数、数据库客户端位数都需要匹配。zip表示分发格式是压缩包不是exe安装程序。这个组合决定了它的适用面适合批量复制到多台Windows服务器、适合在运维脚本里做静默部署、适合不想动原有Oracle客户端配置的隔离环境。我自己更常用的场景是在一台没有安装任何Oracle组件的Windows Server上快速为.NET应用准备一套可用的数据库访问环境。1.2 为什么有人放着常规安装包不用非要用Xcopy方式常规ODAC安装程序一般是一个几百MB的exe界面引导、写注册表、配置环境变量一气呵成。但它在自动化运维场景里很吃亏安装过程需要交互或者至少得保证安装参数频繁变动时不出错卸载也麻烦改机器上的全局配置遇到权限受限的服务器安装程序可能压根跑不起来。Xcopy部署解决的就是这些痛点。它不依赖OUI解压后运行一个批处理完成任务整个过程可控、可回滚、可以在多台机器上重复执行。代价是它不会帮你把所有关联的全局配置处理得那么“贴心”有些细节需要人工补齐。这里插一句容易混淆的点有人认为Xcopy部署就是“解压即用”完全不需要安装这其实是误解。它确实可以做到把DLL放在应用目录下直接引用但那种方式只能算“application-local部署”功能受限。官方推荐的Xcopy部署仍然需要执行安装脚本去注册GAC、machine.config、性能计数器只是不跑OUI图形界面而已。2. 动手之前把这几件事先确认好2.1 32位还是64位别等装完才发现选错文件名里明确写了32bit决定部署前先问自己三个问题目标应用编译成的是什么平台承载应用的进程比如IIS应用池是什么位数数据库服务器上已有客户端是什么位数很多人只盯着操作系统位数Windows是64位就觉得应该装64位组件这是个常见误区。一个32位编译的.NET应用程序加载32位版本的Oracle.DataAccess.dll是没问题的反过来一个64位进程尝试加载32位Oracle原生客户端DLL运行时会直接抛出BadImageFormatException这就是位数不匹配的典型症状。如果你的服务器上同时存在32位和64位应用最好分开目录部署不要混用。这里列一个简单判断表应用进程位数建议部署版本常见场景x8632位ODAC 32bit32位Office插件、IIS应用池启用32位、老式COM组件调用ODP.NETx6464位ODAC 64bit64位.NET服务、IIS默认应用池、控制台/Windows服务混合两套分开部署同一台机器同时跑32位和64位应用通过DllPath隔离如果之前已经装了64位ODAC现在临时要再上个32位注意不要往同一个GAC里乱塞两个版本的程序集完全可能互相覆盖后续排查难度直接翻倍。2.2 .NET环境与系统确认ODAC 11.2.0.3.20这个版本分两类驱动目录odp.net20对应.NET Framework 2.0/3.0/3.5odp.net4对应.NET Framework 4.x。装之前先到目标机器上执行regedit或PowerShell确认目标.NET版本已经正确安装避免解压完跑脚本时提示注册失败。操作系统方面Windows 7、Windows Server 2008/2008 R2、Windows Server 2012都是这个版本能正常服役的环境Win10/Server 2016以上也能用但连接老库时要注意Oracle官方对操作系统的支持矩阵新系统上偶发的TCP/IP相关连接连不上问题往往不是组件问题而是系统默认加密、协议设置与老库不兼容。2.3 拿到压缩包后第一步看installed_components别急着解压跑install.bat。用解压工具打开zip后先找到一个叫installed_components的文件里面列出的就是这个Xcopy包里实际包含的组件清单。我遇到过不止一次项目文档写的是一套组件列表实际下载的包却是阉割版只够应急连库根本跑不了ASP.NET Provider。同时检查根目录下的readme.txt里面通常会注明该版本支持的.NET版本范围、已知问题和部署说明。这一步花不了两分钟但能帮你避开“装完发现少组件”的大坑。在正式开始安装前还建议用文件校验工具确认压缩包完整性。从Oracle官网下载页面可以看到对应的校验值本地执行Get-FileHash .\ODAC1120320Xcopy_32bit.zip -Algorithm SHA256把算出的哈希值和官网记录比对一致再继续避免传输过程中文件损坏这种问题在跨网传输时尤其常见。3. 完整部署步骤含可直接复制的命令3.1 解压并规划目录组件包解压后的目标目录建议放在一个固定路径比如C:\oracle\odac\x86不要直接放在系统盘的临时目录或C盘根目录。原因是后续环境变量、DLL查找路径、TNS配置都与这个目录强相关路径一旦变化已经注册好的组件会失效。路径规划好后用管理员权限打开命令提示符进入解压目录先确认一下目录结构cd /d C:\oracle\odac\x86 dir正常情况下可以看到install.bat、uninstall.bat、installed_components以及odp.net20、odp.net4、network、ASP.NET等目录。3.2 执行install.bat自动注册安装脚本是这个部署方式的核心它会自动完成以下操作把对应版本的Oracle.DataAccess.dll注册到全局程序集缓存GAC在machine.config中注册DbProviderFactoriesODP.NET配置性能计数器oraperf写入必要的注册表项记录ODP.NET的DllPath等信息执行方式很简单install.bat必须使用管理员权限运行否则GAC注册和machine.config写入都会失败。脚本运行过程中如果出现红字报错不要关掉窗口先截图或复制日志再根据报错内容去排查。常见的失败原因是权限不足或者机器上已有更高版本的ODP.NET导致注册冲突。正常执行完毕后可以用gacutil或PowerShell验证程序集是否进入GAC。如果机器上装了Visual Studio的开发者命令行工具直接执行gacutil /l Oracle.DataAccess没有gacutil也不影响打开C:\Windows\assembly.NET 2.0/3.5的GAC目录或C:\Windows\Microsoft.NET\assembly\GAC_32.NET 4的GAC目录检查是否存在Oracle.DataAccess对应记录即可。3.3 配置tnsnames.ora与连接字符串Xcopy包里自带一个network\admin样例目录里面通常有示例用的tnsnames.ora和sqlnet.ora。把样例文件复制出来改造成项目实际使用的连接信息是部署后的必要步骤。我对这步的建议是单独建一个独立的TNS管理目录比如C:\oracle\tns把正式的tnsnames.ora放进去然后设置系统环境变量TNS_ADMIN指向该目录。这样做的好处是以后数据库迁移或新增服务名时只需要修改这一个文件不需要重新部署ODAC。tnsnames.ora中一个典型条目的格式如下ORCL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) ) (CONNECT_DATA (SERVICE_NAME orcl) ) )配置好之后写一段最基础的连接代码进行验证。新建一个控制台项目添加对Oracle.DataAccess.dll的引用写如下代码using System; using Oracle.DataAccess.Client; class Program { static void Main() { // 方式一使用TNS服务名需要TNS_ADMIN环境变量 string connStr1 Data SourceORCL;User Idscott;Passwordtiger;; // 方式二使用EZConnect格式无需tnsnames.ora string connStr2 Data Source//192.168.1.100:1521/orcl;User Idscott;Passwordtiger;; using (OracleConnection conn new OracleConnection(connStr2)) { conn.Open(); Console.WriteLine(连接成功数据库版本 conn.ServerVersion); } } }如果第一种方式报ORA-12154: TNS:could not resolve the connect identifier specified优先检查TNS_ADMIN是否设置、目录名和文件名是否拼错tnsnames.ora很容易被写成tnsname.ora。第二种方式不依赖TNS配置适合做快速连通性验证能连上就说明Oracle网络层没有问题。3.4 在Visual Studio里添加引用开发机上引用32位DLL时最稳妥的方式是找到odp.net4\bin\2.x\Oracle.DataAccess.dll对应.NET 4或odp.net20\bin\Oracle.DataAccess.dll对应.NET 2.0直接添加引用到项目。添加完毕后在解决方案资源管理器里选中该DLL打开属性面板确认“复制本地”Copy Local设置为True。这一步非常重要否则发布站点或部署服务时找不到DLL运行时会提示“未能加载文件或程序集Oracle.DataAccess”。如果项目目标是AnyCPU建议改成x86尽量让项目编译平台和ODAC一致减少位数冲突风险。4. 部署之后最容易翻车的5个问题4.1 “加载程序集失败”位数不匹配这是Xcopy部署后出现频率最高的问题报错信息类似Could not load file or assembly Oracle.DataAccess or one of its dependencies. An attempt was made to load a program with an incorrect format.定位方法很直接打开IIS管理器双击目标站点的应用程序池把“启用32位应用程序”Enable 32-Bit Applications设置为True。如果应用是独立控制台或Windows服务检查项目编译类型是否为x86以及启动进程本身是否被强制为64位。4.2 与应用服务器上已有Oracle客户端冲突有些机器上已经装了64位的Oracle完整客户端此时再看GAC里可能同时存在多个Oracle.DataAccess。CLR加载时会先找GACGAC里如果有不匹配的版本就可能加载到错误的DLL。解决办法是显式指定DLL查找路径。ODP.NET支持在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\{版本号}下设置DllPath也可以应用代码中提前设置OracleConfiguration.DllPath C:\oracle\odac\x86\bin;注意这会绕过全局默认路径影响整个进程内所有Oracle连接所以只在确实需要隔离时使用。4.3 TNS服务名解析不出来前面说过优先检查TNS_ADMIN。再补充一个容易忽略的点如果同时配置了TNS_ADMIN和ORACLE_HOME而且ORACLE_HOME\network\admin下也有一个tnsnames.ora不同组件解析顺序可能完全不同结果就是两个目录下的配置互相干扰。我的习惯是Xcopy部署场景下不设置ORACLE_HOME只设置TNS_ADMIN指向独立目录这样解析路径唯一排查问题也省事。4.4 ASP.NET站点报错需要配置machine.config如果项目用的是Oracle Providers for ASP.NET如System.Web.Security的OracleMembershipProviderinstall.bat理论上会在machine.config里注册DbProviderFactories。但有时因为权限、杀毒软件拦截等原因注册步骤被静默跳过导致运行时提示找不到OraAspNetAspNetProviderFactory。这时可以打开C:\Windows\Microsoft.NET\Framework\{版本号}\CONFIG\machine.config在system.dataDbProviderFactories节点下检查是否有Oracle相关条目。缺失时要么重新以管理员身份运行install.bat要么把对应配置节复制到应用的web.config中并在连接字符串中明确指定provider名称connectionStrings add nameOracleConn providerNameOracle.DataAccess.Client connectionStringData SourceORCL;User Idscott;Passwordtiger; / /connectionStrings4.5 GAC里多个Oracle.DataAccess版本打架老机器上遗留着旧版ODAC新部署的版本又覆盖进去这时候可能出现“部署成功但程序依然用老版本”的情况。原因是程序集绑定优先匹配强名称版本GAC里高版本并不会自动替代低版本。排查时可以先确认运行时到底加载的是哪个版本在调用连接前输出程序集完全限定名Console.WriteLine(typeof(OracleConnection).Assembly.FullName);正常情况下会输出Oracle.DataAccess, Version4.112.3.20, Cultureneutral, PublicKeyToken89b483f429c47342之类的信息。如果版本和预期不符可以在应用配置文件中增加程序集绑定重定向runtime assemblyBinding xmlnsurn:schemas-microsoft-com:asm.v1 dependentAssembly assemblyIdentity nameOracle.DataAccess publicKeyToken89b483f429c47342 / bindingRedirect oldVersion4.112.0.0-4.112.3.20 newVersion4.112.3.20 / /dependentAssembly /assemblyBinding /runtime这里PublicKeyToken要填实际部署的DLL对应的值不要照抄网上的模板。5. 部署小技巧与个人经验几次踩坑后我形成了固定的部署流程先解压到固定目录看installed_components确认组件全再设置TNS_ADMIN用独立目录管理tnsnames然后管理员运行install.bat最后用EZConnect格式写一段控制台程序做连通性验证。这套流程走下来绝大多数部署问题都能在五分钟内定位。再分享一个容易被忽视的点Xcopy包没有内置卸载程序对应的全部信息但根目录的uninstall.bat在需要回滚时要优先使用。直接删目录、手动Delete GAC里的DLL都会留下残留注册表项影响下次安装其他版本。如果项目用的是新一些的托管版ODP.NETOracle.ManagedDataAccess.dll就不会有32位/64位冲突问题也不需要安装本机Oracle Client那是另一套部署方式了。但面对存量Oracle 11g系统这个32位Xcopy包依然是很可靠的方案把流程跑顺效率比重新装一个完整Oracle Client快得多。本文还有配套的精品资源点击获取
返回列表