多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

ArcSDE 10.2与Oracle 10g/11g:安装部署、服务注册与迁移排障

ArcSDE 10.2与Oracle 10g/11g:安装部署、服务注册与迁移排障 简介这是一个面向微软视窗平台的ArcSDE 10.2安装资源专为需要在Oracle 10g或11g数据库环境中部署空间数据管理的GIS工程师与数据库管理员准备。作为Esri地理信息系统套件的核心组件空间数据库引擎承担着空间数据存储、多用户并发访问和版本控制等任务可支撑土地管理、城市规划、环境监测等企业级GIS应用的建设。压缩包约为73.59兆字节共含14个文件以安装引导程序、安装数据包和压缩包为主另外还有帮助文档、配置文件和网页式安装说明。安装程序负责组件配置与注册数据包提供安装源文件帮助文档和配置文件便于用户查阅与排错。资源已按Oracle 10g、11g分成两组便于根据现有数据库环境直接选用已有212人浏览学习。借助这套安装包读者可以独立完成ArcSDE 10.2的部署并对照附带的说明文件梳理数据库连接与启用要点。虽然该技术后续逐渐被企业级地理信息系统平台替代但在存量系统中仍被广泛使用掌握其安装配置方法对系统迁移、运行维护和二次开发依然具有实用价值。1. ArcSDE 10.2 与 Oracle 10g/11g这套安装包解决的到底是哪类问题还在运维老系统的同行大概率都遇到过这种场景某单位的 GIS 数据库跑在 Oracle 11g 上前端用的是 ArcGIS Desktop 10.2后台空间数据引擎用的是 ArcSDE 10.2。系统稳定跑了五六年某天突然需要迁移到新服务器或者开发库要排一套一模一样的测试环境你才发现安装包当年是接手同事的U盘拷来的干干净净一个安装包目录但装的时候哪步在前哪步在后、sde 用户怎么建、Server 服务怎么注册全靠回忆。这套 ArcSDE 10.2 for Oracle 10g/11g 的安装包解决的就是这个层面的问题——它不是拿来研究空间数据引擎原理的而是给 Oracle 10g/11g 环境准备一份能直接落地的 ArcSDE 安装介质帮助从业者在换机器、搭测试库、恢复坏库的时候把那个老版的中间件环境以最快速度重建起来。适合三类人负责老 GIS 系统迁移的工程师、要搭与生产完全一致开发环境的技术人员、以及维护存量 ArcGIS 10.2 平台的数据库管理员。2. 部署 ArcSDE 10.2 的软件栈与关键参数版本对应关系、安装包选型与连接配置2.1 中间件、数据库与操作系统的组合关系ArcSDE 10.2 官方支持的操作系统覆盖 Windows Server 2008/2012 以及主流 Linux 发行版数据库端明确支持 Oracle 10g R2 和 11g R2这两个版本对应关系常被忽视。很多人以为只要是 OracleArcSDE 装上就能连实际不是这样。ArcSDE 10.2 调用 Oracle 的接口层有自己的编译版本对 10g 和 11g 的 oci 库调用方式有区别装错了版本会在后续建 sdedb 和启动服务时暴露出各类连接异常后面避坑章节会讲到具体症状。拿到安装包后先做的事情不是执行安装而是核对三件事第一数据库是 64 位还是 32 位ArcSDE 10.2 安装包分 x86 和 x64 两种选错位数会导致 st_geometry 的 so/dll 加载失败第二数据库字符集常见的是 ZHS16GBK 或 AL32UTF8这决定了后续建库脚本初始化时用哪个语言包第三ArcGIS 桌面的版本10.0、10.1、10.2 的 Desktop 连接 SDE 服务时协议版本略有差异10.0 的连接 10.2 的 SDE 会提示版本不符。这套安装包通常解压后是标准的 ArcSDE 安装目录里面包含 post installation 工具。在 Windows 平台安装包根目录下能找到 setup.exe 或 ArcSDE 的安装脚本在 Linux 平台常见的是 .tar.gz 或 .zip 包解压后运行 sdesetup 命令。某开发人员接手过一个 11g RAC 环境节点一和二都能正常连数据库但 ArcSDE 的安装包是装在共享存储上执行的结果初始化时在节点二上报出动态库找不到的问题最后把安装目录放到各节点本地盘才解决根源就是 Oracle 的 oci 库路径在 RAC 两个节点上不完全一致。在版本选择上如果是 Windows 环境优先选安装包自带完整 post installation 向导的版本如果是 Linux 环境注意查看安装包内是否附带独立的服务启动脚本有的精简包只带数据库初始化命令不附带服务注册脚本这种情况下需要手动注册系统服务后续小节会给出常见做法。2.2 安装前的数据库端检查项在运行 ArcSDE 安装程序之前数据库端的准备直接决定后续成败。我一般会按下面顺序检查每一步都有实际意义。第一步确认 Oracle 的监听器状态。ArcSDE 连接 Oracle 走的是 TNS 和 Oracle 监听监听起不来后面一切操作都白搭。用 Oracle 自带工具检查lsnrctl status常见结果是看到类似 service ORCL has 1 instance(s) 的输出。如果监听未启动用lsnrctl start启动。这里注意ArcSDE 建库阶段会对数据库执行大量 DDL 和存储过程调用监听不稳定会在中途抛 ORA-12541 或 ORA-12514。第二步确认 Oracle 的归档模式和进程数。ArcSDE 在创建几何库时要往系统表里写入元数据并注册存储过程这些操作会产生大量重做日志。生产库如果开了归档且归档目录空间不足建库会直接卡死进程数processes如果小于 150高并发连接时会出现 ORA-12520 或 ORA-00020。检查参数show parameter processes; show parameter sessions;常见做法是把 processes 调大到 300 以上sessions 调大到 600 以上。改完需要重启数据库生效这个调整要在维护窗口做不要在白天直接改。第三步检查 Oracle 的字符集。这一步非常关键很多 ArcSDE 建库报错都是字符集不一致引起的。查询方法select value from nls_database_parameters where parameter NLS_CHARACTERSET;常见结果是 ZHS16GBK。ArcSDE 10.2 初始化库时会在配置文件中写明字符集如果安装包里的模板字符集和数据库实际字符集不一致会在注册空间参考spatial reference时报出无效的坐标系值或乱码。遇到这种情况优先把安装包模板里的字符集改成和数据库一致而不是反过来改数据库。2.3 环境变量与连接配置在 Windows 上装 ArcSDE安装向导会自动配置注册表和环境变量但 Linux 上完全依赖手动配置。解压安装包后需要把 ArcSDE 可执行文件目录加入 PATH同时配置两个关键的环境变量export SDEHOME/opt/arcgis/arcsde10.2 export ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 export TNS_ADMIN$ORACLE_HOME/network/admin export LD_LIBRARY_PATH$SDEHOME/lib:$ORACLE_HOME/lib:$LD_LIBRARY_PATH这里有个细节SDEHOME 指向安装目录ORACLE_HOME 必须指向 Oracle 客户端的安装路径。如果机器上没有单独装 Oracle 客户端而数据库是远程的那安装 ArcSDE 的这台机器至少要有 Oracle 的 instant client并把 instant client 的库路径加到 LD_LIBRARY_PATH 里。某开发人员在迁移某模拟项目X 的 SDE 服务时因为忽略了 LD_LIBRARY_PATH 中 oci 库路径的优先级导致连接时报出 libclntsh.so 版本错误排查了整整一个下午才发现是系统的 LD_LIBRARY_PATH 里先找到了一个旧版 Oracle 客户端。连接配置方面ArcSDE 10.2 有两种连接模式。第一种是直接连接direct connection应用服务器通过 ArcSDE 的 Java 或 C API 直连数据库不需要独立的 SDE 进程第二种是服务连接service connectionArcSDE 作为独立服务监听 5151 端口应用连到 SDE 服务再由 SDE 服务转连数据库。Oracle 11g 环境下两者都需要先在数据库中创建名为 sde 的用户和 schema并授权相应角色。可见在配置连接之前建 sde 用户和 schema 是必须先完成的一步下一章就说这一步。3. 在 Oracle 中构建地理数据库从 sde 用户创建到 ArcSDE 服务注册3.1 准备 sde 用户与表空间ArcSDE 安装包内含的安装向导不会自动创建数据库用户这一步骤需要在数据库端手工完成。常规做法是先创建一个专门存放 ArcSDE 元数据的表空间再创建 sde 用户并授予相应权限。在 SQL*Plus 中以 sysdba 身份执行create tablespace sde_tbs datafile /u01/app/oracle/oradata/orcl/sde01.dbf size 2g autoextend on next 512m maxsize 32g; create user sde identified by sde_password default tablespace sde_tbs temporary tablespace temp quota unlimited on sde_tbs; grant connect, resource to sde; grant create table, create sequence, create trigger, create procedure to sde; grant create session to sde;逻辑说明表空间大小不是拍脑袋定的ArcSDE 的系统表数据量很小几何数据并不存在 sde schema 里而是存在业务用户表里所以这里 2g 起步、自动扩展到 32g 已经覆盖绝大多数场景。sde 用户密码不要直接用 sde生产环境要设足够复杂否则 Oracle 非法登录检查和等保测评都会把这作为一个风险点。执行完用户创建后还有一个容易被忽略的授权如果平台上有多个业务 schema 需要被 ArcSDE 管理sde 用户必须拥有对业务用户表的访问权限。常见做法是给 sde 用户授予所有业务表的 select、insert、update、delete 权限再对整个业务 schema 授权grant select, insert, update, delete on any table to sde; grant create any trigger, create any procedure to sde;注意select on any table属于系统级权限生产环境要慎重如果后续要做等保加固改成对具体 schema 批量授权更合规。某单位在等保测评中被要求清理数据库的 any 权限最后把 sde 授权收窄为select on 某业务用户.某表这种方式虽然前期授权麻烦但系统管理员的复查一次通过。3.2 执行 ArcSDE 后安装与建库用户和表空间创建完毕后回到 ArcSDE 安装目录执行后安装程序。在 Linux 平台命令路径是$SDEHOME/bin/sdesetup在 Windows 平台是安装向导里的 Post Installation 工具。执行建库常用命令cd $SDEHOME/bin ./sdesetup -o install -p sde_password -d ORACLE11G \ -u sde -P sde_password -H $SDEHOME \ -N -C ZHS16GBK参数说明-o install表示执行全新安装-d ORACLE11G指定数据库类型和版本ArcSDE 10.2 识别 Oracle 11g 用 ORACLE11G识别 Oracle 10g 用 ORACLE10G这个参数不能写错-u和-P对应数据库 sde 用户的账号密码-H指定 SDEHOME-N非交互模式-C指定字符集。整条命令的作用是在 Oracle 实例中创建 ArcSDE 的系统表、存储过程、函数、序列并在 SDEHOME 下生成运行配置文件。执行完成后最关键的是检查输出日志。常见做法是把输出重定向到文件然后检索是否有 ERROR 字样./sdesetup -o install -p sde_password -d ORACLE11G -u sde -P sde_password \ -H $SDEHOME -N -C ZHS16GBK /tmp/sdesetup.log 21 grep -i error /tmp/sdesetup.log常见失败场景中-C参数和数据库实际字符集不一致导致报出无法初始化空间参考的错是最耗时的一种。遇到这种问题不要反复重跑 sdesetup先确认数据库字符集再修改命令中的-C参数。注意 sdesetup 建库失败后如果重跑要先清理掉已经创建的部分系统表否则会报对象已存在。3.3 注册 ArcSDE 服务并验证连接建库完成后应用要连接 ArcSDE可以在 Windows 服务列表中把 ArcSDE 服务注册为系统服务。Linux 平台上注册命令是cd $SDEHOME/bin ./sdeservice -o create -p sde_password -d ORACLE11G -i esri_sde参数含义-o create创建服务信息-i esri_sde指定服务实例名这个实例名会映射到后续的services.sde文件中的端口配置。创建完服务信息后启动服务./sdemon -o start -p sde_password -i esri_sde ./sdemon -o status -i esri_sde如果sdemon -o status返回类似ArcSDE 10.2 for Oracle11g is up的输出说明服务已正常启动。开发环境中业务系统连接 ArcSDE 时通常走直接连接模式不走 5151 端口此时不需要启动 sde 服务只需要在 ArcGIS Desktop 的 Add Spatial Database Connection 里填写数据库实例名、sde 用户和密码并勾选直接连接选项。在验证环节一个经典的测试方式是用 ArcGIS 目录工具创建一个空的地理数据库要素集或者在 SQL*Plus 里查询 sde 特有表是否存在select table_name from user_tables where table_name like SDE% and rownum 20;典型输出应该包含 SDE_LAYERS、SDE_SPATIAL_REFERENCES、SDE_TABLE_REGISTRY、SDE_GEOMETRY_COLUMNS 等系统表。这些表是否存在是判断 ArcSDE 是否真正初始化成功的硬指标。如果这些表存在但 ArcSDE 服务起不来问题多半出在服务端口的占用或防火墙而不是建库环节。4. ArcSDE 10.2 踩坑记录版本、字符集与监听问题的真实排查4.1 现象sdesetup 报 ORA-00955 或对象重名错误现象执行sdesetup -o install过程中报出ORA-00955: name is already used by an existing object建库中断。原因上一次建库失败时ArcSDE 已经创建了部分系统表比如 SDE_LAYERS、SDE_VERSION 等再次执行建库命令时安装程序发现目标对象存在直接中断。解决先手动清理 sde 用户下残留的 SDE 系统对象再重跑。清理命令用 sysdba 登录drop user sde cascade;然后重新按上一章的步骤创建 sde 用户并授权再执行 sdesetup。某开发人员第一次碰到这问题花了半小时在堆日志里找原委实际上最快路径就是把用户删干净重建。但注意生产库不要直接 drop要做完备份再操作。4.2 现象sdemon 启动服务提示 instance not found现象建库成功sdemon -o start启动时提示ArcSDE Server instance not found服务起不来。原因sdeservice -o create这一步没有执行或者执行时指定的实例名与启动命令中的实例名不一致。ArcSDE 的服务注册信息存储在安装目录下的etc/services.sde文件中如果服务信息未写入sdemon 自然找不到实例。解决先确认 services.sde 文件内容cat $SDEHOME/etc/services.sde正常输出会包含类似esri_sde 5151/tcp的一行。如果没有这一行执行服务注册命令cd $SDEHOME/bin ./sdeservice -o create -p sde_password -d ORACLE11G -i esri_sde执行完再启动。注意如果用 root 用户执行了 sdeservice后续必须用同一用户启动 sdemon否则会因文件权限不一致出现各种奇怪问题。4.3 现象客户端连接时报 connection refused 或 listener does not currently know现象ArcGIS Desktop 连接 SDE 服务时报connection refused或 Oracle 监听器的listener does not currently know of service requested。原因这个场景十有八九是 SDE 服务的端口配置与 Oracle 监听器的服务注册信息不匹配。ArcSDE 服务连接模式下客户端先连 SDE 的 5151 端口SDE 服务再通过本机 Oracle 客户端连数据库。问题常出现在安装 ArcSDE 的机器上 TNSNAMES.ORA 中的服务名配置错误或远程数据库监听未注册对应服务。解决第一步先在安装 ArcSDE 的服务器上用 tnsping 验证tnsping ORCL如果 tnsping 不通修改$TNS_ADMIN/tnsnames.ora中的连接描述注意服务名要写成 Oracle 动态注册的服务名而不是实例名。第二步用 sqlplus 验证本地 Oracle 客户端能连接sqlplus sde/sde_passwordORCL第三步确认 ArcSDE 服务状态如果 5151 端口已被其他进程占用改服务端口或杀掉冲突进程。常见做法是在 services.sde 里把端口改掉然后重启 SDE 服务。某开发人员处理某跨平台系统的联通问题时最终发现是 TNSNAMES.ORA 里服务名多写了一个.example.com后缀截掉之后问题消失。4.4 现象新建的要素类中文属性值乱码现象通过 ArcGIS 向 ArcSDE 要素类中插入中文属性值读取回显为乱码但通过 SQL*Plus 直接插入中文却是正常的。原因ArcSDE 10.2 服务配置中的代码页设置与数据库字符集不一致。数据库是 ZHS16GBK但 SDE 服务的字符集设置被初始化成了 AL32UTF8导致两端转换出错。解决检查 $SDEHOME/etc/sde.config 文件中的字符集相关配置grep -i charset $SDEHOME/etc/sde.config如果设置与数据库不一致先停止 SDE 服务修改为ZHS16GBK再重启。另一种更省事的方式是客户端连接时直接使用直接连接模式绕开 SDE 服务的字符集转换层但要注意直接连接模式下 SQL 查询的性能调优策略和 SDE 服务连接并不完全相同后文会提到。4.5 现象执行 SDE 存储过程报 PLS-00302 组件必须已声明现象在 Oracle 中手动调用 sde 用户下的存储过程例如 sde.spatial_reference 相关函数时报PLS-00302: component must be declared。原因ArcSDE 的存储过程和函数在没有被正确授权给业务用户时业务 schema 无法直接调用。或者建库时 sdesetup 执行不完整部分包没有编译成功。解决先确认 sde 用户下的对象是否完整select object_name, object_type, status from dba_objects where ownerSDE and statusINVALID;如果存在 invalid 对象重新编译 sde 用户下的所有有效对象alter session set current_schema SDE; begin dbms_utility.compile_schema(SDE); end; /如果对象都有效检查业务用户是否有执行权限grant execute on sde.st_geometry to 业务用户;常见做法是把这个授权加到业务用户初始化的脚本里避免每次新建业务账号都漏配。5. 迁移与性能验证技巧同一版本下把 ArcSDE 环境原样搬走的快速做法ArcSDE 10.2 这个版本有一个隐性的迁移优势数据库结构完全一致的前提下ArcSDE 的元数据表和系统表是可以直接随数据库迁移的。也就是说不需要在新环境重新跑 sdesetup直接把 Oracle 数据库做一次迁移ArcSDE 环境就跟着过来了。具体做法是在旧库上用数据泵导出 sde 用户再导入新库expdp system/密码 dumpfilesde_exp.dmp schemassde然后在新库上执行impdp system/新密码 dumpfilesde_exp.dmp schemassde但这里有个关键的连带操作新库上必须先创建与旧库同名的表空间否则导入会报对象无法映射到表空间。常见做法是先在导入库上创建同名表空间再导入导入后检查 sde 用户下的表和存储过程是否正常。同时要重新执行一次sdeservice注册服务因为服务注册信息是写在安装目录的配置文件里属于服务器本地内容不会随数据库迁移。迁移完成后用 ArcGIS 目录工具建一条连接连接成功后做一个简单的空库写入测试可选的方式是通过 Python 脚本调用 arcpy 创建要素类import arcpy connection rC:\temp\sde_conn.sde arcpy.env.workspace connection arcpy.CreateFeatureclass_management(connection, test_fc, POINT)脚本逻辑说明这段代码会用 ArcGIS 桌面的 Python 环境建立对 SDE 的直接连接并在库中创建一张点要素类。返回成功说明 SDE 服务和数据库连接链路都通返回失败则要看 Oracle 监听和数据库权限。某开发人员在执行完某图像处理 Demo 的数据库迁移后就是用这个脚本验证的连通性整个过程不超过五分钟。性能验证方面ArcSDE 10.2 与 Oracle 11g 配合期间的 SQL 优化有一个常识性习惯尽量让几何过滤条件下推到数据库层而不是在客户端遍历。用到的典型 SQL 是select count(*) from business_table where sde.st_intersects(shape, sde.st_geomfromtext(POINT(116.3 39.9), 4326)) 1;参数说明sde.st_intersects 是空间过滤函数st_geomfromtext 把文本坐标转成几何对象4326 是坐标系 ID对应 WGS84。验证这条 SQL 是检查 ArcSDE 空间索引是否被有效使用的手段之一大幅慢于预期时优先排查是否在 shape 字段上缺少空间索引create index idx_sde_shape on business_table(shape) indextype is sde.st_spatial_index;这类操作在迁移后做一次即可。如果发现迁移后 SDE 直连查询速度不理想还有一招是在连接属性里关闭 ArcGIS 客户端的 SDE 版本化功能对非版本化表的影响这只在启用版本化的库里需要关注普通存量库不需要做额外配置。从那以后我每次接手 ArcSDE 与 Oracle 相关的迁移或排障都会强制走一遍「监听检查 — sde 用户完整性检查 — 空间索引重建」这套流程。ArcSDE 10.2 已经是很多年前的老引擎但存量系统还在用它这套安装包的价值就在于此。希望帮到你。本文还有配套的精品资源点击获取
返回列表