ARTICLE DETAIL

资讯详情

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

ArcGIS Server 数据存储注册:文件夹与数据库配置及排错

ArcGIS Server 数据存储注册:文件夹与数据库配置及排错 发布服务时报“数据源未注册”、几百MB的文件地理数据库上传卡了半小时、改完源数据发现服务里还是旧内容——这几个场景我在做 ArcGIS Server 运维的头两年几乎每周都要撞上一回。很多人第一反应是网络慢、服务器卡、软件有bug其实大部分时候根源都落在一个环节上ArcGIS Server 的数据存储Data Store没配好尤其是注册文件夹和注册数据库这两件事没做扎实。它不是什么高深的功能但它是服务发布链路里最容易埋雷的地方——配对了发布从十几分钟压缩到几十秒源数据一改服务立刻跟着变配错了你会得到一堆“服务能跑但数据是旧的”“换台机器就发布失败”的隐性故障。这篇文章我打算把自己这些年在这块踩过的坑、验证过的步骤、以及排查问题时真正管用的思路完整写一遍适合刚接手 Server 运维的同学也适合已经会发布服务但总在数据源上翻车的老手。1. ArcGIS Server 数据存储到底在管什么1.1 从一个反复出现的发布报错说起先说一个几乎人人都会遇到的画面。你在 ArcGIS Pro 里点“发布 Web 图层”进度条走到一半弹出一行字数据源未在服务器上注册然后给你两个选项一个是“复制所有数据”一个是“取消”。新手大多手一抖选了复制服务确实发出去了但接下来每次改数据都得重新发布一遍几十个服务维护下来人会崩溃。这个提示的本质是 Server 在问你一句话这份数据我到底是自己去取还是你打包塞给我选“复制所有数据”Server 会把数据源完整拷贝一份到服务器自己的目录里服务从此和你的原始数据脱钩选“注册”意思是你告诉 Server“这份数据放在某个我能访问到的位置你直接去那里读”。前者简单粗暴但不可持续后者才是生产环境的正确姿势。所以理解数据存储第一件事就是理解这道选择题背后的机制差异。1.2 注册与不注册复制与引用两条完全不同的路把这两种模式放到一张表里对照差异会非常直观对比维度不注册复制数据已注册引用数据数据存放位置服务器arcgisinput目录下原始共享目录或数据库发布耗时随数据量线性增长基本恒定与数据量无关源数据更新后需重新发布服务刷新即可服务自动读取新值服务器磁盘占用每份服务一份副本几乎不占额外空间适用场景临时演示、一次性交付生产环境、持续更新的业务数据权限依赖无依赖 Server 账户对数据源的访问权这张表里最容易被低估的是“权限依赖”那一行。注册之后Server 是用自己的运行账户Windows 上通常是arcgis这个本地账户Linux 上是一个专用的运行用户去读数据的。这个账户和你登录桌面用的账户完全是两码事所以经常出现“我明明能打开这个文件夹为什么 Server 说访问不了”——因为 Server 账户根本没被授权。1.3 文件夹、数据库、云存储数据存储的三种形态严格来说ArcGIS Server 支持注册的数据存储类型不止两种。除了最常见的文件夹Folder和数据库Database还有云存储比如对象存储桶以及大数据文件共享等。但对绝大多数做传统 GIS 项目的团队来说日常打交道的就是前两种。文件夹类型管的是文件形态的数据Shapefile、文件地理数据库.gdb、栅格影像TIFF、IMG、CAD 图纸、甚至 MXD 和 APRX 工程文件本身。数据库类型管的是企业级地理数据库和空间数据库底下的实际数据库产品可能是 SQL Server、Oracle、PostgreSQL也可能是达梦、人大金仓这类国产库——它们在 Server 眼里都统一抽象成“数据库数据存储”。之所以要做这层抽象是因为 ArcGIS Server 需要一个统一的入口来判断“这份数据我认不认识、够不够得着”。注册的过程本质就是把这个判断依据登记进站点配置里。2. 注册机制背后的原理与取舍2.1 不注册时服务器偷偷做了什么很多人以为不注册只是“把数据拷过去”这么简单实际上整个流程比想象中重。当你选择复制时Pro 会先把数据源打包成一个临时的压缩包通过 HTTP 或 HTTPS 传到 Server 的接收端点Server 收到后解压写进arcgisserver\directories\arcgisinput目录下对应服务名的文件夹里然后才去创建服务实例。这个链路里有两个隐藏成本。第一上传走的是 Web 通道受网络带宽和 Server 的请求体大小限制超大数据集会直接失败第二每次重新发布都会覆盖旧副本如果你在服务器上手工改过副本里的东西比如调过切片缓存参数下一次发布会把这些改动全抹掉。所以我一直强调只要这份数据未来还会更新就别用复制模式。2.2 注册之后路径是怎么被解析的注册之后Server 收到发布请求时会拿着数据源的路径去站点的数据存储列表里比对。比对成功它就记下“这个服务的数据源是\\fileserver\gis\parcels.gdb”服务运行时直接去这个路径读要素。比对失败才会退回复制模式。这里有个关键细节路径的写法必须完全一致。Windows 下同一个共享目录可以用\\fileserver\gis\parcels.gdb表示也可以用映射盘符Z:\parcels.gdb表示。如果你注册的是 UNC 路径而发布时 Pro 用的是映射盘符Server 就认不出来照样会走复制。这个坑我在一个跨网段的项目里卡了整整一下午最后才反应过来是路径形态不一致。提示注册文件夹时Manager 里会让你分别填写“文件夹路径”和“发布者文件夹路径”。前者是 Server 账户看到的路径后者是发布端你的 Pro 或 ArcMap看到的路径。这两者可以不同但必须各自准确这是最容易填错的字段。2.3 什么情况必须注册什么情况别硬注册注册不是万能药以下几种情况我建议老老实实用复制数据源放在你个人的笔记本电脑上Server 根本访问不到硬注册只会让服务启动失败。数据是临时拼接出来的中间结果用完就删没有持续更新需求。数据源所在的数据库你没有账号管理权限改不了连接配置。反过来下面这些场景几乎必须注册要素服务Feature Access要做在线编辑的、影像服务数据量以 TB 计的、有几十个服务共用同一套基础底图的、源数据每天由业务系统自动更新需要服务跟着变的。尤其是要素服务因为它需要往数据库里写回编辑结果如果不注册Server 拿到的是一份只读副本编辑功能直接失效。3. 注册文件夹从共享目录到服务引用3.1 前置条件自查清单动手之前先把下面这几条过一遍能省掉后面一大半的排查时间数据源已经放到共享位置。可以是文件服务器上的共享目录也可以是 Server 本机的某个目录单机部署时后者更省事但绝不能是某个人的桌面。Server 运行账户已确认。Windows 上在服务管理器里找到ArcGIS Server服务看它“登录”页签用的是哪个账户Linux 上查看安装时指定的运行用户。网络可达。在 Server 那台机器上用ping或直接访问 UNC 路径测试确认能通。共享权限和 NTFS 权限都已授予 Server 账户。这两个是独立的很多人只改了共享权限忘了 NTFS。数据本身没有被别的进程锁定。文件地理数据库被打开时会有.lock文件注册前最好确认没有残留锁。3.2 共享目录与权限的正确配法权限这块我踩的坑最多单独说清楚。假设文件服务器叫fileserver共享目录是D:\GISData共享名gisServer 账户是arcgis。第一步在文件服务器上右键目录属性里的“共享”页签设置共享名并给arcgis账户授予“读取”或“更改”权限。第二步切到“安全”页签同样把arcgis加进去授予读取权限。注意这里的arcgis是 Server 那台机器上的本地账户所以写法应该是Server主机名\arcgis而不是文件服务器本地的arcgis除非两者在同一个域里。Linux 环境下情况稍有不同。如果数据挂在 NFS 共享上Server 运行用户的 UID 和 GID 必须在 NFS 服务端有对应的权限映射否则会出现“目录能进但文件读不了”的怪现象。我一般会在挂载时加上vers3和固定的uid、gid参数避免不同节点之间权限不一致。注意给 Server 账户的权限按最小必要原则给。只读服务就只给读权限需要编辑的要素服务才给写权限。权限给多了后面审计和迁移都会变成麻烦。3.3 两种注册入口的实操步骤入口一ArcGIS Server Manager。登录 Manager 后进入“站点”页签左侧找到“数据存储”点“注册文件夹”。弹窗里填两项文件夹路径填 Server 看到的路径比如\\fileserver\gis发布者文件夹路径填你 Pro 端看到的路径如果两端看到的一样就填同一个值。填完点击验证通过后再保存。入口二ArcGIS Pro 发布时顺带注册。在发布向导走到“数据源注册”这一步时选择“注册”而不是“复制”弹出的对话框里填服务器文件夹路径和发布者文件夹路径逻辑和上面完全一样。优点是发布流程一条龙缺点是每次只注册一个批量场景下效率低。两种入口选哪个我个人的习惯是第一次搭建环境时用 Manager 集中把常用目录全注册一遍后续零星新增的目录在发布时随手注册。这样站点的数据存储列表会保持成一个可以随时查阅的“数据源台账”。3.4 验证注册是否真的生效注册完不能只看状态显示“已注册”就完事得做一次真实检验。方法很简单拿一份测试数据重新发布一个服务观察两点。一是发布速度如果几乎瞬间完成说明走的是引用二是去arcgisserver\directories\arcgisinput目录下看看如果没有生成对应的服务文件夹说明数据确实没被复制。还有一种更直接的验证方式在 Manager 的数据存储列表里点开刚注册的条目查看详细信息里面会列出 Server 实际解析到的路径和验证结果。如果这里显示“无法访问”说明权限或者路径还有问题必须回去改别硬着头皮发服务。4. 注册数据库连接文件是关键4.1 支持的数据库类型与驱动准备数据库注册比文件夹注册要绕一些第一个门槛就是驱动。Server 那台机器上必须装有对应数据库的客户端驱动否则它连连接都建立不起来。常见的对应关系是连 SQL Server 依赖系统的 ODBC/OLE DB 组件连 Oracle 需要装 Oracle 客户端并配好TNS_ADMIN连 PostgreSQL 需要装相应版本的客户端库。国产数据库这块近年项目里遇到得越来越多。达梦、人大金仓这些产品在 ArcGIS 体系里通过配套的连接支持来接入配置前一定要确认 Server 版本和数据库版本之间的兼容矩阵版本不匹配时会报一些很含糊的连接错误排查起来非常头疼。我的经验是动手前先拿数据库自带的命令行工具在 Server 机器上跑一条最简单的查询能通再往下做注册。4.2 服务器连接与发布者连接的区别这是数据库注册里最核心、也最容易混淆的概念。注册一个数据库数据存储实际上要提供两份连接信息发布者连接发布端你的 Pro用来连数据库的连接文件通常是一个.sde文件。它决定了你从桌面端能不能看到数据。服务器连接Server 自己在运行时使用的连接配置。它决定了服务能不能读到数据。这两者指向的必须是同一个数据库、同一套数据但登录方式可以不同。举个实际例子发布端用你的个人数据库账号连Server 端用一个专用的只读服务账号连这样即使某天你离职了服务也不会因为账号被禁用而挂掉。这是我在做交付项目时的标准做法。提示如果两份连接填得不一致会出现“注册显示成功但服务读不到数据”的诡异状态。注册完成后务必用 Server 端的连接信息单独测试一次连通性别只信界面上那个绿色的勾。4.3 企业级地理数据库的注册流程完整的流程大致是这样。先在 Pro 的 Catalog 里创建一个数据库连接填主机名、实例名或服务名、认证方式操作系统认证或数据库认证、数据库名测试连接通过后保存为.sde文件。然后把这份连接文件放到 Server 能访问的位置或者直接把这个连接的信息填进注册对话框里。接着进 Manager 的“数据存储”页签点“注册数据库”。系统会要求你提供发布者连接文件和服务器连接信息。填完后同样有验证按钮验证通过保存即可。注册成功的标志是之后发布指向这个数据库的要素服务时不再提示数据未注册而且服务启动速度明显变快。这里有一个容易被忽略的细节注册数据库时Server 会尝试读取数据库中的地理数据库系统表。如果用的是普通空间数据库而没有启用企业级地理数据库某些功能比如版本化编辑、归档是不可用的。所以如果你的项目需要这些能力必须在数据库侧先完成地理数据库的创建和升级。4.4 只读注册与读写注册的选择很多人在注册数据库时纠结权限该给到什么程度。判断标准其实很简单看这个库上的服务要不要写数据纯展示的地图服务Map Service、影像服务只读权限足够。支持在线编辑的要素服务Feature Service需要写权限。需要版本化编辑的场景权限要求更高还需要对版本管理相关的系统表有访问权。我一般会准备两个数据库账号一个只读一个读写不同的服务用不同的连接文件去注册这样即使某个服务的账号出问题也不会波及整个站点。账号密码的存放位置也要注意连接文件本身会保存密码所以存放目录的权限要收紧不能随便放共享目录里。5. 高频故障排查实录与速查表5.1 报错速查表下面这张表是我这几年攒下来的基本覆盖了 90% 的注册类报错报错或现象大概率原因处理方向发布时反复提示数据未注册路径写法不一致统一用 UNC 路径注册和发布注册时验证失败提示无法访问Server 账户无权限检查共享权限与 NTFS 权限注册成功但服务起不来服务器连接配置错误用 Server 端连接单独测试数据库注册报驱动相关错误客户端驱动缺失或版本不符补装驱动核对兼容矩阵集群环境下部分节点读不到数据共享存储未在所有节点挂载逐节点验证挂载路径注册列表里存在但发布仍复制数据源路径与注册项不匹配逐字符核对路径大小写与斜杠5.2 权限类问题的排查思路权限问题最气人的地方在于它不报明确的错只说“无法访问”。我的排查顺序是这样的先在被注册的那台 Server 机器上用 Server 的运行账户打开一个命令行窗口Windows 上可以用runas来临时切换身份尝试访问目标路径。能列目录、能读文件说明权限没问题如果这时候报拒绝访问那问题一定在权限配置上和 ArcGIS 本身无关。还有一个隐藏的坑是账户类型。如果 Server 服务用的是本地系统账户LocalSystem那它访问网络共享时会以计算机账户的身份出现写法是域名\计算机名$。这时候你得给这个计算机账户授权而不是给人或服务账户授权。搞不清楚这一点会陷入“我明明给 arcgis 授权了为什么还不行”的死循环。5.3 我自己踩过的几个坑坑一共享目录用映射盘符注册。当时图省事把共享目录映射成Z盘注册时填了Z:\data。结果是 Server 服务重启后映射消失服务全部读不到数据。后来改成 UNC 路径再没出过问题。映射盘符只在当前登录会话有效服务账户的会话里根本没有这个盘。坑二在 Pro 里改了数据源路径但没重新注册。项目中期把数据从 A 目录整体挪到了 B 目录服务是引用模式自然全挂了。正确做法是先注册 B 目录再把服务的dataSource指向 B最后清理 A 的注册项顺序不能乱。坑三数据库连接文件里存的是个人账号。这个是接手别人项目时发现的服务账号密码三天两头变服务就跟着三天两头挂。教训就是任何被服务引用的连接都必须用专用的服务账号这个原则我在后面所有项目里都没再破过。6. 批量注册与多机集群下的一致性维护6.1 用 arcpy 批量注册当站点里有几十个共享目录要注册时一个个点 Manager 是不可接受的。这时候可以用 arcpy 批量处理。核心函数逻辑大致如下思路是先建立管理连接文件再遍历待注册目录列表逐个提交import arcpy # 管理连接文件需要管理员权限创建 admin_conn rC:\connections\admin.ags # 待注册的文件夹列表注意用 UNC 路径 folders [ r\\fileserver\gis\basemap, r\\fileserver\gis\parcels, r\\fileserver\gis\imagery, ] for path in folders: try: arcpy.server.AddDataStoreItem( connection_fileadmin_conn, data_store_typeFolder, item_pathpath, connection_string ) print(注册成功: path) except Exception as e: print(注册失败: path - str(e))注册数据库时data_store_type换成Databaseitem_path填服务器端的连接文件路径connection_string填发布者连接文件的路径。批量跑之前建议先在测试站点验一遍确认参数形态没问题再上生产。6.2 REST Admin API 的自动化玩法除了 arcpy还可以直接打 Server 的管理 REST 接口。这种方式的好处是不依赖桌面端环境可以直接放进运维脚本或 CI 流程里curl -X POST https://server.example.com:6443/arcgis/admin/data/registerItem \ -d itemPath\\\\fileserver\\gis\\parcels \ -d typefolder \ -d connectionString \ -d fjson \ -d token${TOKEN}用这种方式有几个注意点。一是路径里的反斜杠要转义写错一个符号就失败二是必须先拿到有效 token三是这个接口不会帮你做验证提交前最好先用machines接口确认节点状态正常。我用它做过一次跨环境的数据存储批量迁移几百个条目几分钟跑完比手工点快太多了。6.3 集群与迁移场景下的注意事项多节点集群下最核心的原则只有一句话所有节点必须用完全相同的路径访问到完全相同的数据。Windows 集群一般是共享目录加 UNC 统一路径Linux 集群通常用 NFS 挂载到每个节点的同一个挂载点。任何一个节点路径不同那个节点上的服务实例就会随机失败而且失败是间歇性的极难排查。做站点迁移时数据存储列表不会跟着服务一起搬需要在目标站点重新注册一遍。我一般的做法是先把源站点的数据存储列表导出来逐条在目标站点注册并验证全部通过后再迁移服务定义。顺序反过来做的话服务迁过去会因为找不到数据源而全部处于停止状态光是手工启动就能耗掉一整天。另外提醒一句注册信息本身存在站点配置里做站点备份时它是一起被备走的但数据本身不在备份范围内。所以真正的容灾方案里数据存储的高可用和 Server 站点的高可用必须分开设计别指望一个备份能同时兜住两边。最后分享一个我自己一直在用的小习惯给站点的每一个数据存储条目都加上清晰的命名和备注写明它对应哪个业务、由谁维护、权限给到哪个账户。这看起来是额外工作但当站点里积累了几百个条目、又遇上人员交接时这份“台账”能救回大量时间。数据存储注册这件事技术难度其实不高真正拉开差距的是规则是否统一、记录是否完整——这两点做到了后面几乎不会出问题。
返回列表